Passed
Pull Request — master (#779)
by Kiran
05:01
created
includes/libraries/class-emogrifier.php 2 patches
Indentation   +779 added lines, -779 removed lines patch added patch discarded remove patch
@@ -9,346 +9,346 @@  discard block
 block discarded – undo
9 9
  * @author Roman Ožana <[email protected]>
10 10
  */
11 11
 class Emogrifier {
12
-	/**
13
-	 * @var string
14
-	 */
15
-	const ENCODING = 'UTF-8';
16
-
17
-	/**
18
-	 * @var integer
19
-	 */
20
-	const CACHE_KEY_CSS = 0;
21
-
22
-	/**
23
-	 * @var integer
24
-	 */
25
-	const CACHE_KEY_SELECTOR = 1;
26
-
27
-	/**
28
-	 * @var integer
29
-	 */
30
-	const CACHE_KEY_XPATH = 2;
31
-
32
-	/**
33
-	 * @var integer
34
-	 */
35
-	const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
-
37
-	/**
38
-	 * for calculating nth-of-type and nth-child selectors.
39
-	 *
40
-	 * @var integer
41
-	 */
42
-	const INDEX = 0;
43
-
44
-	/**
45
-	 * for calculating nth-of-type and nth-child selectors.
46
-	 *
47
-	 * @var integer
48
-	 */
49
-	const MULTIPLIER = 1;
50
-
51
-	/**
52
-	 * @var string
53
-	 */
54
-	const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
-
61
-	/**
62
-	 * @var string
63
-	 */
64
-	private $html = '';
65
-
66
-	/**
67
-	 * @var string
68
-	 */
69
-	private $css = '';
70
-
71
-	/**
72
-	 * @var array<string>
73
-	 */
74
-	private $unprocessableHtmlTags = array('wbr');
75
-
76
-	/**
77
-	 * @var array<array>
78
-	 */
79
-	private $caches = array(
80
-		self::CACHE_KEY_CSS => array(),
81
-		self::CACHE_KEY_SELECTOR => array(),
82
-		self::CACHE_KEY_XPATH => array(),
83
-		self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
-	);
85
-
86
-	/**
87
-	 * the visited nodes with the XPath paths as array keys.
88
-	 *
89
-	 * @var array<\DOMNode>
90
-	 */
91
-	private $visitedNodes = array();
92
-
93
-	/**
94
-	 * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
-	 * as key/value pairs for the inner array.
96
-	 *
97
-	 * @var array<array><string>
98
-	 */
99
-	private $styleAttributesForNodes = array();
100
-
101
-	/**
102
-	 * This attribute applies to the case where you want to preserve your original text encoding.
103
-	 *
104
-	 * By default, emogrifier translates your text into HTML entities for two reasons:
105
-	 *
106
-	 * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
-	 *
108
-	 * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
-	 *
110
-	 * If you would like to preserve your original encoding, set this attribute to TRUE.
111
-	 *
112
-	 * @var boolean
113
-	 */
114
-	public $preserveEncoding = false;
115
-
116
-	public static $_media = '';
117
-
118
-	/**
119
-	 * The constructor.
120
-	 *
121
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
123
-	 */
124
-	public function __construct($html = '', $css = '') {
125
-		$this->setHtml($html);
126
-		$this->setCss($css);
127
-	}
128
-
129
-	/**
130
-	 * The destructor.
131
-	 */
132
-	public function __destruct() {
133
-		$this->purgeVisitedNodes();
134
-	}
135
-
136
-	/**
137
-	 * Sets the HTML to emogrify.
138
-	 *
139
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
-	 */
141
-	public function setHtml($html = '') {
142
-		$this->html = $html;
143
-	}
144
-
145
-	/**
146
-	 * Sets the CSS to merge with the HTML.
147
-	 *
148
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
149
-	 */
150
-	public function setCss($css = '') {
151
-		$this->css = $css;
152
-	}
153
-
154
-	/**
155
-	 * Clears all caches.
156
-	 */
157
-	private function clearAllCaches() {
158
-		$this->clearCache(self::CACHE_KEY_CSS);
159
-		$this->clearCache(self::CACHE_KEY_SELECTOR);
160
-		$this->clearCache(self::CACHE_KEY_XPATH);
161
-		$this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
-	}
163
-
164
-	/**
165
-	 * Clears a single cache by key.
166
-	 *
167
-	 * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
-	 *
169
-	 * @throws InvalidArgumentException
170
-	 */
171
-	private function clearCache($key) {
172
-		$allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
-		if (!in_array($key, $allowedCacheKeys, true)) {
174
-			throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
-		}
176
-
177
-		$this->caches[$key] = array();
178
-	}
179
-
180
-	/**
181
-	 * Purges the visited nodes.
182
-	 */
183
-	private function purgeVisitedNodes() {
184
-		$this->visitedNodes = array();
185
-		$this->styleAttributesForNodes = array();
186
-	}
187
-
188
-	/**
189
-	 * Marks a tag for removal.
190
-	 *
191
-	 * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
-	 * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
-	 *
194
-	 * Note: The tags will not be removed if they have any content.
195
-	 *
196
-	 * @param string $tagName the tag name, e.g., "p"
197
-	 */
198
-	public function addUnprocessableHtmlTag($tagName) {
199
-		$this->unprocessableHtmlTags[] = $tagName;
200
-	}
201
-
202
-	/**
203
-	 * Drops a tag from the removal list.
204
-	 *
205
-	 * @param string $tagName the tag name, e.g., "p"
206
-	 */
207
-	public function removeUnprocessableHtmlTag($tagName) {
208
-		$key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
-		if ($key !== false) {
210
-			unset($this->unprocessableHtmlTags[$key]);
211
-		}
212
-	}
213
-
214
-	/**
215
-	 * Applies the CSS you submit to the HTML you submit.
216
-	 *
217
-	 * This method places the CSS inline.
218
-	 *
219
-	 * @return string
220
-	 *
221
-	 * @throws BadMethodCallException
222
-	 */
223
-	public function emogrify() {
224
-		if ($this->html === '') {
225
-			throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
-		}
227
-
228
-		$xmlDocument = $this->createXmlDocument();
229
-		$xpath = new DOMXPath($xmlDocument);
230
-		$this->clearAllCaches();
231
-
232
-		// before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
-		// we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
-		// also store a reference of nodes with existing inline styles so we don't overwrite them
235
-		$this->purgeVisitedNodes();
236
-
237
-		$nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
-		if ($nodesWithStyleAttributes !== false) {
239
-			/** @var $nodeWithStyleAttribute DOMNode */
240
-			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
-
243
-				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
-				$nodePath = $node->getNodePath();
245
-				if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
-					$this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
-					$this->visitedNodes[$nodePath] = $node;
248
-				}
249
-
250
-				$node->setAttribute('style', $normalizedOriginalStyle);
251
-			}
252
-		}
253
-
254
-		// grab any existing style blocks from the html and append them to the existing CSS
255
-		// (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
-		$allCss = $this->css;
257
-
258
-		$allCss .= $this->getCssFromAllStyleNodes($xpath);
259
-
260
-		$cssParts = $this->splitCssAndMediaQuery($allCss);
261
-		self::$_media = ''; // reset
262
-
263
-		$cssKey = md5($cssParts['css']);
264
-		if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
-			// process the CSS file for selectors and definitions
266
-			preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
-
268
-			$allSelectors = array();
269
-			foreach ($matches as $key => $selectorString) {
270
-				// if there is a blank definition, skip
271
-				if (!strlen(trim($selectorString[2]))) {
272
-					continue;
273
-				}
274
-
275
-				// else split by commas and duplicate attributes so we can sort by selector precedence
276
-				$selectors = explode(',', $selectorString[1]);
277
-				foreach ($selectors as $selector) {
278
-					// don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
-					if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
-						continue;
281
-					}
282
-
283
-					$allSelectors[] = array('selector' => trim($selector),
284
-											 'attributes' => trim($selectorString[2]),
285
-											 // keep track of where it appears in the file, since order is important
286
-											 'line' => $key,
287
-					);
288
-				}
289
-			}
290
-
291
-			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
-
294
-			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
-		}
296
-
297
-		foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
-			// query the body for the xpath selector
299
-			$nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
-
301
-			/** @var $node \DOMNode */
302
-			foreach ($nodesMatchingCssSelectors as $node) {
303
-				// if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
-				if ($node->hasAttribute('style')) {
305
-					// break it up into an associative array
306
-					$oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
-				} else {
308
-					$oldStyleDeclarations = array();
309
-				}
310
-				$newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
-				$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
-			}
313
-		}
314
-
315
-		// now iterate through the nodes that contained inline styles in the original HTML
316
-		foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
-			$node = $this->visitedNodes[$nodePath];
318
-			$currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
-			$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
-		}
321
-
322
-		// This removes styles from your email that contain display:none.
323
-		// We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
-		// lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
-		// to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
-		$nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
-		// The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
-		// we don't try to call removeChild on a nonexistent child node
329
-		if ($nodesWithStyleDisplayNone->length > 0) {
330
-			/** @var $node \DOMNode */
331
-			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
-					$node->parentNode->removeChild($node);
334
-				}
335
-			}
336
-		}
337
-
338
-		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
-
340
-		if ($this->preserveEncoding) {
341
-			// Deprecated since PHP 8.2
342
-			if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
343
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
344
-			} else {
345
-				return mb_encode_numericentity( $xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
346
-				//return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
347
-			}
348
-		} else {
349
-			return $xmlDocument->saveHTML();
350
-		}
351
-	}
12
+    /**
13
+     * @var string
14
+     */
15
+    const ENCODING = 'UTF-8';
16
+
17
+    /**
18
+     * @var integer
19
+     */
20
+    const CACHE_KEY_CSS = 0;
21
+
22
+    /**
23
+     * @var integer
24
+     */
25
+    const CACHE_KEY_SELECTOR = 1;
26
+
27
+    /**
28
+     * @var integer
29
+     */
30
+    const CACHE_KEY_XPATH = 2;
31
+
32
+    /**
33
+     * @var integer
34
+     */
35
+    const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
+
37
+    /**
38
+     * for calculating nth-of-type and nth-child selectors.
39
+     *
40
+     * @var integer
41
+     */
42
+    const INDEX = 0;
43
+
44
+    /**
45
+     * for calculating nth-of-type and nth-child selectors.
46
+     *
47
+     * @var integer
48
+     */
49
+    const MULTIPLIER = 1;
50
+
51
+    /**
52
+     * @var string
53
+     */
54
+    const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
+
61
+    /**
62
+     * @var string
63
+     */
64
+    private $html = '';
65
+
66
+    /**
67
+     * @var string
68
+     */
69
+    private $css = '';
70
+
71
+    /**
72
+     * @var array<string>
73
+     */
74
+    private $unprocessableHtmlTags = array('wbr');
75
+
76
+    /**
77
+     * @var array<array>
78
+     */
79
+    private $caches = array(
80
+        self::CACHE_KEY_CSS => array(),
81
+        self::CACHE_KEY_SELECTOR => array(),
82
+        self::CACHE_KEY_XPATH => array(),
83
+        self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
+    );
85
+
86
+    /**
87
+     * the visited nodes with the XPath paths as array keys.
88
+     *
89
+     * @var array<\DOMNode>
90
+     */
91
+    private $visitedNodes = array();
92
+
93
+    /**
94
+     * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
+     * as key/value pairs for the inner array.
96
+     *
97
+     * @var array<array><string>
98
+     */
99
+    private $styleAttributesForNodes = array();
100
+
101
+    /**
102
+     * This attribute applies to the case where you want to preserve your original text encoding.
103
+     *
104
+     * By default, emogrifier translates your text into HTML entities for two reasons:
105
+     *
106
+     * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
+     *
108
+     * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
+     *
110
+     * If you would like to preserve your original encoding, set this attribute to TRUE.
111
+     *
112
+     * @var boolean
113
+     */
114
+    public $preserveEncoding = false;
115
+
116
+    public static $_media = '';
117
+
118
+    /**
119
+     * The constructor.
120
+     *
121
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
+     * @param string $css the CSS to merge, must be UTF-8-encoded
123
+     */
124
+    public function __construct($html = '', $css = '') {
125
+        $this->setHtml($html);
126
+        $this->setCss($css);
127
+    }
128
+
129
+    /**
130
+     * The destructor.
131
+     */
132
+    public function __destruct() {
133
+        $this->purgeVisitedNodes();
134
+    }
135
+
136
+    /**
137
+     * Sets the HTML to emogrify.
138
+     *
139
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
+     */
141
+    public function setHtml($html = '') {
142
+        $this->html = $html;
143
+    }
144
+
145
+    /**
146
+     * Sets the CSS to merge with the HTML.
147
+     *
148
+     * @param string $css the CSS to merge, must be UTF-8-encoded
149
+     */
150
+    public function setCss($css = '') {
151
+        $this->css = $css;
152
+    }
153
+
154
+    /**
155
+     * Clears all caches.
156
+     */
157
+    private function clearAllCaches() {
158
+        $this->clearCache(self::CACHE_KEY_CSS);
159
+        $this->clearCache(self::CACHE_KEY_SELECTOR);
160
+        $this->clearCache(self::CACHE_KEY_XPATH);
161
+        $this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
+    }
163
+
164
+    /**
165
+     * Clears a single cache by key.
166
+     *
167
+     * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
+     *
169
+     * @throws InvalidArgumentException
170
+     */
171
+    private function clearCache($key) {
172
+        $allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
+        if (!in_array($key, $allowedCacheKeys, true)) {
174
+            throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
+        }
176
+
177
+        $this->caches[$key] = array();
178
+    }
179
+
180
+    /**
181
+     * Purges the visited nodes.
182
+     */
183
+    private function purgeVisitedNodes() {
184
+        $this->visitedNodes = array();
185
+        $this->styleAttributesForNodes = array();
186
+    }
187
+
188
+    /**
189
+     * Marks a tag for removal.
190
+     *
191
+     * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
+     * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
+     *
194
+     * Note: The tags will not be removed if they have any content.
195
+     *
196
+     * @param string $tagName the tag name, e.g., "p"
197
+     */
198
+    public function addUnprocessableHtmlTag($tagName) {
199
+        $this->unprocessableHtmlTags[] = $tagName;
200
+    }
201
+
202
+    /**
203
+     * Drops a tag from the removal list.
204
+     *
205
+     * @param string $tagName the tag name, e.g., "p"
206
+     */
207
+    public function removeUnprocessableHtmlTag($tagName) {
208
+        $key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
+        if ($key !== false) {
210
+            unset($this->unprocessableHtmlTags[$key]);
211
+        }
212
+    }
213
+
214
+    /**
215
+     * Applies the CSS you submit to the HTML you submit.
216
+     *
217
+     * This method places the CSS inline.
218
+     *
219
+     * @return string
220
+     *
221
+     * @throws BadMethodCallException
222
+     */
223
+    public function emogrify() {
224
+        if ($this->html === '') {
225
+            throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
+        }
227
+
228
+        $xmlDocument = $this->createXmlDocument();
229
+        $xpath = new DOMXPath($xmlDocument);
230
+        $this->clearAllCaches();
231
+
232
+        // before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
+        // we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
+        // also store a reference of nodes with existing inline styles so we don't overwrite them
235
+        $this->purgeVisitedNodes();
236
+
237
+        $nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
+        if ($nodesWithStyleAttributes !== false) {
239
+            /** @var $nodeWithStyleAttribute DOMNode */
240
+            foreach ($nodesWithStyleAttributes as $node) {
241
+                $normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
+
243
+                // in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
+                $nodePath = $node->getNodePath();
245
+                if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
+                    $this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
+                    $this->visitedNodes[$nodePath] = $node;
248
+                }
249
+
250
+                $node->setAttribute('style', $normalizedOriginalStyle);
251
+            }
252
+        }
253
+
254
+        // grab any existing style blocks from the html and append them to the existing CSS
255
+        // (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
+        $allCss = $this->css;
257
+
258
+        $allCss .= $this->getCssFromAllStyleNodes($xpath);
259
+
260
+        $cssParts = $this->splitCssAndMediaQuery($allCss);
261
+        self::$_media = ''; // reset
262
+
263
+        $cssKey = md5($cssParts['css']);
264
+        if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
+            // process the CSS file for selectors and definitions
266
+            preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
+
268
+            $allSelectors = array();
269
+            foreach ($matches as $key => $selectorString) {
270
+                // if there is a blank definition, skip
271
+                if (!strlen(trim($selectorString[2]))) {
272
+                    continue;
273
+                }
274
+
275
+                // else split by commas and duplicate attributes so we can sort by selector precedence
276
+                $selectors = explode(',', $selectorString[1]);
277
+                foreach ($selectors as $selector) {
278
+                    // don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
+                    if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
+                        continue;
281
+                    }
282
+
283
+                    $allSelectors[] = array('selector' => trim($selector),
284
+                                                'attributes' => trim($selectorString[2]),
285
+                                                // keep track of where it appears in the file, since order is important
286
+                                                'line' => $key,
287
+                    );
288
+                }
289
+            }
290
+
291
+            // now sort the selectors by precedence
292
+            usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
+
294
+            $this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
+        }
296
+
297
+        foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
+            // query the body for the xpath selector
299
+            $nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
+
301
+            /** @var $node \DOMNode */
302
+            foreach ($nodesMatchingCssSelectors as $node) {
303
+                // if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
+                if ($node->hasAttribute('style')) {
305
+                    // break it up into an associative array
306
+                    $oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
+                } else {
308
+                    $oldStyleDeclarations = array();
309
+                }
310
+                $newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
+                $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
+            }
313
+        }
314
+
315
+        // now iterate through the nodes that contained inline styles in the original HTML
316
+        foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
+            $node = $this->visitedNodes[$nodePath];
318
+            $currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
+            $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
+        }
321
+
322
+        // This removes styles from your email that contain display:none.
323
+        // We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
+        // lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
+        // to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
+        $nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
+        // The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
+        // we don't try to call removeChild on a nonexistent child node
329
+        if ($nodesWithStyleDisplayNone->length > 0) {
330
+            /** @var $node \DOMNode */
331
+            foreach ($nodesWithStyleDisplayNone as $node) {
332
+                if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
+                    $node->parentNode->removeChild($node);
334
+                }
335
+            }
336
+        }
337
+
338
+        $this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
+
340
+        if ($this->preserveEncoding) {
341
+            // Deprecated since PHP 8.2
342
+            if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
343
+                return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
344
+            } else {
345
+                return mb_encode_numericentity( $xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
346
+                //return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
347
+            }
348
+        } else {
349
+            return $xmlDocument->saveHTML();
350
+        }
351
+    }
352 352
 
353 353
     /**
354 354
      * String to lower.
@@ -358,143 +358,143 @@  discard block
 block discarded – undo
358 358
      * @param array $m
359 359
      * @return string
360 360
      */
361
-	public function strtolower(array $m) {
362
-		return strtolower($m[0]);
363
-	}
364
-
365
-
366
-	/**
367
-	 * This method merges old or existing name/value array with new name/value array.
368
-	 * and then generates a string of the combined style suitable for placing inline.
369
-	 * This becomes the single point for CSS string generation allowing for consistent.
370
-	 * CSS output no matter where the CSS originally came from.
371
-	 * @param array $oldStyles
372
-	 * @param array $newStyles
373
-	 * @return string
374
-	 */
375
-	private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
376
-		$combinedStyles = array_merge($oldStyles, $newStyles);
377
-		$style = '';
378
-		foreach ($combinedStyles as $attributeName => $attributeValue) {
379
-			$style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
380
-		}
381
-		return trim($style);
382
-	}
383
-
384
-
385
-	/**
386
-	 * Copies the media part from CSS array parts to $xmlDocument.
387
-	 *
388
-	 * @param array $cssParts
389
-	 * @param DOMDocument $xmlDocument
390
-	 */
391
-	public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
392
-		if (isset($cssParts['media']) && $cssParts['media'] !== '') {
393
-			$this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
394
-		}
395
-	}
396
-
397
-	/**
398
-	 * Returns CSS content.
399
-	 *
400
-	 * @param DOMXPath $xpath
401
-	 * @return string
402
-	 */
403
-	private function getCssFromAllStyleNodes(DOMXPath $xpath) {
404
-		$styleNodes = $xpath->query('//style');
405
-
406
-		if ($styleNodes === false) {
407
-			return '';
408
-		}
409
-
410
-		$css = '';
411
-		/** @var $styleNode DOMNode */
412
-		foreach ($styleNodes as $styleNode) {
413
-			$css .= "\n\n" . $styleNode->nodeValue;
414
-			$styleNode->parentNode->removeChild($styleNode);
415
-		}
416
-
417
-		return $css;
418
-	}
419
-
420
-	/**
421
-	 * Adds a style element with $css to $document.
422
-	 *
423
-	 * @param DOMDocument $document
424
-	 * @param string $css
425
-	 */
426
-	private function addStyleElementToDocument(DOMDocument $document, $css) {
427
-		$styleElement = $document->createElement('style', $css);
428
-		$styleAttribute = $document->createAttribute('type');
429
-		$styleAttribute->value = 'text/css';
430
-		$styleElement->appendChild($styleAttribute);
431
-
432
-		$head = $this->getOrCreateHeadElement($document);
433
-		$head->appendChild($styleElement);
434
-	}
435
-
436
-	/**
437
-	 * Returns the existing or creates a new head element in $document.
438
-	 *
439
-	 * @param DOMDocument $document
440
-	 * @return DOMNode the head element
441
-	 */
442
-	private function getOrCreateHeadElement(DOMDocument $document) {
443
-		$head = $document->getElementsByTagName('head')->item(0);
444
-
445
-		if ($head === null) {
446
-			$head = $document->createElement('head');
447
-			$html = $document->getElementsByTagName('html')->item(0);
448
-			$html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
449
-		}
450
-
451
-		return $head;
452
-	}
453
-
454
-	/**
455
-	 * Splits input CSS code to an array where:
456
-	 *
457
-	 * - key "css" will be contains clean CSS code.
458
-	 * - key "media" will be contains all valuable media queries.
459
-	 *
460
-	 * Example:
461
-	 *
462
-	 * The CSS code.
463
-	 *
464
-	 *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
465
-	 *
466
-	 * will be parsed into the following array:
467
-	 *
468
-	 *   "css" => "h1 { color:red; }"
469
-	 *   "media" => "@media { h1 {}}"
470
-	 *
471
-	 * @param string $css
472
-	 * @return array
473
-	 */
474
-	private function splitCssAndMediaQuery($css) {
475
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
476
-
477
-		// filter the CSS
478
-		$search = array(
479
-			// get rid of css comment code
480
-			'/\\/\\*.*\\*\\//sU',
481
-			// strip out any import directives
482
-			'/^\\s*@import\\s[^;]+;/misU',
483
-			// strip remains media enclosures
484
-			'/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
485
-		);
486
-
487
-		$replace = array(
488
-			'',
489
-			'',
490
-			'',
491
-		);
492
-
493
-		// clean CSS before output
494
-		$css = preg_replace($search, $replace, $css);
495
-
496
-		return array('css' => $css, 'media' => self::$_media);
497
-	}
361
+    public function strtolower(array $m) {
362
+        return strtolower($m[0]);
363
+    }
364
+
365
+
366
+    /**
367
+     * This method merges old or existing name/value array with new name/value array.
368
+     * and then generates a string of the combined style suitable for placing inline.
369
+     * This becomes the single point for CSS string generation allowing for consistent.
370
+     * CSS output no matter where the CSS originally came from.
371
+     * @param array $oldStyles
372
+     * @param array $newStyles
373
+     * @return string
374
+     */
375
+    private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
376
+        $combinedStyles = array_merge($oldStyles, $newStyles);
377
+        $style = '';
378
+        foreach ($combinedStyles as $attributeName => $attributeValue) {
379
+            $style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
380
+        }
381
+        return trim($style);
382
+    }
383
+
384
+
385
+    /**
386
+     * Copies the media part from CSS array parts to $xmlDocument.
387
+     *
388
+     * @param array $cssParts
389
+     * @param DOMDocument $xmlDocument
390
+     */
391
+    public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
392
+        if (isset($cssParts['media']) && $cssParts['media'] !== '') {
393
+            $this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
394
+        }
395
+    }
396
+
397
+    /**
398
+     * Returns CSS content.
399
+     *
400
+     * @param DOMXPath $xpath
401
+     * @return string
402
+     */
403
+    private function getCssFromAllStyleNodes(DOMXPath $xpath) {
404
+        $styleNodes = $xpath->query('//style');
405
+
406
+        if ($styleNodes === false) {
407
+            return '';
408
+        }
409
+
410
+        $css = '';
411
+        /** @var $styleNode DOMNode */
412
+        foreach ($styleNodes as $styleNode) {
413
+            $css .= "\n\n" . $styleNode->nodeValue;
414
+            $styleNode->parentNode->removeChild($styleNode);
415
+        }
416
+
417
+        return $css;
418
+    }
419
+
420
+    /**
421
+     * Adds a style element with $css to $document.
422
+     *
423
+     * @param DOMDocument $document
424
+     * @param string $css
425
+     */
426
+    private function addStyleElementToDocument(DOMDocument $document, $css) {
427
+        $styleElement = $document->createElement('style', $css);
428
+        $styleAttribute = $document->createAttribute('type');
429
+        $styleAttribute->value = 'text/css';
430
+        $styleElement->appendChild($styleAttribute);
431
+
432
+        $head = $this->getOrCreateHeadElement($document);
433
+        $head->appendChild($styleElement);
434
+    }
435
+
436
+    /**
437
+     * Returns the existing or creates a new head element in $document.
438
+     *
439
+     * @param DOMDocument $document
440
+     * @return DOMNode the head element
441
+     */
442
+    private function getOrCreateHeadElement(DOMDocument $document) {
443
+        $head = $document->getElementsByTagName('head')->item(0);
444
+
445
+        if ($head === null) {
446
+            $head = $document->createElement('head');
447
+            $html = $document->getElementsByTagName('html')->item(0);
448
+            $html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
449
+        }
450
+
451
+        return $head;
452
+    }
453
+
454
+    /**
455
+     * Splits input CSS code to an array where:
456
+     *
457
+     * - key "css" will be contains clean CSS code.
458
+     * - key "media" will be contains all valuable media queries.
459
+     *
460
+     * Example:
461
+     *
462
+     * The CSS code.
463
+     *
464
+     *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
465
+     *
466
+     * will be parsed into the following array:
467
+     *
468
+     *   "css" => "h1 { color:red; }"
469
+     *   "media" => "@media { h1 {}}"
470
+     *
471
+     * @param string $css
472
+     * @return array
473
+     */
474
+    private function splitCssAndMediaQuery($css) {
475
+        $css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
476
+
477
+        // filter the CSS
478
+        $search = array(
479
+            // get rid of css comment code
480
+            '/\\/\\*.*\\*\\//sU',
481
+            // strip out any import directives
482
+            '/^\\s*@import\\s[^;]+;/misU',
483
+            // strip remains media enclosures
484
+            '/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
485
+        );
486
+
487
+        $replace = array(
488
+            '',
489
+            '',
490
+            '',
491
+        );
492
+
493
+        // clean CSS before output
494
+        $css = preg_replace($search, $replace, $css);
495
+
496
+        return array('css' => $css, 'media' => self::$_media);
497
+    }
498 498
 
499 499
     /**
500 500
      * Media concat.
@@ -503,306 +503,306 @@  discard block
 block discarded – undo
503 503
      *
504 504
      * @param array $matches Matches result array.
505 505
      */
506
-	private function _media_concat( $matches ) {
507
-		self::$_media .= $matches[0];
508
-	}
509
-
510
-	/**
511
-	 * Creates a DOMDocument instance with the current HTML.
512
-	 *
513
-	 * @return DOMDocument
514
-	 */
515
-	private function createXmlDocument() {
516
-		$xmlDocument = new DOMDocument;
517
-		$xmlDocument->encoding = self::ENCODING;
518
-		$xmlDocument->strictErrorChecking = false;
519
-		$xmlDocument->formatOutput = true;
520
-		$libXmlState = libxml_use_internal_errors(true);
521
-		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
522
-		/** @scrutinizer ignore-unhandled */ @$xmlDocument->loadHTML($this->getUnifiedHtml());
523
-		libxml_clear_errors();
524
-		libxml_use_internal_errors($libXmlState);
525
-		$xmlDocument->normalizeDocument();
526
-
527
-		return $xmlDocument;
528
-	}
529
-
530
-	/**
531
-	 * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
532
-	 *
533
-	 * @return string the unified HTML
534
-	 *
535
-	 * @throws BadMethodCallException
536
-	 */
537
-	private function getUnifiedHtml() {
538
-		if (!empty($this->unprocessableHtmlTags)) {
539
-			$unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
540
-			$bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
541
-		} else {
542
-			$bodyWithoutUnprocessableTags = $this->html;
543
-		}
544
-
545
-		// Deprecated since PHP 8.2
546
-		if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
547
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
548
-		} else {
549
-			return mb_encode_numericentity( $bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
550
-			//return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
551
-		}
552
-	}
553
-
554
-	/**
555
-	 * @param array $a
556
-	 * @param array $b
557
-	 *
558
-	 * @return integer
559
-	 */
560
-	private function sortBySelectorPrecedence(array $a, array $b) {
561
-		$precedenceA = $this->getCssSelectorPrecedence($a['selector']);
562
-		$precedenceB = $this->getCssSelectorPrecedence($b['selector']);
563
-
564
-		// We want these sorted in ascending order so selectors with lesser precedence get processed first and
565
-		// selectors with greater precedence get sorted last.
566
-		// The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
567
-		// arithmetic operators.
568
-		// @see http://forge.typo3.org/issues/55605
569
-		$precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
570
-		$precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
571
-		return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
572
-	}
573
-
574
-	/**
575
-	 * @param string $selector
576
-	 *
577
-	 * @return integer
578
-	 */
579
-	private function getCssSelectorPrecedence($selector) {
580
-		$selectorKey = md5($selector);
581
-		if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
582
-			$precedence = 0;
583
-			$value = 100;
584
-			// ids: worth 100, classes: worth 10, elements: worth 1
585
-			$search = array('\\#','\\.','');
586
-
587
-			foreach ($search as $s) {
588
-				if (trim($selector == '')) {
589
-					break;
590
-				}
591
-				$number = 0;
592
-				$selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
593
-				$precedence += ($value * $number);
594
-				$value /= 10;
595
-			}
596
-			$this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
597
-		}
598
-
599
-		return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
600
-	}
601
-
602
-	/**
603
-	 * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
604
-	 *
605
-	 * @see http://plasmasturm.org/log/444/
606
-	 *
607
-	 * @param string $paramCssSelector
608
-	 *
609
-	 * @return string
610
-	 */
611
-	private function translateCssToXpath($paramCssSelector) {
612
-		$cssSelector = ' ' . $paramCssSelector . ' ';
613
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
614
-		$cssSelector = trim($cssSelector);
615
-		$xpathKey = md5($cssSelector);
616
-		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
617
-			// returns an Xpath selector
618
-			$search = array(
619
-				// Matches any element that is a child of parent.
620
-				'/\\s+>\\s+/',
621
-				// Matches any element that is an adjacent sibling.
622
-				'/\\s+\\+\\s+/',
623
-				// Matches any element that is a descendant of an parent element element.
624
-				'/\\s+/',
625
-				// first-child pseudo-selector
626
-				'/([^\\/]+):first-child/i',
627
-				// last-child pseudo-selector
628
-				'/([^\\/]+):last-child/i',
629
-				// Matches attribute only selector
630
-				'/^\\[(\\w+)\\]/',
631
-				// Matches element with attribute
632
-				'/(\\w)\\[(\\w+)\\]/',
633
-				// Matches element with EXACT attribute
634
-				'/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
635
-			);
636
-			$replace = array(
637
-				'/',
638
-				'/following-sibling::*[1]/self::',
639
-				'//',
640
-				'*[1]/self::\\1',
641
-				'*[last()]/self::\\1',
642
-				'*[@\\1]',
643
-				'\\1[@\\2]',
644
-				'\\1[@\\2="\\3"]',
645
-			);
646
-
647
-			$cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
648
-
649
-			$cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
650
-			$cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
651
-
652
-			// Advanced selectors are going to require a bit more advanced emogrification.
653
-			// When we required PHP 5.3, we could do this with closures.
654
-			$cssSelector = preg_replace_callback(
655
-				'/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
656
-				array($this, 'translateNthChild'), $cssSelector
657
-			);
658
-			$cssSelector = preg_replace_callback(
659
-				'/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
660
-				array($this, 'translateNthOfType'), $cssSelector
661
-			);
662
-
663
-			$this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
664
-		}
665
-		return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
666
-	}
667
-
668
-	/**
669
-	 * @param array $match
670
-	 *
671
-	 * @return string
672
-	 */
673
-	private function matchIdAttributes(array $match) {
674
-		return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
675
-	}
676
-
677
-	/**
678
-	 * @param array $match
679
-	 *
680
-	 * @return string
681
-	 */
682
-	private function matchClassAttributes(array $match) {
683
-		return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
684
-			implode(
685
-				'"," "))][contains(concat(" ",@class," "),concat(" ","',
686
-				explode('.', substr($match[2], 1))
687
-			) . '"," "))]';
688
-	}
689
-
690
-	/**
691
-	 * @param array $match
692
-	 *
693
-	 * @return string
694
-	 */
695
-	private function translateNthChild(array $match) {
696
-		$result = $this->parseNth($match);
697
-
698
-		if (isset($result[self::MULTIPLIER])) {
699
-			if ($result[self::MULTIPLIER] < 0) {
700
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
-				return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
702
-			} else {
703
-				return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
704
-			}
705
-		} else {
706
-			return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
707
-		}
708
-	}
709
-
710
-	/**
711
-	 * @param array $match
712
-	 *
713
-	 * @return string
714
-	 */
715
-	private function translateNthOfType(array $match) {
716
-		$result = $this->parseNth($match);
717
-
718
-		if (isset($result[self::MULTIPLIER])) {
719
-			if ($result[self::MULTIPLIER] < 0) {
720
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
721
-				return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
722
-			} else {
723
-				return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
724
-			}
725
-		} else {
726
-			return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
727
-		}
728
-	}
729
-
730
-	/**
731
-	 * @param array $match
732
-	 *
733
-	 * @return array
734
-	 */
735
-	private function parseNth(array $match) {
736
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
737
-			$index = strtolower($match[2]) == 'even' ? 0 : 1;
738
-			return array(self::MULTIPLIER => 2, self::INDEX => $index);
739
-		} elseif (stripos($match[2], 'n') === false) {
740
-			// if there is a multiplier
741
-			$index = intval(str_replace(' ', '', $match[2]));
742
-			return array(self::INDEX => $index);
743
-		} else {
744
-			if (isset($match[3])) {
745
-				$multipleTerm = str_replace($match[3], '', $match[2]);
746
-				$index = intval(str_replace(' ', '', $match[3]));
747
-			} else {
748
-				$multipleTerm = $match[2];
749
-				$index = 0;
750
-			}
751
-
752
-			$multiplier = str_ireplace('n', '', $multipleTerm);
753
-
754
-			if (!strlen($multiplier)) {
755
-				$multiplier = 1;
756
-			} elseif ($multiplier == 0) {
757
-				return array(self::INDEX => $index);
758
-			} else {
759
-				$multiplier = intval($multiplier);
760
-			}
761
-
762
-			while ($index < 0) {
763
-				$index += abs($multiplier);
764
-			}
765
-
766
-			return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
767
-		}
768
-	}
769
-
770
-	/**
771
-	 * Parses a CSS declaration block into property name/value pairs.
772
-	 *
773
-	 * Example:
774
-	 *
775
-	 * The declaration block.
776
-	 *
777
-	 *   "color: #000; font-weight: bold;".
778
-	 *
779
-	 * will be parsed into the following array:
780
-	 *
781
-	 *   "color" => "#000"
782
-	 *   "font-weight" => "bold"
783
-	 *
784
-	 * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
785
-	 *
786
-	 * @return array the CSS declarations with the property names as array keys and the property values as array values
787
-	 */
788
-	private function parseCssDeclarationBlock($cssDeclarationBlock) {
789
-		if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
790
-			return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
791
-		}
792
-
793
-		$properties = array();
794
-		$declarations = explode(';', $cssDeclarationBlock);
795
-		foreach ($declarations as $declaration) {
796
-			$matches = array();
797
-			if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
798
-				continue;
799
-			}
800
-			$propertyName = strtolower($matches[1]);
801
-			$propertyValue = $matches[2];
802
-			$properties[$propertyName] = $propertyValue;
803
-		}
804
-		$this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
805
-
806
-		return $properties;
807
-	}
506
+    private function _media_concat( $matches ) {
507
+        self::$_media .= $matches[0];
508
+    }
509
+
510
+    /**
511
+     * Creates a DOMDocument instance with the current HTML.
512
+     *
513
+     * @return DOMDocument
514
+     */
515
+    private function createXmlDocument() {
516
+        $xmlDocument = new DOMDocument;
517
+        $xmlDocument->encoding = self::ENCODING;
518
+        $xmlDocument->strictErrorChecking = false;
519
+        $xmlDocument->formatOutput = true;
520
+        $libXmlState = libxml_use_internal_errors(true);
521
+        // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
522
+        /** @scrutinizer ignore-unhandled */ @$xmlDocument->loadHTML($this->getUnifiedHtml());
523
+        libxml_clear_errors();
524
+        libxml_use_internal_errors($libXmlState);
525
+        $xmlDocument->normalizeDocument();
526
+
527
+        return $xmlDocument;
528
+    }
529
+
530
+    /**
531
+     * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
532
+     *
533
+     * @return string the unified HTML
534
+     *
535
+     * @throws BadMethodCallException
536
+     */
537
+    private function getUnifiedHtml() {
538
+        if (!empty($this->unprocessableHtmlTags)) {
539
+            $unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
540
+            $bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
541
+        } else {
542
+            $bodyWithoutUnprocessableTags = $this->html;
543
+        }
544
+
545
+        // Deprecated since PHP 8.2
546
+        if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
547
+            return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
548
+        } else {
549
+            return mb_encode_numericentity( $bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
550
+            //return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
551
+        }
552
+    }
553
+
554
+    /**
555
+     * @param array $a
556
+     * @param array $b
557
+     *
558
+     * @return integer
559
+     */
560
+    private function sortBySelectorPrecedence(array $a, array $b) {
561
+        $precedenceA = $this->getCssSelectorPrecedence($a['selector']);
562
+        $precedenceB = $this->getCssSelectorPrecedence($b['selector']);
563
+
564
+        // We want these sorted in ascending order so selectors with lesser precedence get processed first and
565
+        // selectors with greater precedence get sorted last.
566
+        // The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
567
+        // arithmetic operators.
568
+        // @see http://forge.typo3.org/issues/55605
569
+        $precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
570
+        $precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
571
+        return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
572
+    }
573
+
574
+    /**
575
+     * @param string $selector
576
+     *
577
+     * @return integer
578
+     */
579
+    private function getCssSelectorPrecedence($selector) {
580
+        $selectorKey = md5($selector);
581
+        if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
582
+            $precedence = 0;
583
+            $value = 100;
584
+            // ids: worth 100, classes: worth 10, elements: worth 1
585
+            $search = array('\\#','\\.','');
586
+
587
+            foreach ($search as $s) {
588
+                if (trim($selector == '')) {
589
+                    break;
590
+                }
591
+                $number = 0;
592
+                $selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
593
+                $precedence += ($value * $number);
594
+                $value /= 10;
595
+            }
596
+            $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
597
+        }
598
+
599
+        return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
600
+    }
601
+
602
+    /**
603
+     * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
604
+     *
605
+     * @see http://plasmasturm.org/log/444/
606
+     *
607
+     * @param string $paramCssSelector
608
+     *
609
+     * @return string
610
+     */
611
+    private function translateCssToXpath($paramCssSelector) {
612
+        $cssSelector = ' ' . $paramCssSelector . ' ';
613
+        $cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
614
+        $cssSelector = trim($cssSelector);
615
+        $xpathKey = md5($cssSelector);
616
+        if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
617
+            // returns an Xpath selector
618
+            $search = array(
619
+                // Matches any element that is a child of parent.
620
+                '/\\s+>\\s+/',
621
+                // Matches any element that is an adjacent sibling.
622
+                '/\\s+\\+\\s+/',
623
+                // Matches any element that is a descendant of an parent element element.
624
+                '/\\s+/',
625
+                // first-child pseudo-selector
626
+                '/([^\\/]+):first-child/i',
627
+                // last-child pseudo-selector
628
+                '/([^\\/]+):last-child/i',
629
+                // Matches attribute only selector
630
+                '/^\\[(\\w+)\\]/',
631
+                // Matches element with attribute
632
+                '/(\\w)\\[(\\w+)\\]/',
633
+                // Matches element with EXACT attribute
634
+                '/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
635
+            );
636
+            $replace = array(
637
+                '/',
638
+                '/following-sibling::*[1]/self::',
639
+                '//',
640
+                '*[1]/self::\\1',
641
+                '*[last()]/self::\\1',
642
+                '*[@\\1]',
643
+                '\\1[@\\2]',
644
+                '\\1[@\\2="\\3"]',
645
+            );
646
+
647
+            $cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
648
+
649
+            $cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
650
+            $cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
651
+
652
+            // Advanced selectors are going to require a bit more advanced emogrification.
653
+            // When we required PHP 5.3, we could do this with closures.
654
+            $cssSelector = preg_replace_callback(
655
+                '/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
656
+                array($this, 'translateNthChild'), $cssSelector
657
+            );
658
+            $cssSelector = preg_replace_callback(
659
+                '/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
660
+                array($this, 'translateNthOfType'), $cssSelector
661
+            );
662
+
663
+            $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
664
+        }
665
+        return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
666
+    }
667
+
668
+    /**
669
+     * @param array $match
670
+     *
671
+     * @return string
672
+     */
673
+    private function matchIdAttributes(array $match) {
674
+        return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
675
+    }
676
+
677
+    /**
678
+     * @param array $match
679
+     *
680
+     * @return string
681
+     */
682
+    private function matchClassAttributes(array $match) {
683
+        return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
684
+            implode(
685
+                '"," "))][contains(concat(" ",@class," "),concat(" ","',
686
+                explode('.', substr($match[2], 1))
687
+            ) . '"," "))]';
688
+    }
689
+
690
+    /**
691
+     * @param array $match
692
+     *
693
+     * @return string
694
+     */
695
+    private function translateNthChild(array $match) {
696
+        $result = $this->parseNth($match);
697
+
698
+        if (isset($result[self::MULTIPLIER])) {
699
+            if ($result[self::MULTIPLIER] < 0) {
700
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
+                return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
702
+            } else {
703
+                return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
704
+            }
705
+        } else {
706
+            return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
707
+        }
708
+    }
709
+
710
+    /**
711
+     * @param array $match
712
+     *
713
+     * @return string
714
+     */
715
+    private function translateNthOfType(array $match) {
716
+        $result = $this->parseNth($match);
717
+
718
+        if (isset($result[self::MULTIPLIER])) {
719
+            if ($result[self::MULTIPLIER] < 0) {
720
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
721
+                return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
722
+            } else {
723
+                return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
724
+            }
725
+        } else {
726
+            return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
727
+        }
728
+    }
729
+
730
+    /**
731
+     * @param array $match
732
+     *
733
+     * @return array
734
+     */
735
+    private function parseNth(array $match) {
736
+        if (in_array(strtolower($match[2]), array('even','odd'))) {
737
+            $index = strtolower($match[2]) == 'even' ? 0 : 1;
738
+            return array(self::MULTIPLIER => 2, self::INDEX => $index);
739
+        } elseif (stripos($match[2], 'n') === false) {
740
+            // if there is a multiplier
741
+            $index = intval(str_replace(' ', '', $match[2]));
742
+            return array(self::INDEX => $index);
743
+        } else {
744
+            if (isset($match[3])) {
745
+                $multipleTerm = str_replace($match[3], '', $match[2]);
746
+                $index = intval(str_replace(' ', '', $match[3]));
747
+            } else {
748
+                $multipleTerm = $match[2];
749
+                $index = 0;
750
+            }
751
+
752
+            $multiplier = str_ireplace('n', '', $multipleTerm);
753
+
754
+            if (!strlen($multiplier)) {
755
+                $multiplier = 1;
756
+            } elseif ($multiplier == 0) {
757
+                return array(self::INDEX => $index);
758
+            } else {
759
+                $multiplier = intval($multiplier);
760
+            }
761
+
762
+            while ($index < 0) {
763
+                $index += abs($multiplier);
764
+            }
765
+
766
+            return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
767
+        }
768
+    }
769
+
770
+    /**
771
+     * Parses a CSS declaration block into property name/value pairs.
772
+     *
773
+     * Example:
774
+     *
775
+     * The declaration block.
776
+     *
777
+     *   "color: #000; font-weight: bold;".
778
+     *
779
+     * will be parsed into the following array:
780
+     *
781
+     *   "color" => "#000"
782
+     *   "font-weight" => "bold"
783
+     *
784
+     * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
785
+     *
786
+     * @return array the CSS declarations with the property names as array keys and the property values as array values
787
+     */
788
+    private function parseCssDeclarationBlock($cssDeclarationBlock) {
789
+        if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
790
+            return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
791
+        }
792
+
793
+        $properties = array();
794
+        $declarations = explode(';', $cssDeclarationBlock);
795
+        foreach ($declarations as $declaration) {
796
+            $matches = array();
797
+            if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
798
+                continue;
799
+            }
800
+            $propertyName = strtolower($matches[1]);
801
+            $propertyValue = $matches[2];
802
+            $properties[$propertyName] = $propertyValue;
803
+        }
804
+        $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
805
+
806
+        return $properties;
807
+    }
808 808
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -238,7 +238,7 @@  discard block
 block discarded – undo
238 238
 		if ($nodesWithStyleAttributes !== false) {
239 239
 			/** @var $nodeWithStyleAttribute DOMNode */
240 240
 			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
241
+				$normalizedOriginalStyle = preg_replace_callback('/[A-z\\-]+(?=\\:)/S', array($this, 'strtolower'), $node->getAttribute('style'));
242 242
 
243 243
 				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244 244
 				$nodePath = $node->getNodePath();
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 			}
290 290
 
291 291
 			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
292
+			usort($allSelectors, array($this, 'sortBySelectorPrecedence'));
293 293
 
294 294
 			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295 295
 		}
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 		if ($nodesWithStyleDisplayNone->length > 0) {
330 330
 			/** @var $node \DOMNode */
331 331
 			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
332
+				if ($node->parentNode && is_callable(array($node->parentNode, 'removeChild'))) {
333 333
 					$node->parentNode->removeChild($node);
334 334
 				}
335 335
 			}
@@ -339,10 +339,10 @@  discard block
 block discarded – undo
339 339
 
340 340
 		if ($this->preserveEncoding) {
341 341
 			// Deprecated since PHP 8.2
342
-			if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
343
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
342
+			if (version_compare(PHP_VERSION, '8.2', '<') && function_exists('mb_convert_encoding')) {
343
+				return mb_convert_encoding($xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES');
344 344
 			} else {
345
-				return mb_encode_numericentity( $xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
345
+				return mb_encode_numericentity($xmlDocument->saveHTML(), [0x80, 0x10FFFF, 0, ~0], self::ENCODING);
346 346
 				//return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
347 347
 			}
348 348
 		} else {
@@ -472,7 +472,7 @@  discard block
 block discarded – undo
472 472
 	 * @return array
473 473
 	 */
474 474
 	private function splitCssAndMediaQuery($css) {
475
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
475
+		$css = preg_replace_callback('#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array($this, '_media_concat'), $css);
476 476
 
477 477
 		// filter the CSS
478 478
 		$search = array(
@@ -503,7 +503,7 @@  discard block
 block discarded – undo
503 503
      *
504 504
      * @param array $matches Matches result array.
505 505
      */
506
-	private function _media_concat( $matches ) {
506
+	private function _media_concat($matches) {
507 507
 		self::$_media .= $matches[0];
508 508
 	}
509 509
 
@@ -543,10 +543,10 @@  discard block
 block discarded – undo
543 543
 		}
544 544
 
545 545
 		// Deprecated since PHP 8.2
546
-		if ( version_compare( PHP_VERSION, '8.2', '<' ) && function_exists( 'mb_convert_encoding' ) ) {
547
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
546
+		if (version_compare(PHP_VERSION, '8.2', '<') && function_exists('mb_convert_encoding')) {
547
+			return mb_convert_encoding($bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING);
548 548
 		} else {
549
-			return mb_encode_numericentity( $bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING );
549
+			return mb_encode_numericentity($bodyWithoutUnprocessableTags, [0x80, 0x10FFFF, 0, ~0], self::ENCODING);
550 550
 			//return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
551 551
 		}
552 552
 	}
@@ -582,7 +582,7 @@  discard block
 block discarded – undo
582 582
 			$precedence = 0;
583 583
 			$value = 100;
584 584
 			// ids: worth 100, classes: worth 10, elements: worth 1
585
-			$search = array('\\#','\\.','');
585
+			$search = array('\\#', '\\.', '');
586 586
 
587 587
 			foreach ($search as $s) {
588 588
 				if (trim($selector == '')) {
@@ -610,7 +610,7 @@  discard block
 block discarded – undo
610 610
 	 */
611 611
 	private function translateCssToXpath($paramCssSelector) {
612 612
 		$cssSelector = ' ' . $paramCssSelector . ' ';
613
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
613
+		$cssSelector = preg_replace_callback('/\s+\w+\s+/', array($this, 'strtolower'), $cssSelector);
614 614
 		$cssSelector = trim($cssSelector);
615 615
 		$xpathKey = md5($cssSelector);
616 616
 		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
@@ -733,7 +733,7 @@  discard block
 block discarded – undo
733 733
 	 * @return array
734 734
 	 */
735 735
 	private function parseNth(array $match) {
736
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
736
+		if (in_array(strtolower($match[2]), array('even', 'odd'))) {
737 737
 			$index = strtolower($match[2]) == 'even' ? 0 : 1;
738 738
 			return array(self::MULTIPLIER => 2, self::INDEX => $index);
739 739
 		} elseif (stripos($match[2], 'n') === false) {
Please login to merge, or discard this patch.
includes/class-wpinv.php 2 patches
Indentation   +597 added lines, -597 removed lines patch added patch discarded remove patch
@@ -14,643 +14,643 @@
 block discarded – undo
14 14
  */
15 15
 class WPInv_Plugin {
16 16
 
17
-	/**
18
-	 * GetPaid version.
19
-	 *
20
-	 * @var string
21
-	 */
22
-	public $version;
23
-
24
-	/**
25
-	 * Data container.
26
-	 *
27
-	 * @var array
28
-	 */
29
-	protected $data = array();
30
-
31
-	/**
32
-	 * Form elements instance.
33
-	 *
34
-	 * @var WPInv_Payment_Form_Elements
35
-	 */
36
-	public $form_elements;
37
-
38
-	/**
39
-	 * @var array An array of payment gateways.
40
-	 */
41
-	public $gateways;
42
-
43
-	/**
44
-	 * Class constructor.
45
-	 */
46
-	public function __construct() {
47
-		$this->define_constants();
48
-		$this->includes();
49
-		$this->init_hooks();
50
-		$this->set_properties();
51
-	}
52
-
53
-	/**
54
-	 * Sets a custom data property.
55
-	 *
56
-	 * @param string $prop The prop to set.
57
-	 * @param mixed $value The value to retrieve.
58
-	 */
59
-	public function set( $prop, $value ) {
60
-		$this->data[ $prop ] = $value;
61
-	}
62
-
63
-	/**
64
-	 * Gets a custom data property.
65
-	 *
66
-	 * @param string $prop The prop to set.
67
-	 * @return mixed The value.
68
-	 */
69
-	public function get( $prop ) {
70
-
71
-		if ( isset( $this->data[ $prop ] ) ) {
72
-			return $this->data[ $prop ];
73
-		}
74
-
75
-		return null;
76
-	}
77
-
78
-	/**
79
-	 * Define class properties.
80
-	 */
81
-	public function set_properties() {
82
-
83
-		// Sessions.
84
-		$this->set( 'session', new WPInv_Session_Handler() );
85
-		$GLOBALS['wpi_session'] = $this->get( 'session' ); // Backwards compatibility.
86
-		$GLOBALS['wpinv_euvat'] = new WPInv_EUVat(); // Backwards compatibility.
87
-
88
-		// Init other objects.
89
-		$this->set( 'notes', new WPInv_Notes() );
90
-		$this->set( 'api', new WPInv_API() );
91
-		$this->set( 'post_types', new GetPaid_Post_Types() );
92
-		$this->set( 'template', new GetPaid_Template() );
93
-		$this->set( 'admin', new GetPaid_Admin() );
94
-		$this->set( 'subscriptions', new WPInv_Subscriptions() );
95
-		$this->set( 'invoice_emails', new GetPaid_Invoice_Notification_Emails() );
96
-		$this->set( 'subscription_emails', new GetPaid_Subscription_Notification_Emails() );
97
-		$this->set( 'daily_maintenace', new GetPaid_Daily_Maintenance() );
98
-		$this->set( 'payment_forms', new GetPaid_Payment_Forms() );
99
-		$this->set( 'maxmind', new GetPaid_MaxMind_Geolocation() );
100
-
101
-	}
102
-
103
-	 /**
104
-	 * Define plugin constants.
105
-	 */
106
-	public function define_constants() {
107
-		define( 'WPINV_PLUGIN_DIR', plugin_dir_path( WPINV_PLUGIN_FILE ) );
108
-		define( 'WPINV_PLUGIN_URL', plugin_dir_url( WPINV_PLUGIN_FILE ) );
109
-		$this->version = WPINV_VERSION;
110
-	}
111
-
112
-	/**
113
-	 * Hook into actions and filters.
114
-	 *
115
-	 * @since 1.0.19
116
-	 */
117
-	protected function init_hooks() {
118
-		/* Internationalize the text strings used. */
119
-		add_action( 'plugins_loaded', array( &$this, 'plugins_loaded' ) );
120
-
121
-		// Init the plugin after WordPress inits.
122
-		add_action( 'init', array( $this, 'init' ), 1 );
123
-		add_action( 'init', array( $this, 'maybe_process_ipn' ), 10 );
124
-		add_action( 'init', array( $this, 'wpinv_actions' ) );
125
-		add_action( 'init', array( $this, 'maybe_do_authenticated_action' ), 100 );
126
-		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 11 );
127
-		add_action( 'wp_footer', array( $this, 'wp_footer' ) );
128
-		add_action( 'wp_head', array( $this, 'wp_head' ) );
129
-		add_action( 'widgets_init', array( $this, 'register_widgets' ) );
130
-		add_filter( 'wpseo_exclude_from_sitemap_by_post_ids', array( $this, 'wpseo_exclude_from_sitemap_by_post_ids' ) );
131
-		add_filter( 'the_seo_framework_sitemap_supported_post_types', array( $this, 'exclude_invoicing_post_types' ) );
132
-		add_filter( 'pre_get_posts', array( &$this, 'pre_get_posts' ) );
133
-
134
-		add_filter( 'query_vars', array( $this, 'custom_query_vars' ) );
17
+    /**
18
+     * GetPaid version.
19
+     *
20
+     * @var string
21
+     */
22
+    public $version;
23
+
24
+    /**
25
+     * Data container.
26
+     *
27
+     * @var array
28
+     */
29
+    protected $data = array();
30
+
31
+    /**
32
+     * Form elements instance.
33
+     *
34
+     * @var WPInv_Payment_Form_Elements
35
+     */
36
+    public $form_elements;
37
+
38
+    /**
39
+     * @var array An array of payment gateways.
40
+     */
41
+    public $gateways;
42
+
43
+    /**
44
+     * Class constructor.
45
+     */
46
+    public function __construct() {
47
+        $this->define_constants();
48
+        $this->includes();
49
+        $this->init_hooks();
50
+        $this->set_properties();
51
+    }
52
+
53
+    /**
54
+     * Sets a custom data property.
55
+     *
56
+     * @param string $prop The prop to set.
57
+     * @param mixed $value The value to retrieve.
58
+     */
59
+    public function set( $prop, $value ) {
60
+        $this->data[ $prop ] = $value;
61
+    }
62
+
63
+    /**
64
+     * Gets a custom data property.
65
+     *
66
+     * @param string $prop The prop to set.
67
+     * @return mixed The value.
68
+     */
69
+    public function get( $prop ) {
70
+
71
+        if ( isset( $this->data[ $prop ] ) ) {
72
+            return $this->data[ $prop ];
73
+        }
74
+
75
+        return null;
76
+    }
77
+
78
+    /**
79
+     * Define class properties.
80
+     */
81
+    public function set_properties() {
82
+
83
+        // Sessions.
84
+        $this->set( 'session', new WPInv_Session_Handler() );
85
+        $GLOBALS['wpi_session'] = $this->get( 'session' ); // Backwards compatibility.
86
+        $GLOBALS['wpinv_euvat'] = new WPInv_EUVat(); // Backwards compatibility.
87
+
88
+        // Init other objects.
89
+        $this->set( 'notes', new WPInv_Notes() );
90
+        $this->set( 'api', new WPInv_API() );
91
+        $this->set( 'post_types', new GetPaid_Post_Types() );
92
+        $this->set( 'template', new GetPaid_Template() );
93
+        $this->set( 'admin', new GetPaid_Admin() );
94
+        $this->set( 'subscriptions', new WPInv_Subscriptions() );
95
+        $this->set( 'invoice_emails', new GetPaid_Invoice_Notification_Emails() );
96
+        $this->set( 'subscription_emails', new GetPaid_Subscription_Notification_Emails() );
97
+        $this->set( 'daily_maintenace', new GetPaid_Daily_Maintenance() );
98
+        $this->set( 'payment_forms', new GetPaid_Payment_Forms() );
99
+        $this->set( 'maxmind', new GetPaid_MaxMind_Geolocation() );
100
+
101
+    }
102
+
103
+        /**
104
+         * Define plugin constants.
105
+         */
106
+    public function define_constants() {
107
+        define( 'WPINV_PLUGIN_DIR', plugin_dir_path( WPINV_PLUGIN_FILE ) );
108
+        define( 'WPINV_PLUGIN_URL', plugin_dir_url( WPINV_PLUGIN_FILE ) );
109
+        $this->version = WPINV_VERSION;
110
+    }
111
+
112
+    /**
113
+     * Hook into actions and filters.
114
+     *
115
+     * @since 1.0.19
116
+     */
117
+    protected function init_hooks() {
118
+        /* Internationalize the text strings used. */
119
+        add_action( 'plugins_loaded', array( &$this, 'plugins_loaded' ) );
120
+
121
+        // Init the plugin after WordPress inits.
122
+        add_action( 'init', array( $this, 'init' ), 1 );
123
+        add_action( 'init', array( $this, 'maybe_process_ipn' ), 10 );
124
+        add_action( 'init', array( $this, 'wpinv_actions' ) );
125
+        add_action( 'init', array( $this, 'maybe_do_authenticated_action' ), 100 );
126
+        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 11 );
127
+        add_action( 'wp_footer', array( $this, 'wp_footer' ) );
128
+        add_action( 'wp_head', array( $this, 'wp_head' ) );
129
+        add_action( 'widgets_init', array( $this, 'register_widgets' ) );
130
+        add_filter( 'wpseo_exclude_from_sitemap_by_post_ids', array( $this, 'wpseo_exclude_from_sitemap_by_post_ids' ) );
131
+        add_filter( 'the_seo_framework_sitemap_supported_post_types', array( $this, 'exclude_invoicing_post_types' ) );
132
+        add_filter( 'pre_get_posts', array( &$this, 'pre_get_posts' ) );
133
+
134
+        add_filter( 'query_vars', array( $this, 'custom_query_vars' ) );
135 135
         add_action( 'init', array( $this, 'add_rewrite_rule' ), 10, 0 );
136
-		add_action( 'pre_get_posts', array( $this, 'maybe_process_new_ipn' ), 1 );
137
-
138
-		// Fires after registering actions.
139
-		do_action( 'wpinv_actions', $this );
140
-		do_action( 'getpaid_actions', $this );
141
-
142
-	}
143
-
144
-	public function plugins_loaded() {
145
-		/* Internationalize the text strings used. */
146
-		$this->load_textdomain();
147
-
148
-		do_action( 'wpinv_loaded' );
149
-
150
-		// Fix oxygen page builder conflict
151
-		if ( function_exists( 'ct_css_output' ) ) {
152
-			wpinv_oxygen_fix_conflict();
153
-		}
154
-	}
155
-
156
-	/**
157
-	 * Load Localisation files.
158
-	 *
159
-	 * Note: the first-loaded translation file overrides any following ones if the same translation is present.
160
-	 *
161
-	 * Locales found in:
162
-	 *      - WP_LANG_DIR/plugins/invoicing-LOCALE.mo
163
-	 *      - WP_PLUGIN_DIR/invoicing/languages/invoicing-LOCALE.mo
164
-	 *
165
-	 * @since 1.0.0
166
-	 */
167
-	public function load_textdomain() {
168
-
169
-		load_plugin_textdomain(
170
-			'invoicing',
171
-			false,
172
-			plugin_basename( dirname( WPINV_PLUGIN_FILE ) ) . '/languages/'
173
-		);
174
-
175
-	}
176
-
177
-	/**
178
-	 * Include required core files used in admin and on the frontend.
179
-	 */
180
-	public function includes() {
181
-
182
-		// Start with the settings.
183
-		require_once WPINV_PLUGIN_DIR . 'includes/admin/register-settings.php';
184
-
185
-		// Packages/libraries.
186
-		require_once WPINV_PLUGIN_DIR . 'vendor/autoload.php';
187
-		require_once WPINV_PLUGIN_DIR . 'vendor/ayecode/wp-ayecode-ui/ayecode-ui-loader.php';
188
-
189
-		// Load functions.
190
-		require_once WPINV_PLUGIN_DIR . 'includes/deprecated-functions.php';
191
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-email-functions.php';
192
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-general-functions.php';
193
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-helper-functions.php';
194
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-tax-functions.php';
195
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-template-functions.php';
196
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-address-functions.php';
197
-		require_once WPINV_PLUGIN_DIR . 'includes/invoice-functions.php';
198
-		require_once WPINV_PLUGIN_DIR . 'includes/subscription-functions.php';
199
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-item-functions.php';
200
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-discount-functions.php';
201
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-gateway-functions.php';
202
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-payment-functions.php';
203
-		require_once WPINV_PLUGIN_DIR . 'includes/user-functions.php';
204
-		require_once WPINV_PLUGIN_DIR . 'includes/error-functions.php';
205
-
206
-		// Register autoloader.
207
-		try {
208
-			spl_autoload_register( array( $this, 'autoload' ), true );
209
-		} catch ( Exception $e ) {
210
-			wpinv_error_log( $e->getMessage(), '', __FILE__, 149, true );
211
-		}
212
-
213
-		require_once WPINV_PLUGIN_DIR . 'includes/abstracts/abstract-wpinv-session.php';
214
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-session-handler.php';
215
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-ajax.php';
216
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-api.php';
217
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-cache-helper.php';
218
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-db.php';
219
-		require_once WPINV_PLUGIN_DIR . 'includes/admin/subscriptions.php';
220
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-subscriptions-db.php';
221
-		require_once WPINV_PLUGIN_DIR . 'includes/wpinv-subscription.php';
222
-		require_once WPINV_PLUGIN_DIR . 'includes/abstracts/abstract-wpinv-privacy.php';
223
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-privacy.php';
224
-		require_once WPINV_PLUGIN_DIR . 'includes/libraries/class-ayecode-addons.php';
225
-		require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-addons.php';
226
-		require_once WPINV_PLUGIN_DIR . 'widgets/checkout.php';
227
-		require_once WPINV_PLUGIN_DIR . 'widgets/invoice-history.php';
228
-		require_once WPINV_PLUGIN_DIR . 'widgets/invoice-receipt.php';
229
-		require_once WPINV_PLUGIN_DIR . 'widgets/invoice-messages.php';
230
-		require_once WPINV_PLUGIN_DIR . 'widgets/subscriptions.php';
231
-		require_once WPINV_PLUGIN_DIR . 'widgets/buy-item.php';
232
-		require_once WPINV_PLUGIN_DIR . 'widgets/getpaid.php';
233
-		require_once WPINV_PLUGIN_DIR . 'widgets/invoice.php';
234
-		require_once WPINV_PLUGIN_DIR . 'includes/admin/admin-pages.php';
235
-
236
-		if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
237
-			GetPaid_Post_Types_Admin::init();
238
-
239
-			require_once WPINV_PLUGIN_DIR . 'includes/admin/wpinv-admin-functions.php';
240
-			require_once WPINV_PLUGIN_DIR . 'includes/admin/meta-boxes/class-mb-payment-form.php';
241
-			require_once WPINV_PLUGIN_DIR . 'includes/admin/meta-boxes/class-mb-invoice-notes.php';
242
-			require_once WPINV_PLUGIN_DIR . 'includes/admin/class-wpinv-admin-menus.php';
243
-			require_once WPINV_PLUGIN_DIR . 'includes/admin/class-wpinv-users.php';
244
-			require_once WPINV_PLUGIN_DIR . 'includes/admin/class-getpaid-admin-profile.php';
245
-			// load the user class only on the users.php page
246
-			global $pagenow;
247
-			if ( $pagenow == 'users.php' ) {
248
-				new WPInv_Admin_Users();
249
-			}
250
-		}
251
-
252
-		// Register cli commands
253
-		if ( defined( 'WP_CLI' ) && WP_CLI ) {
254
-			require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-cli.php';
255
-			WP_CLI::add_command( 'invoicing', 'WPInv_CLI' );
256
-		}
257
-
258
-	}
259
-
260
-	/**
261
-	 * Class autoloader
262
-	 *
263
-	 * @param       string $class_name The name of the class to load.
264
-	 * @access      public
265
-	 * @since       1.0.19
266
-	 * @return      void
267
-	 */
268
-	public function autoload( $class_name ) {
269
-
270
-		// Normalize the class name...
271
-		$class_name  = strtolower( $class_name );
272
-
273
-		// ... and make sure it is our class.
274
-		if ( false === strpos( $class_name, 'getpaid_' ) && false === strpos( $class_name, 'wpinv_' ) ) {
275
-			return;
276
-		}
277
-
278
-		// Next, prepare the file name from the class.
279
-		$file_name = 'class-' . str_replace( '_', '-', $class_name ) . '.php';
280
-
281
-		// Base path of the classes.
282
-		$plugin_path = untrailingslashit( WPINV_PLUGIN_DIR );
283
-
284
-		// And an array of possible locations in order of importance.
285
-		$locations = array(
286
-			"$plugin_path/includes",
287
-			"$plugin_path/includes/data-stores",
288
-			"$plugin_path/includes/gateways",
289
-			"$plugin_path/includes/payments",
290
-			"$plugin_path/includes/geolocation",
291
-			"$plugin_path/includes/reports",
292
-			"$plugin_path/includes/api",
293
-			"$plugin_path/includes/admin",
294
-			"$plugin_path/includes/admin/meta-boxes",
295
-		);
296
-
297
-		foreach ( apply_filters( 'getpaid_autoload_locations', $locations ) as $location ) {
298
-
299
-			if ( file_exists( trailingslashit( $location ) . $file_name ) ) {
300
-				include trailingslashit( $location ) . $file_name;
301
-				break;
302
-			}
136
+        add_action( 'pre_get_posts', array( $this, 'maybe_process_new_ipn' ), 1 );
137
+
138
+        // Fires after registering actions.
139
+        do_action( 'wpinv_actions', $this );
140
+        do_action( 'getpaid_actions', $this );
141
+
142
+    }
143
+
144
+    public function plugins_loaded() {
145
+        /* Internationalize the text strings used. */
146
+        $this->load_textdomain();
147
+
148
+        do_action( 'wpinv_loaded' );
149
+
150
+        // Fix oxygen page builder conflict
151
+        if ( function_exists( 'ct_css_output' ) ) {
152
+            wpinv_oxygen_fix_conflict();
153
+        }
154
+    }
155
+
156
+    /**
157
+     * Load Localisation files.
158
+     *
159
+     * Note: the first-loaded translation file overrides any following ones if the same translation is present.
160
+     *
161
+     * Locales found in:
162
+     *      - WP_LANG_DIR/plugins/invoicing-LOCALE.mo
163
+     *      - WP_PLUGIN_DIR/invoicing/languages/invoicing-LOCALE.mo
164
+     *
165
+     * @since 1.0.0
166
+     */
167
+    public function load_textdomain() {
168
+
169
+        load_plugin_textdomain(
170
+            'invoicing',
171
+            false,
172
+            plugin_basename( dirname( WPINV_PLUGIN_FILE ) ) . '/languages/'
173
+        );
174
+
175
+    }
176
+
177
+    /**
178
+     * Include required core files used in admin and on the frontend.
179
+     */
180
+    public function includes() {
181
+
182
+        // Start with the settings.
183
+        require_once WPINV_PLUGIN_DIR . 'includes/admin/register-settings.php';
184
+
185
+        // Packages/libraries.
186
+        require_once WPINV_PLUGIN_DIR . 'vendor/autoload.php';
187
+        require_once WPINV_PLUGIN_DIR . 'vendor/ayecode/wp-ayecode-ui/ayecode-ui-loader.php';
188
+
189
+        // Load functions.
190
+        require_once WPINV_PLUGIN_DIR . 'includes/deprecated-functions.php';
191
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-email-functions.php';
192
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-general-functions.php';
193
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-helper-functions.php';
194
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-tax-functions.php';
195
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-template-functions.php';
196
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-address-functions.php';
197
+        require_once WPINV_PLUGIN_DIR . 'includes/invoice-functions.php';
198
+        require_once WPINV_PLUGIN_DIR . 'includes/subscription-functions.php';
199
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-item-functions.php';
200
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-discount-functions.php';
201
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-gateway-functions.php';
202
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-payment-functions.php';
203
+        require_once WPINV_PLUGIN_DIR . 'includes/user-functions.php';
204
+        require_once WPINV_PLUGIN_DIR . 'includes/error-functions.php';
205
+
206
+        // Register autoloader.
207
+        try {
208
+            spl_autoload_register( array( $this, 'autoload' ), true );
209
+        } catch ( Exception $e ) {
210
+            wpinv_error_log( $e->getMessage(), '', __FILE__, 149, true );
211
+        }
212
+
213
+        require_once WPINV_PLUGIN_DIR . 'includes/abstracts/abstract-wpinv-session.php';
214
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-session-handler.php';
215
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-ajax.php';
216
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-api.php';
217
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-cache-helper.php';
218
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-db.php';
219
+        require_once WPINV_PLUGIN_DIR . 'includes/admin/subscriptions.php';
220
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-subscriptions-db.php';
221
+        require_once WPINV_PLUGIN_DIR . 'includes/wpinv-subscription.php';
222
+        require_once WPINV_PLUGIN_DIR . 'includes/abstracts/abstract-wpinv-privacy.php';
223
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-privacy.php';
224
+        require_once WPINV_PLUGIN_DIR . 'includes/libraries/class-ayecode-addons.php';
225
+        require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-addons.php';
226
+        require_once WPINV_PLUGIN_DIR . 'widgets/checkout.php';
227
+        require_once WPINV_PLUGIN_DIR . 'widgets/invoice-history.php';
228
+        require_once WPINV_PLUGIN_DIR . 'widgets/invoice-receipt.php';
229
+        require_once WPINV_PLUGIN_DIR . 'widgets/invoice-messages.php';
230
+        require_once WPINV_PLUGIN_DIR . 'widgets/subscriptions.php';
231
+        require_once WPINV_PLUGIN_DIR . 'widgets/buy-item.php';
232
+        require_once WPINV_PLUGIN_DIR . 'widgets/getpaid.php';
233
+        require_once WPINV_PLUGIN_DIR . 'widgets/invoice.php';
234
+        require_once WPINV_PLUGIN_DIR . 'includes/admin/admin-pages.php';
235
+
236
+        if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
237
+            GetPaid_Post_Types_Admin::init();
238
+
239
+            require_once WPINV_PLUGIN_DIR . 'includes/admin/wpinv-admin-functions.php';
240
+            require_once WPINV_PLUGIN_DIR . 'includes/admin/meta-boxes/class-mb-payment-form.php';
241
+            require_once WPINV_PLUGIN_DIR . 'includes/admin/meta-boxes/class-mb-invoice-notes.php';
242
+            require_once WPINV_PLUGIN_DIR . 'includes/admin/class-wpinv-admin-menus.php';
243
+            require_once WPINV_PLUGIN_DIR . 'includes/admin/class-wpinv-users.php';
244
+            require_once WPINV_PLUGIN_DIR . 'includes/admin/class-getpaid-admin-profile.php';
245
+            // load the user class only on the users.php page
246
+            global $pagenow;
247
+            if ( $pagenow == 'users.php' ) {
248
+                new WPInv_Admin_Users();
249
+            }
250
+        }
251
+
252
+        // Register cli commands
253
+        if ( defined( 'WP_CLI' ) && WP_CLI ) {
254
+            require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-cli.php';
255
+            WP_CLI::add_command( 'invoicing', 'WPInv_CLI' );
256
+        }
257
+
258
+    }
259
+
260
+    /**
261
+     * Class autoloader
262
+     *
263
+     * @param       string $class_name The name of the class to load.
264
+     * @access      public
265
+     * @since       1.0.19
266
+     * @return      void
267
+     */
268
+    public function autoload( $class_name ) {
269
+
270
+        // Normalize the class name...
271
+        $class_name  = strtolower( $class_name );
272
+
273
+        // ... and make sure it is our class.
274
+        if ( false === strpos( $class_name, 'getpaid_' ) && false === strpos( $class_name, 'wpinv_' ) ) {
275
+            return;
276
+        }
277
+
278
+        // Next, prepare the file name from the class.
279
+        $file_name = 'class-' . str_replace( '_', '-', $class_name ) . '.php';
280
+
281
+        // Base path of the classes.
282
+        $plugin_path = untrailingslashit( WPINV_PLUGIN_DIR );
283
+
284
+        // And an array of possible locations in order of importance.
285
+        $locations = array(
286
+            "$plugin_path/includes",
287
+            "$plugin_path/includes/data-stores",
288
+            "$plugin_path/includes/gateways",
289
+            "$plugin_path/includes/payments",
290
+            "$plugin_path/includes/geolocation",
291
+            "$plugin_path/includes/reports",
292
+            "$plugin_path/includes/api",
293
+            "$plugin_path/includes/admin",
294
+            "$plugin_path/includes/admin/meta-boxes",
295
+        );
296
+
297
+        foreach ( apply_filters( 'getpaid_autoload_locations', $locations ) as $location ) {
298
+
299
+            if ( file_exists( trailingslashit( $location ) . $file_name ) ) {
300
+                include trailingslashit( $location ) . $file_name;
301
+                break;
302
+            }
303 303
 }
304 304
 
305
-	}
306
-
307
-	/**
308
-	 * Inits hooks etc.
309
-	 */
310
-	public function init() {
311
-
312
-		// Fires before getpaid inits.
313
-		do_action( 'before_getpaid_init', $this );
314
-
315
-		// Maybe upgrade.
316
-		$this->maybe_upgrade_database();
317
-
318
-		// Load default gateways.
319
-		$gateways = apply_filters(
320
-			'getpaid_default_gateways',
321
-			array(
322
-				'manual'        => 'GetPaid_Manual_Gateway',
323
-				'paypal'        => 'GetPaid_Paypal_Gateway',
324
-				'worldpay'      => 'GetPaid_Worldpay_Gateway',
325
-				'bank_transfer' => 'GetPaid_Bank_Transfer_Gateway',
326
-				'authorizenet'  => 'GetPaid_Authorize_Net_Gateway',
327
-			)
328
-		);
329
-
330
-		foreach ( $gateways as $id => $class ) {
331
-			$this->gateways[ $id ] = new $class();
332
-		}
333
-
334
-		if ( 'yes' != get_option( 'wpinv_renamed_gateways' ) ) {
335
-			GetPaid_Installer::rename_gateways_label();
336
-			update_option( 'wpinv_renamed_gateways', 'yes' );
337
-		}
338
-
339
-		// Fires after getpaid inits.
340
-		do_action( 'getpaid_init', $this );
341
-
342
-	}
343
-
344
-	/**
345
-	 * Checks if this is an IPN request and processes it.
346
-	 */
347
-	public function maybe_process_ipn() {
348
-
349
-		// Ensure that this is an IPN request.
350
-		if ( empty( $_GET['wpi-listener'] ) || 'IPN' !== $_GET['wpi-listener'] || empty( $_GET['wpi-gateway'] ) ) {
351
-			return;
352
-		}
353
-
354
-		$gateway = sanitize_text_field( $_GET['wpi-gateway'] );
355
-
356
-		do_action( 'wpinv_verify_payment_ipn', $gateway );
357
-		do_action( "wpinv_verify_{$gateway}_ipn" );
358
-		exit;
359
-
360
-	}
361
-
362
-	public function enqueue_scripts() {
363
-
364
-		// Fires before adding scripts.
365
-		do_action( 'getpaid_enqueue_scripts' );
366
-
367
-		$localize                         = array();
368
-		$localize['ajax_url']             = admin_url( 'admin-ajax.php' );
369
-		$localize['thousands']            = wpinv_thousands_separator();
370
-		$localize['decimals']             = wpinv_decimal_separator();
371
-		$localize['nonce']                = wp_create_nonce( 'wpinv-nonce' );
372
-		$localize['txtComplete']          = __( 'Continue', 'invoicing' );
373
-		$localize['UseTaxes']             = wpinv_use_taxes();
374
-		$localize['formNonce']            = wp_create_nonce( 'getpaid_form_nonce' );
375
-		$localize['loading']              = __( 'Loading...', 'invoicing' );
376
-		$localize['connectionError']      = __( 'Could not establish a connection to the server.', 'invoicing' );
377
-		$localize['recaptchaSettings']    = getpaid_get_recaptcha_settings();
378
-
379
-		$localize = apply_filters( 'wpinv_front_js_localize', $localize );
380
-
381
-		// reCaptcha.
382
-		if ( getpaid_is_recaptcha_enabled() && ( $recaptcha_js = getpaid_recaptcha_api_url() ) ) {
383
-			wp_enqueue_script( 'recaptcha', $recaptcha_js, array(), null, true ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
384
-		}
385
-
386
-		$version = filemtime( WPINV_PLUGIN_DIR . 'assets/js/payment-forms.js' );
387
-		wp_enqueue_script( 'wpinv-front-script', WPINV_PLUGIN_URL . 'assets/js/payment-forms.js', array( 'jquery' ), $version, true );
388
-		wp_localize_script( 'wpinv-front-script', 'WPInv', $localize );
389
-	}
390
-
391
-	public function wpinv_actions() {
392
-		if ( isset( $_REQUEST['wpi_action'] ) ) {
393
-			do_action( 'wpinv_' . wpinv_sanitize_key( $_REQUEST['wpi_action'] ), $_REQUEST );
394
-		}
395
-
396
-		if ( defined( 'WP_ALL_IMPORT_ROOT_DIR' ) ) {
397
-			include plugin_dir_path( __FILE__ ) . 'libraries/wp-all-import/class-getpaid-wp-all-import.php';
398
-		}
399
-	}
400
-
401
-	/**
305
+    }
306
+
307
+    /**
308
+     * Inits hooks etc.
309
+     */
310
+    public function init() {
311
+
312
+        // Fires before getpaid inits.
313
+        do_action( 'before_getpaid_init', $this );
314
+
315
+        // Maybe upgrade.
316
+        $this->maybe_upgrade_database();
317
+
318
+        // Load default gateways.
319
+        $gateways = apply_filters(
320
+            'getpaid_default_gateways',
321
+            array(
322
+                'manual'        => 'GetPaid_Manual_Gateway',
323
+                'paypal'        => 'GetPaid_Paypal_Gateway',
324
+                'worldpay'      => 'GetPaid_Worldpay_Gateway',
325
+                'bank_transfer' => 'GetPaid_Bank_Transfer_Gateway',
326
+                'authorizenet'  => 'GetPaid_Authorize_Net_Gateway',
327
+            )
328
+        );
329
+
330
+        foreach ( $gateways as $id => $class ) {
331
+            $this->gateways[ $id ] = new $class();
332
+        }
333
+
334
+        if ( 'yes' != get_option( 'wpinv_renamed_gateways' ) ) {
335
+            GetPaid_Installer::rename_gateways_label();
336
+            update_option( 'wpinv_renamed_gateways', 'yes' );
337
+        }
338
+
339
+        // Fires after getpaid inits.
340
+        do_action( 'getpaid_init', $this );
341
+
342
+    }
343
+
344
+    /**
345
+     * Checks if this is an IPN request and processes it.
346
+     */
347
+    public function maybe_process_ipn() {
348
+
349
+        // Ensure that this is an IPN request.
350
+        if ( empty( $_GET['wpi-listener'] ) || 'IPN' !== $_GET['wpi-listener'] || empty( $_GET['wpi-gateway'] ) ) {
351
+            return;
352
+        }
353
+
354
+        $gateway = sanitize_text_field( $_GET['wpi-gateway'] );
355
+
356
+        do_action( 'wpinv_verify_payment_ipn', $gateway );
357
+        do_action( "wpinv_verify_{$gateway}_ipn" );
358
+        exit;
359
+
360
+    }
361
+
362
+    public function enqueue_scripts() {
363
+
364
+        // Fires before adding scripts.
365
+        do_action( 'getpaid_enqueue_scripts' );
366
+
367
+        $localize                         = array();
368
+        $localize['ajax_url']             = admin_url( 'admin-ajax.php' );
369
+        $localize['thousands']            = wpinv_thousands_separator();
370
+        $localize['decimals']             = wpinv_decimal_separator();
371
+        $localize['nonce']                = wp_create_nonce( 'wpinv-nonce' );
372
+        $localize['txtComplete']          = __( 'Continue', 'invoicing' );
373
+        $localize['UseTaxes']             = wpinv_use_taxes();
374
+        $localize['formNonce']            = wp_create_nonce( 'getpaid_form_nonce' );
375
+        $localize['loading']              = __( 'Loading...', 'invoicing' );
376
+        $localize['connectionError']      = __( 'Could not establish a connection to the server.', 'invoicing' );
377
+        $localize['recaptchaSettings']    = getpaid_get_recaptcha_settings();
378
+
379
+        $localize = apply_filters( 'wpinv_front_js_localize', $localize );
380
+
381
+        // reCaptcha.
382
+        if ( getpaid_is_recaptcha_enabled() && ( $recaptcha_js = getpaid_recaptcha_api_url() ) ) {
383
+            wp_enqueue_script( 'recaptcha', $recaptcha_js, array(), null, true ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
384
+        }
385
+
386
+        $version = filemtime( WPINV_PLUGIN_DIR . 'assets/js/payment-forms.js' );
387
+        wp_enqueue_script( 'wpinv-front-script', WPINV_PLUGIN_URL . 'assets/js/payment-forms.js', array( 'jquery' ), $version, true );
388
+        wp_localize_script( 'wpinv-front-script', 'WPInv', $localize );
389
+    }
390
+
391
+    public function wpinv_actions() {
392
+        if ( isset( $_REQUEST['wpi_action'] ) ) {
393
+            do_action( 'wpinv_' . wpinv_sanitize_key( $_REQUEST['wpi_action'] ), $_REQUEST );
394
+        }
395
+
396
+        if ( defined( 'WP_ALL_IMPORT_ROOT_DIR' ) ) {
397
+            include plugin_dir_path( __FILE__ ) . 'libraries/wp-all-import/class-getpaid-wp-all-import.php';
398
+        }
399
+    }
400
+
401
+    /**
402 402
      * Fires an action after verifying that a user can fire them.
403
-	 *
404
-	 * Note: If the action is on an invoice, subscription etc, esure that the
405
-	 * current user owns the invoice/subscription.
403
+     *
404
+     * Note: If the action is on an invoice, subscription etc, esure that the
405
+     * current user owns the invoice/subscription.
406 406
      */
407 407
     public function maybe_do_authenticated_action() {
408 408
 
409
-		if ( isset( $_REQUEST['getpaid-action'] ) && isset( $_REQUEST['getpaid-nonce'] ) && wp_verify_nonce( $_REQUEST['getpaid-nonce'], 'getpaid-nonce' ) ) {
409
+        if ( isset( $_REQUEST['getpaid-action'] ) && isset( $_REQUEST['getpaid-nonce'] ) && wp_verify_nonce( $_REQUEST['getpaid-nonce'], 'getpaid-nonce' ) ) {
410 410
 
411
-			$key  = sanitize_key( $_REQUEST['getpaid-action'] );
412
-			$data = wp_unslash( $_REQUEST );
413
-			if ( is_user_logged_in() ) {
414
-				do_action( "getpaid_authenticated_action_$key", $data );
415
-			}
411
+            $key  = sanitize_key( $_REQUEST['getpaid-action'] );
412
+            $data = wp_unslash( $_REQUEST );
413
+            if ( is_user_logged_in() ) {
414
+                do_action( "getpaid_authenticated_action_$key", $data );
415
+            }
416 416
 
417
-			do_action( "getpaid_unauthenticated_action_$key", $data );
417
+            do_action( "getpaid_unauthenticated_action_$key", $data );
418
+
419
+        }
418 420
 
419
-		}
421
+    }
422
+
423
+    public function pre_get_posts( $wp_query ) {
424
+
425
+        if ( ! is_admin() && ! empty( $wp_query->query_vars['post_type'] ) && getpaid_is_invoice_post_type( $wp_query->query_vars['post_type'] ) && is_user_logged_in() && is_single() && $wp_query->is_main_query() ) {
426
+            $wp_query->query_vars['post_status'] = array_keys( wpinv_get_invoice_statuses( false, false, $wp_query->query_vars['post_type'] ) );
427
+        }
420 428
 
429
+        return $wp_query;
421 430
     }
422 431
 
423
-	public function pre_get_posts( $wp_query ) {
424
-
425
-		if ( ! is_admin() && ! empty( $wp_query->query_vars['post_type'] ) && getpaid_is_invoice_post_type( $wp_query->query_vars['post_type'] ) && is_user_logged_in() && is_single() && $wp_query->is_main_query() ) {
426
-			$wp_query->query_vars['post_status'] = array_keys( wpinv_get_invoice_statuses( false, false, $wp_query->query_vars['post_type'] ) );
427
-		}
428
-
429
-		return $wp_query;
430
-	}
431
-
432
-	/**
433
-	 * Register widgets
434
-	 *
435
-	 */
436
-	public function register_widgets() {
437
-		global $pagenow;
438
-
439
-		// Currently, UX Builder does not work particulaly well with SuperDuper.
440
-		// So we disable our widgets when editing a page with UX Builder.
441
-		if ( function_exists( 'ux_builder_is_active' ) && ux_builder_is_active() ) {
442
-			return;
443
-		}
444
-
445
-		$block_widget_init_screens = function_exists( 'sd_pagenow_exclude' ) ? sd_pagenow_exclude() : array();
446
-
447
-		if ( is_admin() && $pagenow && in_array( $pagenow, $block_widget_init_screens ) ) {
448
-			// don't initiate in these conditions.
449
-		} else {
450
-
451
-			// Only load allowed widgets.
452
-			$exclude = function_exists( 'sd_widget_exclude' ) ? sd_widget_exclude() : array();
453
-			$widgets = apply_filters(
454
-				'getpaid_widget_classes',
455
-				array(
456
-					'WPInv_Checkout_Widget',
457
-					'WPInv_History_Widget',
458
-					'WPInv_Receipt_Widget',
459
-					'WPInv_Subscriptions_Widget',
460
-					'WPInv_Buy_Item_Widget',
461
-					'WPInv_Messages_Widget',
462
-					'WPInv_GetPaid_Widget',
463
-					'WPInv_Invoice_Widget',
464
-				)
465
-			);
466
-
467
-			// For each widget...
468
-			foreach ( $widgets as $widget ) {
469
-
470
-				// Abort early if it is excluded for this page.
471
-				if ( in_array( $widget, $exclude ) ) {
472
-					continue;
473
-				}
474
-
475
-				// SD V1 used to extend the widget class. V2 does not, so we cannot call register widget on it.
476
-				if ( is_subclass_of( $widget, 'WP_Widget' ) ) {
477
-					register_widget( $widget );
478
-				} else {
479
-					new $widget();
480
-				}
432
+    /**
433
+     * Register widgets
434
+     *
435
+     */
436
+    public function register_widgets() {
437
+        global $pagenow;
438
+
439
+        // Currently, UX Builder does not work particulaly well with SuperDuper.
440
+        // So we disable our widgets when editing a page with UX Builder.
441
+        if ( function_exists( 'ux_builder_is_active' ) && ux_builder_is_active() ) {
442
+            return;
443
+        }
444
+
445
+        $block_widget_init_screens = function_exists( 'sd_pagenow_exclude' ) ? sd_pagenow_exclude() : array();
446
+
447
+        if ( is_admin() && $pagenow && in_array( $pagenow, $block_widget_init_screens ) ) {
448
+            // don't initiate in these conditions.
449
+        } else {
450
+
451
+            // Only load allowed widgets.
452
+            $exclude = function_exists( 'sd_widget_exclude' ) ? sd_widget_exclude() : array();
453
+            $widgets = apply_filters(
454
+                'getpaid_widget_classes',
455
+                array(
456
+                    'WPInv_Checkout_Widget',
457
+                    'WPInv_History_Widget',
458
+                    'WPInv_Receipt_Widget',
459
+                    'WPInv_Subscriptions_Widget',
460
+                    'WPInv_Buy_Item_Widget',
461
+                    'WPInv_Messages_Widget',
462
+                    'WPInv_GetPaid_Widget',
463
+                    'WPInv_Invoice_Widget',
464
+                )
465
+            );
466
+
467
+            // For each widget...
468
+            foreach ( $widgets as $widget ) {
469
+
470
+                // Abort early if it is excluded for this page.
471
+                if ( in_array( $widget, $exclude ) ) {
472
+                    continue;
473
+                }
474
+
475
+                // SD V1 used to extend the widget class. V2 does not, so we cannot call register widget on it.
476
+                if ( is_subclass_of( $widget, 'WP_Widget' ) ) {
477
+                    register_widget( $widget );
478
+                } else {
479
+                    new $widget();
480
+                }
481 481
 }
482 482
 }
483 483
 
484
-	}
484
+    }
485
+
486
+    /**
487
+     * Upgrades the database.
488
+     *
489
+     * @since 2.0.2
490
+     */
491
+    public function maybe_upgrade_database() {
492
+
493
+        // Ensure the database tables are up to date.
494
+        GetPaid_Installer::maybe_create_db_tables();
495
+
496
+        $wpi_version = get_option( 'wpinv_version', 0 );
497
+
498
+        if ( $wpi_version == WPINV_VERSION ) {
499
+            return;
500
+        }
501
+
502
+        $installer = new GetPaid_Installer();
503
+
504
+        if ( empty( $wpi_version ) ) {
505
+            return $installer->upgrade_db( 0 );
506
+        }
507
+
508
+        $upgrades  = array(
509
+            '0.0.5' => '004',
510
+            '1.0.3' => '102',
511
+            '2.0.0' => '118',
512
+            '2.8.0' => '279',
513
+        );
514
+
515
+        foreach ( $upgrades as $key => $method ) {
485 516
 
486
-	/**
487
-	 * Upgrades the database.
488
-	 *
489
-	 * @since 2.0.2
490
-	 */
491
-	public function maybe_upgrade_database() {
517
+            if ( version_compare( $wpi_version, $key, '<' ) ) {
518
+                return $installer->upgrade_db( $method );
519
+            }
520
+        }
521
+
522
+    }
523
+
524
+    /**
525
+     * Flushes the permalinks if needed.
526
+     *
527
+     * @since 2.0.8
528
+     */
529
+    public function maybe_flush_permalinks() {
492 530
 
493
-		// Ensure the database tables are up to date.
494
-		GetPaid_Installer::maybe_create_db_tables();
531
+        $flush = get_option( 'wpinv_flush_permalinks', 0 );
495 532
 
496
-		$wpi_version = get_option( 'wpinv_version', 0 );
533
+        if ( ! empty( $flush ) ) {
534
+            flush_rewrite_rules();
535
+            delete_option( 'wpinv_flush_permalinks' );
536
+        }
497 537
 
498
-		if ( $wpi_version == WPINV_VERSION ) {
499
-			return;
500
-		}
538
+    }
501 539
 
502
-		$installer = new GetPaid_Installer();
540
+    /**
541
+     * Remove our pages from yoast sitemaps.
542
+     *
543
+     * @since 1.0.19
544
+     * @param int[] $excluded_posts_ids
545
+     */
546
+    public function wpseo_exclude_from_sitemap_by_post_ids( $excluded_posts_ids ) {
547
+
548
+        // Ensure that we have an array.
549
+        if ( ! is_array( $excluded_posts_ids ) ) {
550
+            $excluded_posts_ids = array();
551
+        }
503 552
 
504
-		if ( empty( $wpi_version ) ) {
505
-			return $installer->upgrade_db( 0 );
506
-		}
553
+        // Prepare our pages.
554
+        $our_pages = array();
555
+
556
+        // Checkout page.
557
+        $our_pages[] = wpinv_get_option( 'checkout_page', false );
558
+
559
+        // Success page.
560
+        $our_pages[] = wpinv_get_option( 'success_page', false );
561
+
562
+        // Failure page.
563
+        $our_pages[] = wpinv_get_option( 'failure_page', false );
564
+
565
+        // History page.
566
+        $our_pages[] = wpinv_get_option( 'invoice_history_page', false );
567
+
568
+        // Subscriptions page.
569
+        $our_pages[] = wpinv_get_option( 'invoice_subscription_page', false );
570
+
571
+        $our_pages   = array_map( 'intval', array_filter( $our_pages ) );
572
+
573
+        $excluded_posts_ids = $excluded_posts_ids + $our_pages;
574
+        return array_unique( $excluded_posts_ids );
575
+
576
+    }
507 577
 
508
-		$upgrades  = array(
509
-			'0.0.5' => '004',
510
-			'1.0.3' => '102',
511
-			'2.0.0' => '118',
512
-			'2.8.0' => '279',
513
-		);
514
-
515
-		foreach ( $upgrades as $key => $method ) {
516
-
517
-			if ( version_compare( $wpi_version, $key, '<' ) ) {
518
-				return $installer->upgrade_db( $method );
519
-			}
520
-		}
521
-
522
-	}
523
-
524
-	/**
525
-	 * Flushes the permalinks if needed.
526
-	 *
527
-	 * @since 2.0.8
528
-	 */
529
-	public function maybe_flush_permalinks() {
530
-
531
-		$flush = get_option( 'wpinv_flush_permalinks', 0 );
532
-
533
-		if ( ! empty( $flush ) ) {
534
-			flush_rewrite_rules();
535
-			delete_option( 'wpinv_flush_permalinks' );
536
-		}
537
-
538
-	}
539
-
540
-	/**
541
-	 * Remove our pages from yoast sitemaps.
542
-	 *
543
-	 * @since 1.0.19
544
-	 * @param int[] $excluded_posts_ids
545
-	 */
546
-	public function wpseo_exclude_from_sitemap_by_post_ids( $excluded_posts_ids ) {
547
-
548
-		// Ensure that we have an array.
549
-		if ( ! is_array( $excluded_posts_ids ) ) {
550
-			$excluded_posts_ids = array();
551
-		}
552
-
553
-		// Prepare our pages.
554
-		$our_pages = array();
555
-
556
-		// Checkout page.
557
-		$our_pages[] = wpinv_get_option( 'checkout_page', false );
558
-
559
-		// Success page.
560
-		$our_pages[] = wpinv_get_option( 'success_page', false );
561
-
562
-		// Failure page.
563
-		$our_pages[] = wpinv_get_option( 'failure_page', false );
564
-
565
-		// History page.
566
-		$our_pages[] = wpinv_get_option( 'invoice_history_page', false );
567
-
568
-		// Subscriptions page.
569
-		$our_pages[] = wpinv_get_option( 'invoice_subscription_page', false );
570
-
571
-		$our_pages   = array_map( 'intval', array_filter( $our_pages ) );
572
-
573
-		$excluded_posts_ids = $excluded_posts_ids + $our_pages;
574
-		return array_unique( $excluded_posts_ids );
575
-
576
-	}
577
-
578
-	/**
579
-	 * Remove our pages from yoast sitemaps.
580
-	 *
581
-	 * @since 1.0.19
582
-	 * @param string[] $post_types
583
-	 */
584
-	public function exclude_invoicing_post_types( $post_types ) {
585
-
586
-		// Ensure that we have an array.
587
-		if ( ! is_array( $post_types ) ) {
588
-			$post_types = array();
589
-		}
590
-
591
-		// Remove our post types.
592
-		return array_diff( $post_types, array_keys( getpaid_get_invoice_post_types() ) );
593
-	}
594
-
595
-	/**
596
-	 * Displays additional footer code.
597
-	 *
598
-	 * @since 2.0.0
599
-	 */
600
-	public function wp_footer() {
601
-		wpinv_get_template( 'frontend-footer.php' );
602
-	}
603
-
604
-	/**
605
-	 * Displays additional header code.
606
-	 *
607
-	 * @since 2.0.0
608
-	 */
609
-	public function wp_head() {
610
-		wpinv_get_template( 'frontend-head.php' );
611
-	}
612
-
613
-	/**
614
-	 * Custom query vars.
615
-	 *
616
-	 */
617
-	public function custom_query_vars( $vars ) {
578
+    /**
579
+     * Remove our pages from yoast sitemaps.
580
+     *
581
+     * @since 1.0.19
582
+     * @param string[] $post_types
583
+     */
584
+    public function exclude_invoicing_post_types( $post_types ) {
585
+
586
+        // Ensure that we have an array.
587
+        if ( ! is_array( $post_types ) ) {
588
+            $post_types = array();
589
+        }
590
+
591
+        // Remove our post types.
592
+        return array_diff( $post_types, array_keys( getpaid_get_invoice_post_types() ) );
593
+    }
594
+
595
+    /**
596
+     * Displays additional footer code.
597
+     *
598
+     * @since 2.0.0
599
+     */
600
+    public function wp_footer() {
601
+        wpinv_get_template( 'frontend-footer.php' );
602
+    }
603
+
604
+    /**
605
+     * Displays additional header code.
606
+     *
607
+     * @since 2.0.0
608
+     */
609
+    public function wp_head() {
610
+        wpinv_get_template( 'frontend-head.php' );
611
+    }
612
+
613
+    /**
614
+     * Custom query vars.
615
+     *
616
+     */
617
+    public function custom_query_vars( $vars ) {
618 618
         $vars[] = 'getpaid-ipn';
619 619
         return $vars;
620
-	}
620
+    }
621 621
 
622
-	/**
623
-	 * Add rewrite tags and rules.
624
-	 *
625
-	 */
626
-	public function add_rewrite_rule() {
622
+    /**
623
+     * Add rewrite tags and rules.
624
+     *
625
+     */
626
+    public function add_rewrite_rule() {
627 627
         $tag = 'getpaid-ipn';
628 628
         add_rewrite_tag( "%$tag%", '([^&]+)' );
629 629
         add_rewrite_rule( "^$tag/([^/]*)/?", "index.php?$tag=\$matches[1]", 'top' );
630
-	}
630
+    }
631 631
 
632
-	/**
633
-	 * Processes non-query string ipns.
634
-	 *
635
-	 */
636
-	public function maybe_process_new_ipn( $query ) {
632
+    /**
633
+     * Processes non-query string ipns.
634
+     *
635
+     */
636
+    public function maybe_process_new_ipn( $query ) {
637 637
 
638 638
         if ( is_admin() || ! $query->is_main_query() ) {
639 639
             return;
640 640
         }
641 641
 
642
-		$gateway = get_query_var( 'getpaid-ipn' );
642
+        $gateway = get_query_var( 'getpaid-ipn' );
643 643
 
644 644
         if ( ! empty( $gateway ) ) {
645 645
 
646
-			$gateway = sanitize_text_field( $gateway );
647
-			nocache_headers();
648
-			do_action( 'wpinv_verify_payment_ipn', $gateway );
649
-			do_action( "wpinv_verify_{$gateway}_ipn" );
650
-			exit;
646
+            $gateway = sanitize_text_field( $gateway );
647
+            nocache_headers();
648
+            do_action( 'wpinv_verify_payment_ipn', $gateway );
649
+            do_action( "wpinv_verify_{$gateway}_ipn" );
650
+            exit;
651 651
 
652 652
         }
653 653
 
654
-	}
654
+    }
655 655
 
656 656
 }
Please login to merge, or discard this patch.
Spacing   +136 added lines, -136 removed lines patch added patch discarded remove patch
@@ -6,7 +6,7 @@  discard block
 block discarded – undo
6 6
  * @since   1.0.0
7 7
  */
8 8
 
9
-defined( 'ABSPATH' ) || exit;
9
+defined('ABSPATH') || exit;
10 10
 
11 11
 /**
12 12
  * Main Invoicing class.
@@ -56,8 +56,8 @@  discard block
 block discarded – undo
56 56
 	 * @param string $prop The prop to set.
57 57
 	 * @param mixed $value The value to retrieve.
58 58
 	 */
59
-	public function set( $prop, $value ) {
60
-		$this->data[ $prop ] = $value;
59
+	public function set($prop, $value) {
60
+		$this->data[$prop] = $value;
61 61
 	}
62 62
 
63 63
 	/**
@@ -66,10 +66,10 @@  discard block
 block discarded – undo
66 66
 	 * @param string $prop The prop to set.
67 67
 	 * @return mixed The value.
68 68
 	 */
69
-	public function get( $prop ) {
69
+	public function get($prop) {
70 70
 
71
-		if ( isset( $this->data[ $prop ] ) ) {
72
-			return $this->data[ $prop ];
71
+		if (isset($this->data[$prop])) {
72
+			return $this->data[$prop];
73 73
 		}
74 74
 
75 75
 		return null;
@@ -81,22 +81,22 @@  discard block
 block discarded – undo
81 81
 	public function set_properties() {
82 82
 
83 83
 		// Sessions.
84
-		$this->set( 'session', new WPInv_Session_Handler() );
85
-		$GLOBALS['wpi_session'] = $this->get( 'session' ); // Backwards compatibility.
84
+		$this->set('session', new WPInv_Session_Handler());
85
+		$GLOBALS['wpi_session'] = $this->get('session'); // Backwards compatibility.
86 86
 		$GLOBALS['wpinv_euvat'] = new WPInv_EUVat(); // Backwards compatibility.
87 87
 
88 88
 		// Init other objects.
89
-		$this->set( 'notes', new WPInv_Notes() );
90
-		$this->set( 'api', new WPInv_API() );
91
-		$this->set( 'post_types', new GetPaid_Post_Types() );
92
-		$this->set( 'template', new GetPaid_Template() );
93
-		$this->set( 'admin', new GetPaid_Admin() );
94
-		$this->set( 'subscriptions', new WPInv_Subscriptions() );
95
-		$this->set( 'invoice_emails', new GetPaid_Invoice_Notification_Emails() );
96
-		$this->set( 'subscription_emails', new GetPaid_Subscription_Notification_Emails() );
97
-		$this->set( 'daily_maintenace', new GetPaid_Daily_Maintenance() );
98
-		$this->set( 'payment_forms', new GetPaid_Payment_Forms() );
99
-		$this->set( 'maxmind', new GetPaid_MaxMind_Geolocation() );
89
+		$this->set('notes', new WPInv_Notes());
90
+		$this->set('api', new WPInv_API());
91
+		$this->set('post_types', new GetPaid_Post_Types());
92
+		$this->set('template', new GetPaid_Template());
93
+		$this->set('admin', new GetPaid_Admin());
94
+		$this->set('subscriptions', new WPInv_Subscriptions());
95
+		$this->set('invoice_emails', new GetPaid_Invoice_Notification_Emails());
96
+		$this->set('subscription_emails', new GetPaid_Subscription_Notification_Emails());
97
+		$this->set('daily_maintenace', new GetPaid_Daily_Maintenance());
98
+		$this->set('payment_forms', new GetPaid_Payment_Forms());
99
+		$this->set('maxmind', new GetPaid_MaxMind_Geolocation());
100 100
 
101 101
 	}
102 102
 
@@ -104,8 +104,8 @@  discard block
 block discarded – undo
104 104
 	 * Define plugin constants.
105 105
 	 */
106 106
 	public function define_constants() {
107
-		define( 'WPINV_PLUGIN_DIR', plugin_dir_path( WPINV_PLUGIN_FILE ) );
108
-		define( 'WPINV_PLUGIN_URL', plugin_dir_url( WPINV_PLUGIN_FILE ) );
107
+		define('WPINV_PLUGIN_DIR', plugin_dir_path(WPINV_PLUGIN_FILE));
108
+		define('WPINV_PLUGIN_URL', plugin_dir_url(WPINV_PLUGIN_FILE));
109 109
 		$this->version = WPINV_VERSION;
110 110
 	}
111 111
 
@@ -116,28 +116,28 @@  discard block
 block discarded – undo
116 116
 	 */
117 117
 	protected function init_hooks() {
118 118
 		/* Internationalize the text strings used. */
119
-		add_action( 'plugins_loaded', array( &$this, 'plugins_loaded' ) );
119
+		add_action('plugins_loaded', array(&$this, 'plugins_loaded'));
120 120
 
121 121
 		// Init the plugin after WordPress inits.
122
-		add_action( 'init', array( $this, 'init' ), 1 );
123
-		add_action( 'init', array( $this, 'maybe_process_ipn' ), 10 );
124
-		add_action( 'init', array( $this, 'wpinv_actions' ) );
125
-		add_action( 'init', array( $this, 'maybe_do_authenticated_action' ), 100 );
126
-		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 11 );
127
-		add_action( 'wp_footer', array( $this, 'wp_footer' ) );
128
-		add_action( 'wp_head', array( $this, 'wp_head' ) );
129
-		add_action( 'widgets_init', array( $this, 'register_widgets' ) );
130
-		add_filter( 'wpseo_exclude_from_sitemap_by_post_ids', array( $this, 'wpseo_exclude_from_sitemap_by_post_ids' ) );
131
-		add_filter( 'the_seo_framework_sitemap_supported_post_types', array( $this, 'exclude_invoicing_post_types' ) );
132
-		add_filter( 'pre_get_posts', array( &$this, 'pre_get_posts' ) );
133
-
134
-		add_filter( 'query_vars', array( $this, 'custom_query_vars' ) );
135
-        add_action( 'init', array( $this, 'add_rewrite_rule' ), 10, 0 );
136
-		add_action( 'pre_get_posts', array( $this, 'maybe_process_new_ipn' ), 1 );
122
+		add_action('init', array($this, 'init'), 1);
123
+		add_action('init', array($this, 'maybe_process_ipn'), 10);
124
+		add_action('init', array($this, 'wpinv_actions'));
125
+		add_action('init', array($this, 'maybe_do_authenticated_action'), 100);
126
+		add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'), 11);
127
+		add_action('wp_footer', array($this, 'wp_footer'));
128
+		add_action('wp_head', array($this, 'wp_head'));
129
+		add_action('widgets_init', array($this, 'register_widgets'));
130
+		add_filter('wpseo_exclude_from_sitemap_by_post_ids', array($this, 'wpseo_exclude_from_sitemap_by_post_ids'));
131
+		add_filter('the_seo_framework_sitemap_supported_post_types', array($this, 'exclude_invoicing_post_types'));
132
+		add_filter('pre_get_posts', array(&$this, 'pre_get_posts'));
133
+
134
+		add_filter('query_vars', array($this, 'custom_query_vars'));
135
+        add_action('init', array($this, 'add_rewrite_rule'), 10, 0);
136
+		add_action('pre_get_posts', array($this, 'maybe_process_new_ipn'), 1);
137 137
 
138 138
 		// Fires after registering actions.
139
-		do_action( 'wpinv_actions', $this );
140
-		do_action( 'getpaid_actions', $this );
139
+		do_action('wpinv_actions', $this);
140
+		do_action('getpaid_actions', $this);
141 141
 
142 142
 	}
143 143
 
@@ -145,10 +145,10 @@  discard block
 block discarded – undo
145 145
 		/* Internationalize the text strings used. */
146 146
 		$this->load_textdomain();
147 147
 
148
-		do_action( 'wpinv_loaded' );
148
+		do_action('wpinv_loaded');
149 149
 
150 150
 		// Fix oxygen page builder conflict
151
-		if ( function_exists( 'ct_css_output' ) ) {
151
+		if (function_exists('ct_css_output')) {
152 152
 			wpinv_oxygen_fix_conflict();
153 153
 		}
154 154
 	}
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 		load_plugin_textdomain(
170 170
 			'invoicing',
171 171
 			false,
172
-			plugin_basename( dirname( WPINV_PLUGIN_FILE ) ) . '/languages/'
172
+			plugin_basename(dirname(WPINV_PLUGIN_FILE)) . '/languages/'
173 173
 		);
174 174
 
175 175
 	}
@@ -205,9 +205,9 @@  discard block
 block discarded – undo
205 205
 
206 206
 		// Register autoloader.
207 207
 		try {
208
-			spl_autoload_register( array( $this, 'autoload' ), true );
209
-		} catch ( Exception $e ) {
210
-			wpinv_error_log( $e->getMessage(), '', __FILE__, 149, true );
208
+			spl_autoload_register(array($this, 'autoload'), true);
209
+		} catch (Exception $e) {
210
+			wpinv_error_log($e->getMessage(), '', __FILE__, 149, true);
211 211
 		}
212 212
 
213 213
 		require_once WPINV_PLUGIN_DIR . 'includes/abstracts/abstract-wpinv-session.php';
@@ -233,7 +233,7 @@  discard block
 block discarded – undo
233 233
 		require_once WPINV_PLUGIN_DIR . 'widgets/invoice.php';
234 234
 		require_once WPINV_PLUGIN_DIR . 'includes/admin/admin-pages.php';
235 235
 
236
-		if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
236
+		if (is_admin() || (defined('WP_CLI') && WP_CLI)) {
237 237
 			GetPaid_Post_Types_Admin::init();
238 238
 
239 239
 			require_once WPINV_PLUGIN_DIR . 'includes/admin/wpinv-admin-functions.php';
@@ -244,15 +244,15 @@  discard block
 block discarded – undo
244 244
 			require_once WPINV_PLUGIN_DIR . 'includes/admin/class-getpaid-admin-profile.php';
245 245
 			// load the user class only on the users.php page
246 246
 			global $pagenow;
247
-			if ( $pagenow == 'users.php' ) {
247
+			if ($pagenow == 'users.php') {
248 248
 				new WPInv_Admin_Users();
249 249
 			}
250 250
 		}
251 251
 
252 252
 		// Register cli commands
253
-		if ( defined( 'WP_CLI' ) && WP_CLI ) {
253
+		if (defined('WP_CLI') && WP_CLI) {
254 254
 			require_once WPINV_PLUGIN_DIR . 'includes/class-wpinv-cli.php';
255
-			WP_CLI::add_command( 'invoicing', 'WPInv_CLI' );
255
+			WP_CLI::add_command('invoicing', 'WPInv_CLI');
256 256
 		}
257 257
 
258 258
 	}
@@ -265,21 +265,21 @@  discard block
 block discarded – undo
265 265
 	 * @since       1.0.19
266 266
 	 * @return      void
267 267
 	 */
268
-	public function autoload( $class_name ) {
268
+	public function autoload($class_name) {
269 269
 
270 270
 		// Normalize the class name...
271
-		$class_name  = strtolower( $class_name );
271
+		$class_name = strtolower($class_name);
272 272
 
273 273
 		// ... and make sure it is our class.
274
-		if ( false === strpos( $class_name, 'getpaid_' ) && false === strpos( $class_name, 'wpinv_' ) ) {
274
+		if (false === strpos($class_name, 'getpaid_') && false === strpos($class_name, 'wpinv_')) {
275 275
 			return;
276 276
 		}
277 277
 
278 278
 		// Next, prepare the file name from the class.
279
-		$file_name = 'class-' . str_replace( '_', '-', $class_name ) . '.php';
279
+		$file_name = 'class-' . str_replace('_', '-', $class_name) . '.php';
280 280
 
281 281
 		// Base path of the classes.
282
-		$plugin_path = untrailingslashit( WPINV_PLUGIN_DIR );
282
+		$plugin_path = untrailingslashit(WPINV_PLUGIN_DIR);
283 283
 
284 284
 		// And an array of possible locations in order of importance.
285 285
 		$locations = array(
@@ -294,10 +294,10 @@  discard block
 block discarded – undo
294 294
 			"$plugin_path/includes/admin/meta-boxes",
295 295
 		);
296 296
 
297
-		foreach ( apply_filters( 'getpaid_autoload_locations', $locations ) as $location ) {
297
+		foreach (apply_filters('getpaid_autoload_locations', $locations) as $location) {
298 298
 
299
-			if ( file_exists( trailingslashit( $location ) . $file_name ) ) {
300
-				include trailingslashit( $location ) . $file_name;
299
+			if (file_exists(trailingslashit($location) . $file_name)) {
300
+				include trailingslashit($location) . $file_name;
301 301
 				break;
302 302
 			}
303 303
 }
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
 	public function init() {
311 311
 
312 312
 		// Fires before getpaid inits.
313
-		do_action( 'before_getpaid_init', $this );
313
+		do_action('before_getpaid_init', $this);
314 314
 
315 315
 		// Maybe upgrade.
316 316
 		$this->maybe_upgrade_database();
@@ -327,17 +327,17 @@  discard block
 block discarded – undo
327 327
 			)
328 328
 		);
329 329
 
330
-		foreach ( $gateways as $id => $class ) {
331
-			$this->gateways[ $id ] = new $class();
330
+		foreach ($gateways as $id => $class) {
331
+			$this->gateways[$id] = new $class();
332 332
 		}
333 333
 
334
-		if ( 'yes' != get_option( 'wpinv_renamed_gateways' ) ) {
334
+		if ('yes' != get_option('wpinv_renamed_gateways')) {
335 335
 			GetPaid_Installer::rename_gateways_label();
336
-			update_option( 'wpinv_renamed_gateways', 'yes' );
336
+			update_option('wpinv_renamed_gateways', 'yes');
337 337
 		}
338 338
 
339 339
 		// Fires after getpaid inits.
340
-		do_action( 'getpaid_init', $this );
340
+		do_action('getpaid_init', $this);
341 341
 
342 342
 	}
343 343
 
@@ -347,14 +347,14 @@  discard block
 block discarded – undo
347 347
 	public function maybe_process_ipn() {
348 348
 
349 349
 		// Ensure that this is an IPN request.
350
-		if ( empty( $_GET['wpi-listener'] ) || 'IPN' !== $_GET['wpi-listener'] || empty( $_GET['wpi-gateway'] ) ) {
350
+		if (empty($_GET['wpi-listener']) || 'IPN' !== $_GET['wpi-listener'] || empty($_GET['wpi-gateway'])) {
351 351
 			return;
352 352
 		}
353 353
 
354
-		$gateway = sanitize_text_field( $_GET['wpi-gateway'] );
354
+		$gateway = sanitize_text_field($_GET['wpi-gateway']);
355 355
 
356
-		do_action( 'wpinv_verify_payment_ipn', $gateway );
357
-		do_action( "wpinv_verify_{$gateway}_ipn" );
356
+		do_action('wpinv_verify_payment_ipn', $gateway);
357
+		do_action("wpinv_verify_{$gateway}_ipn");
358 358
 		exit;
359 359
 
360 360
 	}
@@ -362,39 +362,39 @@  discard block
 block discarded – undo
362 362
 	public function enqueue_scripts() {
363 363
 
364 364
 		// Fires before adding scripts.
365
-		do_action( 'getpaid_enqueue_scripts' );
365
+		do_action('getpaid_enqueue_scripts');
366 366
 
367 367
 		$localize                         = array();
368
-		$localize['ajax_url']             = admin_url( 'admin-ajax.php' );
368
+		$localize['ajax_url']             = admin_url('admin-ajax.php');
369 369
 		$localize['thousands']            = wpinv_thousands_separator();
370 370
 		$localize['decimals']             = wpinv_decimal_separator();
371
-		$localize['nonce']                = wp_create_nonce( 'wpinv-nonce' );
372
-		$localize['txtComplete']          = __( 'Continue', 'invoicing' );
371
+		$localize['nonce']                = wp_create_nonce('wpinv-nonce');
372
+		$localize['txtComplete']          = __('Continue', 'invoicing');
373 373
 		$localize['UseTaxes']             = wpinv_use_taxes();
374
-		$localize['formNonce']            = wp_create_nonce( 'getpaid_form_nonce' );
375
-		$localize['loading']              = __( 'Loading...', 'invoicing' );
376
-		$localize['connectionError']      = __( 'Could not establish a connection to the server.', 'invoicing' );
374
+		$localize['formNonce']            = wp_create_nonce('getpaid_form_nonce');
375
+		$localize['loading']              = __('Loading...', 'invoicing');
376
+		$localize['connectionError']      = __('Could not establish a connection to the server.', 'invoicing');
377 377
 		$localize['recaptchaSettings']    = getpaid_get_recaptcha_settings();
378 378
 
379
-		$localize = apply_filters( 'wpinv_front_js_localize', $localize );
379
+		$localize = apply_filters('wpinv_front_js_localize', $localize);
380 380
 
381 381
 		// reCaptcha.
382
-		if ( getpaid_is_recaptcha_enabled() && ( $recaptcha_js = getpaid_recaptcha_api_url() ) ) {
383
-			wp_enqueue_script( 'recaptcha', $recaptcha_js, array(), null, true ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
382
+		if (getpaid_is_recaptcha_enabled() && ($recaptcha_js = getpaid_recaptcha_api_url())) {
383
+			wp_enqueue_script('recaptcha', $recaptcha_js, array(), null, true); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
384 384
 		}
385 385
 
386
-		$version = filemtime( WPINV_PLUGIN_DIR . 'assets/js/payment-forms.js' );
387
-		wp_enqueue_script( 'wpinv-front-script', WPINV_PLUGIN_URL . 'assets/js/payment-forms.js', array( 'jquery' ), $version, true );
388
-		wp_localize_script( 'wpinv-front-script', 'WPInv', $localize );
386
+		$version = filemtime(WPINV_PLUGIN_DIR . 'assets/js/payment-forms.js');
387
+		wp_enqueue_script('wpinv-front-script', WPINV_PLUGIN_URL . 'assets/js/payment-forms.js', array('jquery'), $version, true);
388
+		wp_localize_script('wpinv-front-script', 'WPInv', $localize);
389 389
 	}
390 390
 
391 391
 	public function wpinv_actions() {
392
-		if ( isset( $_REQUEST['wpi_action'] ) ) {
393
-			do_action( 'wpinv_' . wpinv_sanitize_key( $_REQUEST['wpi_action'] ), $_REQUEST );
392
+		if (isset($_REQUEST['wpi_action'])) {
393
+			do_action('wpinv_' . wpinv_sanitize_key($_REQUEST['wpi_action']), $_REQUEST);
394 394
 		}
395 395
 
396
-		if ( defined( 'WP_ALL_IMPORT_ROOT_DIR' ) ) {
397
-			include plugin_dir_path( __FILE__ ) . 'libraries/wp-all-import/class-getpaid-wp-all-import.php';
396
+		if (defined('WP_ALL_IMPORT_ROOT_DIR')) {
397
+			include plugin_dir_path(__FILE__) . 'libraries/wp-all-import/class-getpaid-wp-all-import.php';
398 398
 		}
399 399
 	}
400 400
 
@@ -406,24 +406,24 @@  discard block
 block discarded – undo
406 406
      */
407 407
     public function maybe_do_authenticated_action() {
408 408
 
409
-		if ( isset( $_REQUEST['getpaid-action'] ) && isset( $_REQUEST['getpaid-nonce'] ) && wp_verify_nonce( $_REQUEST['getpaid-nonce'], 'getpaid-nonce' ) ) {
409
+		if (isset($_REQUEST['getpaid-action']) && isset($_REQUEST['getpaid-nonce']) && wp_verify_nonce($_REQUEST['getpaid-nonce'], 'getpaid-nonce')) {
410 410
 
411
-			$key  = sanitize_key( $_REQUEST['getpaid-action'] );
412
-			$data = wp_unslash( $_REQUEST );
413
-			if ( is_user_logged_in() ) {
414
-				do_action( "getpaid_authenticated_action_$key", $data );
411
+			$key  = sanitize_key($_REQUEST['getpaid-action']);
412
+			$data = wp_unslash($_REQUEST);
413
+			if (is_user_logged_in()) {
414
+				do_action("getpaid_authenticated_action_$key", $data);
415 415
 			}
416 416
 
417
-			do_action( "getpaid_unauthenticated_action_$key", $data );
417
+			do_action("getpaid_unauthenticated_action_$key", $data);
418 418
 
419 419
 		}
420 420
 
421 421
     }
422 422
 
423
-	public function pre_get_posts( $wp_query ) {
423
+	public function pre_get_posts($wp_query) {
424 424
 
425
-		if ( ! is_admin() && ! empty( $wp_query->query_vars['post_type'] ) && getpaid_is_invoice_post_type( $wp_query->query_vars['post_type'] ) && is_user_logged_in() && is_single() && $wp_query->is_main_query() ) {
426
-			$wp_query->query_vars['post_status'] = array_keys( wpinv_get_invoice_statuses( false, false, $wp_query->query_vars['post_type'] ) );
425
+		if (!is_admin() && !empty($wp_query->query_vars['post_type']) && getpaid_is_invoice_post_type($wp_query->query_vars['post_type']) && is_user_logged_in() && is_single() && $wp_query->is_main_query()) {
426
+			$wp_query->query_vars['post_status'] = array_keys(wpinv_get_invoice_statuses(false, false, $wp_query->query_vars['post_type']));
427 427
 		}
428 428
 
429 429
 		return $wp_query;
@@ -438,18 +438,18 @@  discard block
 block discarded – undo
438 438
 
439 439
 		// Currently, UX Builder does not work particulaly well with SuperDuper.
440 440
 		// So we disable our widgets when editing a page with UX Builder.
441
-		if ( function_exists( 'ux_builder_is_active' ) && ux_builder_is_active() ) {
441
+		if (function_exists('ux_builder_is_active') && ux_builder_is_active()) {
442 442
 			return;
443 443
 		}
444 444
 
445
-		$block_widget_init_screens = function_exists( 'sd_pagenow_exclude' ) ? sd_pagenow_exclude() : array();
445
+		$block_widget_init_screens = function_exists('sd_pagenow_exclude') ? sd_pagenow_exclude() : array();
446 446
 
447
-		if ( is_admin() && $pagenow && in_array( $pagenow, $block_widget_init_screens ) ) {
447
+		if (is_admin() && $pagenow && in_array($pagenow, $block_widget_init_screens)) {
448 448
 			// don't initiate in these conditions.
449 449
 		} else {
450 450
 
451 451
 			// Only load allowed widgets.
452
-			$exclude = function_exists( 'sd_widget_exclude' ) ? sd_widget_exclude() : array();
452
+			$exclude = function_exists('sd_widget_exclude') ? sd_widget_exclude() : array();
453 453
 			$widgets = apply_filters(
454 454
 				'getpaid_widget_classes',
455 455
 				array(
@@ -465,16 +465,16 @@  discard block
 block discarded – undo
465 465
 			);
466 466
 
467 467
 			// For each widget...
468
-			foreach ( $widgets as $widget ) {
468
+			foreach ($widgets as $widget) {
469 469
 
470 470
 				// Abort early if it is excluded for this page.
471
-				if ( in_array( $widget, $exclude ) ) {
471
+				if (in_array($widget, $exclude)) {
472 472
 					continue;
473 473
 				}
474 474
 
475 475
 				// SD V1 used to extend the widget class. V2 does not, so we cannot call register widget on it.
476
-				if ( is_subclass_of( $widget, 'WP_Widget' ) ) {
477
-					register_widget( $widget );
476
+				if (is_subclass_of($widget, 'WP_Widget')) {
477
+					register_widget($widget);
478 478
 				} else {
479 479
 					new $widget();
480 480
 				}
@@ -493,29 +493,29 @@  discard block
 block discarded – undo
493 493
 		// Ensure the database tables are up to date.
494 494
 		GetPaid_Installer::maybe_create_db_tables();
495 495
 
496
-		$wpi_version = get_option( 'wpinv_version', 0 );
496
+		$wpi_version = get_option('wpinv_version', 0);
497 497
 
498
-		if ( $wpi_version == WPINV_VERSION ) {
498
+		if ($wpi_version == WPINV_VERSION) {
499 499
 			return;
500 500
 		}
501 501
 
502 502
 		$installer = new GetPaid_Installer();
503 503
 
504
-		if ( empty( $wpi_version ) ) {
505
-			return $installer->upgrade_db( 0 );
504
+		if (empty($wpi_version)) {
505
+			return $installer->upgrade_db(0);
506 506
 		}
507 507
 
508
-		$upgrades  = array(
508
+		$upgrades = array(
509 509
 			'0.0.5' => '004',
510 510
 			'1.0.3' => '102',
511 511
 			'2.0.0' => '118',
512 512
 			'2.8.0' => '279',
513 513
 		);
514 514
 
515
-		foreach ( $upgrades as $key => $method ) {
515
+		foreach ($upgrades as $key => $method) {
516 516
 
517
-			if ( version_compare( $wpi_version, $key, '<' ) ) {
518
-				return $installer->upgrade_db( $method );
517
+			if (version_compare($wpi_version, $key, '<')) {
518
+				return $installer->upgrade_db($method);
519 519
 			}
520 520
 		}
521 521
 
@@ -528,11 +528,11 @@  discard block
 block discarded – undo
528 528
 	 */
529 529
 	public function maybe_flush_permalinks() {
530 530
 
531
-		$flush = get_option( 'wpinv_flush_permalinks', 0 );
531
+		$flush = get_option('wpinv_flush_permalinks', 0);
532 532
 
533
-		if ( ! empty( $flush ) ) {
533
+		if (!empty($flush)) {
534 534
 			flush_rewrite_rules();
535
-			delete_option( 'wpinv_flush_permalinks' );
535
+			delete_option('wpinv_flush_permalinks');
536 536
 		}
537 537
 
538 538
 	}
@@ -543,10 +543,10 @@  discard block
 block discarded – undo
543 543
 	 * @since 1.0.19
544 544
 	 * @param int[] $excluded_posts_ids
545 545
 	 */
546
-	public function wpseo_exclude_from_sitemap_by_post_ids( $excluded_posts_ids ) {
546
+	public function wpseo_exclude_from_sitemap_by_post_ids($excluded_posts_ids) {
547 547
 
548 548
 		// Ensure that we have an array.
549
-		if ( ! is_array( $excluded_posts_ids ) ) {
549
+		if (!is_array($excluded_posts_ids)) {
550 550
 			$excluded_posts_ids = array();
551 551
 		}
552 552
 
@@ -554,24 +554,24 @@  discard block
 block discarded – undo
554 554
 		$our_pages = array();
555 555
 
556 556
 		// Checkout page.
557
-		$our_pages[] = wpinv_get_option( 'checkout_page', false );
557
+		$our_pages[] = wpinv_get_option('checkout_page', false);
558 558
 
559 559
 		// Success page.
560
-		$our_pages[] = wpinv_get_option( 'success_page', false );
560
+		$our_pages[] = wpinv_get_option('success_page', false);
561 561
 
562 562
 		// Failure page.
563
-		$our_pages[] = wpinv_get_option( 'failure_page', false );
563
+		$our_pages[] = wpinv_get_option('failure_page', false);
564 564
 
565 565
 		// History page.
566
-		$our_pages[] = wpinv_get_option( 'invoice_history_page', false );
566
+		$our_pages[] = wpinv_get_option('invoice_history_page', false);
567 567
 
568 568
 		// Subscriptions page.
569
-		$our_pages[] = wpinv_get_option( 'invoice_subscription_page', false );
569
+		$our_pages[] = wpinv_get_option('invoice_subscription_page', false);
570 570
 
571
-		$our_pages   = array_map( 'intval', array_filter( $our_pages ) );
571
+		$our_pages   = array_map('intval', array_filter($our_pages));
572 572
 
573 573
 		$excluded_posts_ids = $excluded_posts_ids + $our_pages;
574
-		return array_unique( $excluded_posts_ids );
574
+		return array_unique($excluded_posts_ids);
575 575
 
576 576
 	}
577 577
 
@@ -581,15 +581,15 @@  discard block
 block discarded – undo
581 581
 	 * @since 1.0.19
582 582
 	 * @param string[] $post_types
583 583
 	 */
584
-	public function exclude_invoicing_post_types( $post_types ) {
584
+	public function exclude_invoicing_post_types($post_types) {
585 585
 
586 586
 		// Ensure that we have an array.
587
-		if ( ! is_array( $post_types ) ) {
587
+		if (!is_array($post_types)) {
588 588
 			$post_types = array();
589 589
 		}
590 590
 
591 591
 		// Remove our post types.
592
-		return array_diff( $post_types, array_keys( getpaid_get_invoice_post_types() ) );
592
+		return array_diff($post_types, array_keys(getpaid_get_invoice_post_types()));
593 593
 	}
594 594
 
595 595
 	/**
@@ -598,7 +598,7 @@  discard block
 block discarded – undo
598 598
 	 * @since 2.0.0
599 599
 	 */
600 600
 	public function wp_footer() {
601
-		wpinv_get_template( 'frontend-footer.php' );
601
+		wpinv_get_template('frontend-footer.php');
602 602
 	}
603 603
 
604 604
 	/**
@@ -607,14 +607,14 @@  discard block
 block discarded – undo
607 607
 	 * @since 2.0.0
608 608
 	 */
609 609
 	public function wp_head() {
610
-		wpinv_get_template( 'frontend-head.php' );
610
+		wpinv_get_template('frontend-head.php');
611 611
 	}
612 612
 
613 613
 	/**
614 614
 	 * Custom query vars.
615 615
 	 *
616 616
 	 */
617
-	public function custom_query_vars( $vars ) {
617
+	public function custom_query_vars($vars) {
618 618
         $vars[] = 'getpaid-ipn';
619 619
         return $vars;
620 620
 	}
@@ -625,28 +625,28 @@  discard block
 block discarded – undo
625 625
 	 */
626 626
 	public function add_rewrite_rule() {
627 627
         $tag = 'getpaid-ipn';
628
-        add_rewrite_tag( "%$tag%", '([^&]+)' );
629
-        add_rewrite_rule( "^$tag/([^/]*)/?", "index.php?$tag=\$matches[1]", 'top' );
628
+        add_rewrite_tag("%$tag%", '([^&]+)');
629
+        add_rewrite_rule("^$tag/([^/]*)/?", "index.php?$tag=\$matches[1]", 'top');
630 630
 	}
631 631
 
632 632
 	/**
633 633
 	 * Processes non-query string ipns.
634 634
 	 *
635 635
 	 */
636
-	public function maybe_process_new_ipn( $query ) {
636
+	public function maybe_process_new_ipn($query) {
637 637
 
638
-        if ( is_admin() || ! $query->is_main_query() ) {
638
+        if (is_admin() || !$query->is_main_query()) {
639 639
             return;
640 640
         }
641 641
 
642
-		$gateway = get_query_var( 'getpaid-ipn' );
642
+		$gateway = get_query_var('getpaid-ipn');
643 643
 
644
-        if ( ! empty( $gateway ) ) {
644
+        if (!empty($gateway)) {
645 645
 
646
-			$gateway = sanitize_text_field( $gateway );
646
+			$gateway = sanitize_text_field($gateway);
647 647
 			nocache_headers();
648
-			do_action( 'wpinv_verify_payment_ipn', $gateway );
649
-			do_action( "wpinv_verify_{$gateway}_ipn" );
648
+			do_action('wpinv_verify_payment_ipn', $gateway);
649
+			do_action("wpinv_verify_{$gateway}_ipn");
650 650
 			exit;
651 651
 
652 652
         }
Please login to merge, or discard this patch.
includes/wpinv-payment-functions.php 2 patches
Indentation   +286 added lines, -286 removed lines patch added patch discarded remove patch
@@ -1,196 +1,196 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 function wpinv_is_subscription_payment( $invoice = '' ) {
3
-	if ( empty( $invoice ) ) {
4
-		return false;
5
-	}
3
+    if ( empty( $invoice ) ) {
4
+        return false;
5
+    }
6 6
 
7
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
8
-		$invoice = wpinv_get_invoice( $invoice );
9
-	}
7
+    if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
8
+        $invoice = wpinv_get_invoice( $invoice );
9
+    }
10 10
 
11
-	if ( empty( $invoice ) ) {
12
-		return false;
13
-	}
11
+    if ( empty( $invoice ) ) {
12
+        return false;
13
+    }
14 14
 
15
-	if ( $invoice->is_renewal() ) {
16
-		return true;
17
-	}
15
+    if ( $invoice->is_renewal() ) {
16
+        return true;
17
+    }
18 18
 
19
-	return false;
19
+    return false;
20 20
 }
21 21
 
22 22
 function wpinv_payment_link_transaction_id( $invoice = '' ) {
23
-	if ( empty( $invoice ) ) {
24
-		return false;
25
-	}
23
+    if ( empty( $invoice ) ) {
24
+        return false;
25
+    }
26 26
 
27
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
28
-		$invoice = wpinv_get_invoice( $invoice );
29
-	}
27
+    if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
28
+        $invoice = wpinv_get_invoice( $invoice );
29
+    }
30 30
 
31
-	if ( empty( $invoice ) ) {
32
-		return false;
33
-	}
31
+    if ( empty( $invoice ) ) {
32
+        return false;
33
+    }
34 34
 
35
-	return apply_filters( 'wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice );
35
+    return apply_filters( 'wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice );
36 36
 }
37 37
 
38 38
 function wpinv_subscription_initial_payment_desc( $amount, $period, $interval, $trial_period = '', $trial_interval = 0 ) {
39
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
40
-
41
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
42
-		$amount = __( 'Free', 'invoicing' );
43
-		$interval = $trial_interval;
44
-		$period = $trial_period;
45
-	}
46
-
47
-	$description = '';
48
-	switch ( $period ) {
49
-		case 'D':
50
-		case 'day':
51
-			$description = wp_sprintf( _n( '%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing' ), $amount, $interval );
52
-			break;
53
-		case 'W':
54
-		case 'week':
55
-			$description = wp_sprintf( _n( '%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
56
-			break;
57
-		case 'M':
58
-		case 'month':
59
-			$description = wp_sprintf( _n( '%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing' ), $amount, $interval );
60
-			break;
61
-		case 'Y':
62
-		case 'year':
63
-			$description = wp_sprintf( _n( '%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing' ), $amount, $interval );
64
-			break;
65
-	}
66
-
67
-	return apply_filters( 'wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval );
39
+    $interval   = (int)$interval > 0 ? (int)$interval : 1;
40
+
41
+    if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
42
+        $amount = __( 'Free', 'invoicing' );
43
+        $interval = $trial_interval;
44
+        $period = $trial_period;
45
+    }
46
+
47
+    $description = '';
48
+    switch ( $period ) {
49
+        case 'D':
50
+        case 'day':
51
+            $description = wp_sprintf( _n( '%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing' ), $amount, $interval );
52
+            break;
53
+        case 'W':
54
+        case 'week':
55
+            $description = wp_sprintf( _n( '%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
56
+            break;
57
+        case 'M':
58
+        case 'month':
59
+            $description = wp_sprintf( _n( '%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing' ), $amount, $interval );
60
+            break;
61
+        case 'Y':
62
+        case 'year':
63
+            $description = wp_sprintf( _n( '%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing' ), $amount, $interval );
64
+            break;
65
+    }
66
+
67
+    return apply_filters( 'wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval );
68 68
 }
69 69
 
70 70
 function wpinv_subscription_recurring_payment_desc( $amount, $period, $interval, $bill_times = 0, $trial_period = '', $trial_interval = 0 ) {
71
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
72
-	$bill_times = (int)$bill_times > 0 ? (int)$bill_times : 0;
73
-
74
-	$description = '';
75
-	switch ( $period ) {
76
-		case 'D':
77
-		case 'day':
78
-			if ( (int)$bill_times > 0 ) {
79
-				if ( $interval > 1 ) {
80
-					if ( $bill_times > 1 ) {
81
-						$description = wp_sprintf( __( '%1$s for each %2$d days, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
82
-					} else {
83
-						$description = wp_sprintf( __( '%1$s for %2$d days.', 'invoicing' ), $amount, $interval );
84
-					}
85
-				} else {
86
-					$description = wp_sprintf( _n( '%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
87
-				}
88
-			} else {
89
-				$description = wp_sprintf( _n( '%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing' ), $amount, $interval );
90
-			}
91
-			break;
92
-		case 'W':
93
-		case 'week':
94
-			if ( (int)$bill_times > 0 ) {
95
-				if ( $interval > 1 ) {
96
-					if ( $bill_times > 1 ) {
97
-						$description = wp_sprintf( __( '%1$s for each %2$d weeks, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
98
-					} else {
99
-						$description = wp_sprintf( __( '%1$s for %2$d weeks.', 'invoicing' ), $amount, $interval );
100
-					}
101
-				} else {
102
-					$description = wp_sprintf( _n( '%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
103
-				}
104
-			} else {
105
-				$description = wp_sprintf( _n( '%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
106
-			}
107
-			break;
108
-		case 'M':
109
-		case 'month':
110
-			if ( (int)$bill_times > 0 ) {
111
-				if ( $interval > 1 ) {
112
-					if ( $bill_times > 1 ) {
113
-						$description = wp_sprintf( __( '%1$s for each %2$d months, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
114
-					} else {
115
-						$description = wp_sprintf( __( '%1$s for %2$d months.', 'invoicing' ), $amount, $interval );
116
-					}
117
-				} else {
118
-					$description = wp_sprintf( _n( '%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
119
-				}
120
-			} else {
121
-				$description = wp_sprintf( _n( '%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing' ), $amount, $interval );
122
-			}
123
-			break;
124
-		case 'Y':
125
-		case 'year':
126
-			if ( (int)$bill_times > 0 ) {
127
-				if ( $interval > 1 ) {
128
-					if ( $bill_times > 1 ) {
129
-						$description = wp_sprintf( __( '%1$s for each %2$d years, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
130
-					} else {
131
-						$description = wp_sprintf( __( '%1$s for %2$d years.', 'invoicing' ), $amount, $interval );
132
-					}
133
-				} else {
134
-					$description = wp_sprintf( _n( '%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
135
-				}
136
-			} else {
137
-				$description = wp_sprintf( _n( '%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing' ), $amount, $interval );
138
-			}
139
-			break;
140
-	}
141
-
142
-	return apply_filters( 'wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
71
+    $interval   = (int)$interval > 0 ? (int)$interval : 1;
72
+    $bill_times = (int)$bill_times > 0 ? (int)$bill_times : 0;
73
+
74
+    $description = '';
75
+    switch ( $period ) {
76
+        case 'D':
77
+        case 'day':
78
+            if ( (int)$bill_times > 0 ) {
79
+                if ( $interval > 1 ) {
80
+                    if ( $bill_times > 1 ) {
81
+                        $description = wp_sprintf( __( '%1$s for each %2$d days, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
82
+                    } else {
83
+                        $description = wp_sprintf( __( '%1$s for %2$d days.', 'invoicing' ), $amount, $interval );
84
+                    }
85
+                } else {
86
+                    $description = wp_sprintf( _n( '%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
87
+                }
88
+            } else {
89
+                $description = wp_sprintf( _n( '%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing' ), $amount, $interval );
90
+            }
91
+            break;
92
+        case 'W':
93
+        case 'week':
94
+            if ( (int)$bill_times > 0 ) {
95
+                if ( $interval > 1 ) {
96
+                    if ( $bill_times > 1 ) {
97
+                        $description = wp_sprintf( __( '%1$s for each %2$d weeks, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
98
+                    } else {
99
+                        $description = wp_sprintf( __( '%1$s for %2$d weeks.', 'invoicing' ), $amount, $interval );
100
+                    }
101
+                } else {
102
+                    $description = wp_sprintf( _n( '%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
103
+                }
104
+            } else {
105
+                $description = wp_sprintf( _n( '%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
106
+            }
107
+            break;
108
+        case 'M':
109
+        case 'month':
110
+            if ( (int)$bill_times > 0 ) {
111
+                if ( $interval > 1 ) {
112
+                    if ( $bill_times > 1 ) {
113
+                        $description = wp_sprintf( __( '%1$s for each %2$d months, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
114
+                    } else {
115
+                        $description = wp_sprintf( __( '%1$s for %2$d months.', 'invoicing' ), $amount, $interval );
116
+                    }
117
+                } else {
118
+                    $description = wp_sprintf( _n( '%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
119
+                }
120
+            } else {
121
+                $description = wp_sprintf( _n( '%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing' ), $amount, $interval );
122
+            }
123
+            break;
124
+        case 'Y':
125
+        case 'year':
126
+            if ( (int)$bill_times > 0 ) {
127
+                if ( $interval > 1 ) {
128
+                    if ( $bill_times > 1 ) {
129
+                        $description = wp_sprintf( __( '%1$s for each %2$d years, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
130
+                    } else {
131
+                        $description = wp_sprintf( __( '%1$s for %2$d years.', 'invoicing' ), $amount, $interval );
132
+                    }
133
+                } else {
134
+                    $description = wp_sprintf( _n( '%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
135
+                }
136
+            } else {
137
+                $description = wp_sprintf( _n( '%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing' ), $amount, $interval );
138
+            }
139
+            break;
140
+    }
141
+
142
+    return apply_filters( 'wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
143 143
 }
144 144
 
145 145
 function wpinv_subscription_payment_desc( $invoice ) {
146
-	if ( empty( $invoice ) ) {
147
-		return null;
148
-	}
149
-
150
-	$description = '';
151
-	if ( $invoice->is_parent() && $item = $invoice->get_recurring( true ) ) {
152
-		if ( $item->has_free_trial() ) {
153
-			$trial_period = $item->get_trial_period();
154
-			$trial_interval = $item->get_trial_interval();
155
-		} else {
156
-			$trial_period = '';
157
-			$trial_interval = 0;
158
-		}
159
-
160
-		$description = wpinv_get_billing_cycle( $invoice->get_total(), $invoice->get_recurring_details( 'total' ), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency() );
161
-	}
162
-
163
-	return apply_filters( 'wpinv_subscription_payment_desc', $description, $invoice );
146
+    if ( empty( $invoice ) ) {
147
+        return null;
148
+    }
149
+
150
+    $description = '';
151
+    if ( $invoice->is_parent() && $item = $invoice->get_recurring( true ) ) {
152
+        if ( $item->has_free_trial() ) {
153
+            $trial_period = $item->get_trial_period();
154
+            $trial_interval = $item->get_trial_interval();
155
+        } else {
156
+            $trial_period = '';
157
+            $trial_interval = 0;
158
+        }
159
+
160
+        $description = wpinv_get_billing_cycle( $invoice->get_total(), $invoice->get_recurring_details( 'total' ), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency() );
161
+    }
162
+
163
+    return apply_filters( 'wpinv_subscription_payment_desc', $description, $invoice );
164 164
 }
165 165
 
166 166
 function wpinv_get_billing_cycle( $initial, $recurring, $period, $interval, $bill_times, $trial_period = '', $trial_interval = 0, $currency = '' ) {
167
-	$initial_total      = wpinv_round_amount( $initial );
168
-	$recurring_total    = wpinv_round_amount( $recurring );
167
+    $initial_total      = wpinv_round_amount( $initial );
168
+    $recurring_total    = wpinv_round_amount( $recurring );
169 169
 
170
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
171
-		// Free trial
172
-	} else {
173
-		if ( $bill_times == 1 ) {
174
-			$recurring_total = $initial_total;
175
-		} elseif ( $bill_times > 1 && $initial_total != $recurring_total ) {
176
-			$bill_times--;
177
-		}
178
-	}
170
+    if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
171
+        // Free trial
172
+    } else {
173
+        if ( $bill_times == 1 ) {
174
+            $recurring_total = $initial_total;
175
+        } elseif ( $bill_times > 1 && $initial_total != $recurring_total ) {
176
+            $bill_times--;
177
+        }
178
+    }
179 179
 
180
-	$initial_amount     = wpinv_price( $initial_total, $currency );
181
-	$recurring_amount   = wpinv_price( $recurring_total, $currency );
180
+    $initial_amount     = wpinv_price( $initial_total, $currency );
181
+    $recurring_amount   = wpinv_price( $recurring_total, $currency );
182 182
 
183
-	$recurring          = wpinv_subscription_recurring_payment_desc( $recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
183
+    $recurring          = wpinv_subscription_recurring_payment_desc( $recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
184 184
 
185
-	if ( $initial_total != $recurring_total ) {
186
-		$initial        = wpinv_subscription_initial_payment_desc( $initial_amount, $period, $interval, $trial_period, $trial_interval );
185
+    if ( $initial_total != $recurring_total ) {
186
+        $initial        = wpinv_subscription_initial_payment_desc( $initial_amount, $period, $interval, $trial_period, $trial_interval );
187 187
 
188
-		$description    = wp_sprintf( __( '%1$s Then %2$s', 'invoicing' ), $initial, $recurring );
189
-	} else {
190
-		$description    = $recurring;
191
-	}
188
+        $description    = wp_sprintf( __( '%1$s Then %2$s', 'invoicing' ), $initial, $recurring );
189
+    } else {
190
+        $description    = $recurring;
191
+    }
192 192
 
193
-	return apply_filters( 'wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency );
193
+    return apply_filters( 'wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency );
194 194
 }
195 195
 
196 196
 /**
@@ -202,25 +202,25 @@  discard block
 block discarded – undo
202 202
  */
203 203
 function getpaid_get_card_name( $card_number ) {
204 204
 
205
-	// Known regexes.
206
-	$regexes = array(
207
-		'/^4/'                     => __( 'Visa', 'invoicing' ),
208
-		'/^5[1-5]/'                => __( 'Mastercard', 'invoicing' ),
209
-		'/^3[47]/'                 => __( 'Amex', 'invoicing' ),
210
-		'/^3(?:0[0-5]|[68])/'      => __( 'Diners Club', 'invoicing' ),
211
-		'/^6(?:011|5)/'            => __( 'Discover', 'invoicing' ),
212
-		'/^(?:2131|1800|35\d{3})/' => __( 'JCB', 'invoicing' ),
213
-	);
214
-
215
-	// Confirm if one matches.
216
-	foreach ( $regexes as $regex => $card ) {
217
-		if ( preg_match( $regex, $card_number ) >= 1 ) {
218
-			return $card;
219
-		}
220
-	}
221
-
222
-	// None matched.
223
-	return __( 'Card', 'invoicing' );
205
+    // Known regexes.
206
+    $regexes = array(
207
+        '/^4/'                     => __( 'Visa', 'invoicing' ),
208
+        '/^5[1-5]/'                => __( 'Mastercard', 'invoicing' ),
209
+        '/^3[47]/'                 => __( 'Amex', 'invoicing' ),
210
+        '/^3(?:0[0-5]|[68])/'      => __( 'Diners Club', 'invoicing' ),
211
+        '/^6(?:011|5)/'            => __( 'Discover', 'invoicing' ),
212
+        '/^(?:2131|1800|35\d{3})/' => __( 'JCB', 'invoicing' ),
213
+    );
214
+
215
+    // Confirm if one matches.
216
+    foreach ( $regexes as $regex => $card ) {
217
+        if ( preg_match( $regex, $card_number ) >= 1 ) {
218
+            return $card;
219
+        }
220
+    }
221
+
222
+    // None matched.
223
+    return __( 'Card', 'invoicing' );
224 224
 
225 225
 }
226 226
 
@@ -230,24 +230,24 @@  discard block
 block discarded – undo
230 230
  * @param WPInv_Invoice|int|null $invoice
231 231
  */
232 232
 function wpinv_send_back_to_checkout( $invoice = null ) {
233
-	$response = array( 'success' => false );
234
-	$invoice  = wpinv_get_invoice( $invoice );
235
-
236
-	// Was an invoice created?
237
-	if ( ! empty( $invoice ) ) {
238
-		$invoice             = is_scalar( $invoice ) ? new WPInv_Invoice( $invoice ) : $invoice;
239
-		$response['invoice'] = $invoice->get_id();
240
-		do_action( 'getpaid_checkout_invoice_exception', $invoice );
241
-	}
242
-
243
-	// Do we have any errors?
244
-	if ( wpinv_get_errors() ) {
245
-		$response['data'] = getpaid_get_errors_html( true, false );
246
-	} else {
247
-		$response['data'] = __( 'An error occured while processing your payment. Please try again.', 'invoicing' );
248
-	}
249
-
250
-	wp_send_json( $response );
233
+    $response = array( 'success' => false );
234
+    $invoice  = wpinv_get_invoice( $invoice );
235
+
236
+    // Was an invoice created?
237
+    if ( ! empty( $invoice ) ) {
238
+        $invoice             = is_scalar( $invoice ) ? new WPInv_Invoice( $invoice ) : $invoice;
239
+        $response['invoice'] = $invoice->get_id();
240
+        do_action( 'getpaid_checkout_invoice_exception', $invoice );
241
+    }
242
+
243
+    // Do we have any errors?
244
+    if ( wpinv_get_errors() ) {
245
+        $response['data'] = getpaid_get_errors_html( true, false );
246
+    } else {
247
+        $response['data'] = __( 'An error occured while processing your payment. Please try again.', 'invoicing' );
248
+    }
249
+
250
+    wp_send_json( $response );
251 251
 }
252 252
 
253 253
 /**
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
  * @return string
257 257
  */
258 258
 function getpaid_get_recaptcha_site_key() {
259
-	return apply_filters( 'getpaid_recaptcha_site_key', wpinv_get_option( 'recaptcha_site_key', '' ) );
259
+    return apply_filters( 'getpaid_recaptcha_site_key', wpinv_get_option( 'recaptcha_site_key', '' ) );
260 260
 }
261 261
 
262 262
 /**
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
  * @return string
266 266
  */
267 267
 function getpaid_get_recaptcha_secret_key() {
268
-	return apply_filters( 'getpaid_recaptcha_secret_key', wpinv_get_option( 'recaptcha_secret_key', '' ) );
268
+    return apply_filters( 'getpaid_recaptcha_secret_key', wpinv_get_option( 'recaptcha_secret_key', '' ) );
269 269
 }
270 270
 
271 271
 /**
@@ -274,7 +274,7 @@  discard block
 block discarded – undo
274 274
  * @return bool
275 275
  */
276 276
 function getpaid_is_recaptcha_enabled() {
277
-	return wpinv_get_option( 'enable_recaptcha', false ) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
277
+    return wpinv_get_option( 'enable_recaptcha', false ) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
278 278
 }
279 279
 
280 280
 /**
@@ -283,27 +283,27 @@  discard block
 block discarded – undo
283 283
  * @return string
284 284
  */
285 285
 function getpaid_get_recaptcha_version() {
286
-	return apply_filters( 'getpaid_recaptcha_version', wpinv_get_option( 'recaptcha_version', 'v2' ) );
286
+    return apply_filters( 'getpaid_recaptcha_version', wpinv_get_option( 'recaptcha_version', 'v2' ) );
287 287
 }
288 288
 
289 289
 function getpaid_recaptcha_api_url() {
290
-	// Prevent conflicts with Ninja Forms recaptcha.
291
-	if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'geodir_ninja_forms' ) {
292
-		$url = '';
293
-	} else {
294
-		$url = getpaid_recaptcha_get_api_url();
295
-	}
296
-
297
-	return apply_filters( 'getpaid_recaptcha_api_url', $url );
290
+    // Prevent conflicts with Ninja Forms recaptcha.
291
+    if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'geodir_ninja_forms' ) {
292
+        $url = '';
293
+    } else {
294
+        $url = getpaid_recaptcha_get_api_url();
295
+    }
296
+
297
+    return apply_filters( 'getpaid_recaptcha_api_url', $url );
298 298
 }
299 299
 
300 300
 function getpaid_recaptcha_get_api_url() {
301
-	return add_query_arg(
302
-		array(
303
-			'render' => 'v2' === getpaid_get_recaptcha_version() ? 'explicit' : getpaid_get_recaptcha_site_key(),
304
-		),
305
-		'https://www.google.com/recaptcha/api.js'
306
-	);
301
+    return add_query_arg(
302
+        array(
303
+            'render' => 'v2' === getpaid_get_recaptcha_version() ? 'explicit' : getpaid_get_recaptcha_site_key(),
304
+        ),
305
+        'https://www.google.com/recaptcha/api.js'
306
+    );
307 307
 }
308 308
 
309 309
 /**
@@ -312,42 +312,42 @@  discard block
 block discarded – undo
312 312
  * @return array
313 313
  */
314 314
 function getpaid_get_recaptcha_settings() {
315
-	$settings = array(
316
-		'enabled' => getpaid_is_recaptcha_enabled(),
317
-		'version' => getpaid_get_recaptcha_version(),
318
-	);
319
-
320
-	if ( ! getpaid_is_recaptcha_enabled() ) {
321
-		return $settings;
322
-	}
323
-
324
-	$settings['sitekey'] = getpaid_get_recaptcha_site_key();
325
-
326
-	// Version 2 render params.
327
-	if ( 'v2' === getpaid_get_recaptcha_version() ) {
328
-		$settings['render_params'] = array(
329
-			'sitekey'  => getpaid_get_recaptcha_site_key(),
330
-			'theme'    => 'light',
331
-			'size'     => 'normal',
332
-			'tabindex' => 0,
333
-		);
334
-	}
335
-
336
-	return apply_filters( 'getpaid_recaptcha_settings', $settings );
315
+    $settings = array(
316
+        'enabled' => getpaid_is_recaptcha_enabled(),
317
+        'version' => getpaid_get_recaptcha_version(),
318
+    );
319
+
320
+    if ( ! getpaid_is_recaptcha_enabled() ) {
321
+        return $settings;
322
+    }
323
+
324
+    $settings['sitekey'] = getpaid_get_recaptcha_site_key();
325
+
326
+    // Version 2 render params.
327
+    if ( 'v2' === getpaid_get_recaptcha_version() ) {
328
+        $settings['render_params'] = array(
329
+            'sitekey'  => getpaid_get_recaptcha_site_key(),
330
+            'theme'    => 'light',
331
+            'size'     => 'normal',
332
+            'tabindex' => 0,
333
+        );
334
+    }
335
+
336
+    return apply_filters( 'getpaid_recaptcha_settings', $settings );
337 337
 }
338 338
 
339 339
 /**
340 340
  * Displays reCAPTCHA before payment button.
341 341
  */
342 342
 function getpaid_display_recaptcha_before_payment_button() {
343
-	if ( ! getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version() ) {
344
-		return;
345
-	}
346
-
347
-	printf(
348
-		'<div class="getpaid-recaptcha-wrapper"><div class="g-recaptcha mw-100 overflow-hidden my-2" id="getpaid-recaptcha-%s"></div></div>',
349
-		esc_attr( wp_unique_id() )
350
-	);
343
+    if ( ! getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version() ) {
344
+        return;
345
+    }
346
+
347
+    printf(
348
+        '<div class="getpaid-recaptcha-wrapper"><div class="g-recaptcha mw-100 overflow-hidden my-2" id="getpaid-recaptcha-%s"></div></div>',
349
+        esc_attr( wp_unique_id() )
350
+    );
351 351
 }
352 352
 add_action( 'getpaid_before_payment_form_pay_button', 'getpaid_display_recaptcha_before_payment_button' );
353 353
 
@@ -358,43 +358,43 @@  discard block
 block discarded – undo
358 358
  */
359 359
 function getpaid_validate_recaptcha_response( $submission ) {
360 360
 
361
-	// Check if reCAPTCHA is enabled.
362
-	if ( ! getpaid_is_recaptcha_enabled() ) {
363
-		return;
364
-	}
365
-
366
-	$token = $submission->get_field( 'g-recaptcha-response' );
367
-
368
-	// Abort if no token was provided.
369
-	if ( empty( $token ) ) {
370
-		wp_send_json_error( 'v2' === getpaid_get_recaptcha_version() ? __( 'Please confirm that you are not a robot.', 'invoicing' ) : __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
371
-	}
372
-
373
-	$result = wp_remote_post(
374
-		'https://www.google.com/recaptcha/api/siteverify',
375
-		array(
376
-			'body' => array(
377
-				'secret'   => getpaid_get_recaptcha_secret_key(),
378
-				'response' => $token,
379
-			),
380
-		)
381
-	);
382
-
383
-	// Site not reachable, give benefit of doubt.
384
-	if ( is_wp_error( $result ) ) {
385
-		return;
386
-	}
387
-
388
-	$result = json_decode( wp_remote_retrieve_body( $result ), true );
389
-
390
-	if ( empty( $result['success'] ) && ! in_array( 'missing-input-secret', $result['error-codes'], true ) && ! in_array( 'invalid-input-secret', $result['error-codes'], true ) ) {
391
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
392
-	}
393
-
394
-	// For v3, check the score.
395
-	$minimum_score = apply_filters( 'getpaid_recaptcha_minimum_score', 0.4 );
396
-	if ( 'v3' === getpaid_get_recaptcha_version() && ( empty( $result['score'] ) || $result['score'] < $minimum_score ) ) {
397
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
398
-	}
361
+    // Check if reCAPTCHA is enabled.
362
+    if ( ! getpaid_is_recaptcha_enabled() ) {
363
+        return;
364
+    }
365
+
366
+    $token = $submission->get_field( 'g-recaptcha-response' );
367
+
368
+    // Abort if no token was provided.
369
+    if ( empty( $token ) ) {
370
+        wp_send_json_error( 'v2' === getpaid_get_recaptcha_version() ? __( 'Please confirm that you are not a robot.', 'invoicing' ) : __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
371
+    }
372
+
373
+    $result = wp_remote_post(
374
+        'https://www.google.com/recaptcha/api/siteverify',
375
+        array(
376
+            'body' => array(
377
+                'secret'   => getpaid_get_recaptcha_secret_key(),
378
+                'response' => $token,
379
+            ),
380
+        )
381
+    );
382
+
383
+    // Site not reachable, give benefit of doubt.
384
+    if ( is_wp_error( $result ) ) {
385
+        return;
386
+    }
387
+
388
+    $result = json_decode( wp_remote_retrieve_body( $result ), true );
389
+
390
+    if ( empty( $result['success'] ) && ! in_array( 'missing-input-secret', $result['error-codes'], true ) && ! in_array( 'invalid-input-secret', $result['error-codes'], true ) ) {
391
+        wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
392
+    }
393
+
394
+    // For v3, check the score.
395
+    $minimum_score = apply_filters( 'getpaid_recaptcha_minimum_score', 0.4 );
396
+    if ( 'v3' === getpaid_get_recaptcha_version() && ( empty( $result['score'] ) || $result['score'] < $minimum_score ) ) {
397
+        wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
398
+    }
399 399
 }
400 400
 add_action( 'getpaid_checkout_error_checks', 'getpaid_validate_recaptcha_response' );
Please login to merge, or discard this patch.
Spacing   +119 added lines, -119 removed lines patch added patch discarded remove patch
@@ -1,155 +1,155 @@  discard block
 block discarded – undo
1 1
 <?php
2
-function wpinv_is_subscription_payment( $invoice = '' ) {
3
-	if ( empty( $invoice ) ) {
2
+function wpinv_is_subscription_payment($invoice = '') {
3
+	if (empty($invoice)) {
4 4
 		return false;
5 5
 	}
6 6
 
7
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
8
-		$invoice = wpinv_get_invoice( $invoice );
7
+	if (!is_object($invoice) && is_scalar($invoice)) {
8
+		$invoice = wpinv_get_invoice($invoice);
9 9
 	}
10 10
 
11
-	if ( empty( $invoice ) ) {
11
+	if (empty($invoice)) {
12 12
 		return false;
13 13
 	}
14 14
 
15
-	if ( $invoice->is_renewal() ) {
15
+	if ($invoice->is_renewal()) {
16 16
 		return true;
17 17
 	}
18 18
 
19 19
 	return false;
20 20
 }
21 21
 
22
-function wpinv_payment_link_transaction_id( $invoice = '' ) {
23
-	if ( empty( $invoice ) ) {
22
+function wpinv_payment_link_transaction_id($invoice = '') {
23
+	if (empty($invoice)) {
24 24
 		return false;
25 25
 	}
26 26
 
27
-	if ( ! is_object( $invoice ) && is_scalar( $invoice ) ) {
28
-		$invoice = wpinv_get_invoice( $invoice );
27
+	if (!is_object($invoice) && is_scalar($invoice)) {
28
+		$invoice = wpinv_get_invoice($invoice);
29 29
 	}
30 30
 
31
-	if ( empty( $invoice ) ) {
31
+	if (empty($invoice)) {
32 32
 		return false;
33 33
 	}
34 34
 
35
-	return apply_filters( 'wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice );
35
+	return apply_filters('wpinv_payment_details_transaction_id-' . $invoice->gateway, $invoice->get_transaction_id(), $invoice->ID, $invoice);
36 36
 }
37 37
 
38
-function wpinv_subscription_initial_payment_desc( $amount, $period, $interval, $trial_period = '', $trial_interval = 0 ) {
39
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
38
+function wpinv_subscription_initial_payment_desc($amount, $period, $interval, $trial_period = '', $trial_interval = 0) {
39
+	$interval = (int) $interval > 0 ? (int) $interval : 1;
40 40
 
41
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
42
-		$amount = __( 'Free', 'invoicing' );
41
+	if ($trial_interval > 0 && !empty($trial_period)) {
42
+		$amount = __('Free', 'invoicing');
43 43
 		$interval = $trial_interval;
44 44
 		$period = $trial_period;
45 45
 	}
46 46
 
47 47
 	$description = '';
48
-	switch ( $period ) {
48
+	switch ($period) {
49 49
 		case 'D':
50 50
 		case 'day':
51
-			$description = wp_sprintf( _n( '%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing' ), $amount, $interval );
51
+			$description = wp_sprintf(_n('%s for the first day.', '%1$s for the first %2$d days.', $interval, 'invoicing'), $amount, $interval);
52 52
 			break;
53 53
 		case 'W':
54 54
 		case 'week':
55
-			$description = wp_sprintf( _n( '%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
55
+			$description = wp_sprintf(_n('%s for the first week.', '%1$s for the first %2$d weeks.', $interval, 'invoicing'), $amount, $interval);
56 56
 			break;
57 57
 		case 'M':
58 58
 		case 'month':
59
-			$description = wp_sprintf( _n( '%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing' ), $amount, $interval );
59
+			$description = wp_sprintf(_n('%s for the first month.', '%1$s for the first %2$d months.', $interval, 'invoicing'), $amount, $interval);
60 60
 			break;
61 61
 		case 'Y':
62 62
 		case 'year':
63
-			$description = wp_sprintf( _n( '%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing' ), $amount, $interval );
63
+			$description = wp_sprintf(_n('%s for the first year.', '%1$s for the first %2$d years.', $interval, 'invoicing'), $amount, $interval);
64 64
 			break;
65 65
 	}
66 66
 
67
-	return apply_filters( 'wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval );
67
+	return apply_filters('wpinv_subscription_initial_payment_desc', $description, $amount, $period, $interval, $trial_period, $trial_interval);
68 68
 }
69 69
 
70
-function wpinv_subscription_recurring_payment_desc( $amount, $period, $interval, $bill_times = 0, $trial_period = '', $trial_interval = 0 ) {
71
-	$interval   = (int)$interval > 0 ? (int)$interval : 1;
72
-	$bill_times = (int)$bill_times > 0 ? (int)$bill_times : 0;
70
+function wpinv_subscription_recurring_payment_desc($amount, $period, $interval, $bill_times = 0, $trial_period = '', $trial_interval = 0) {
71
+	$interval   = (int) $interval > 0 ? (int) $interval : 1;
72
+	$bill_times = (int) $bill_times > 0 ? (int) $bill_times : 0;
73 73
 
74 74
 	$description = '';
75
-	switch ( $period ) {
75
+	switch ($period) {
76 76
 		case 'D':
77 77
 		case 'day':
78
-			if ( (int)$bill_times > 0 ) {
79
-				if ( $interval > 1 ) {
80
-					if ( $bill_times > 1 ) {
81
-						$description = wp_sprintf( __( '%1$s for each %2$d days, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
78
+			if ((int) $bill_times > 0) {
79
+				if ($interval > 1) {
80
+					if ($bill_times > 1) {
81
+						$description = wp_sprintf(__('%1$s for each %2$d days, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
82 82
 					} else {
83
-						$description = wp_sprintf( __( '%1$s for %2$d days.', 'invoicing' ), $amount, $interval );
83
+						$description = wp_sprintf(__('%1$s for %2$d days.', 'invoicing'), $amount, $interval);
84 84
 					}
85 85
 				} else {
86
-					$description = wp_sprintf( _n( '%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
86
+					$description = wp_sprintf(_n('%s for one day.', '%1$s for each day, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
87 87
 				}
88 88
 			} else {
89
-				$description = wp_sprintf( _n( '%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing' ), $amount, $interval );
89
+				$description = wp_sprintf(_n('%s for each day.', '%1$s for each %2$d days.', $interval, 'invoicing'), $amount, $interval);
90 90
 			}
91 91
 			break;
92 92
 		case 'W':
93 93
 		case 'week':
94
-			if ( (int)$bill_times > 0 ) {
95
-				if ( $interval > 1 ) {
96
-					if ( $bill_times > 1 ) {
97
-						$description = wp_sprintf( __( '%1$s for each %2$d weeks, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
94
+			if ((int) $bill_times > 0) {
95
+				if ($interval > 1) {
96
+					if ($bill_times > 1) {
97
+						$description = wp_sprintf(__('%1$s for each %2$d weeks, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
98 98
 					} else {
99
-						$description = wp_sprintf( __( '%1$s for %2$d weeks.', 'invoicing' ), $amount, $interval );
99
+						$description = wp_sprintf(__('%1$s for %2$d weeks.', 'invoicing'), $amount, $interval);
100 100
 					}
101 101
 				} else {
102
-					$description = wp_sprintf( _n( '%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
102
+					$description = wp_sprintf(_n('%s for one week.', '%1$s for each week, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
103 103
 				}
104 104
 			} else {
105
-				$description = wp_sprintf( _n( '%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing' ), $amount, $interval );
105
+				$description = wp_sprintf(_n('%s for each week.', '%1$s for each %2$d weeks.', $interval, 'invoicing'), $amount, $interval);
106 106
 			}
107 107
 			break;
108 108
 		case 'M':
109 109
 		case 'month':
110
-			if ( (int)$bill_times > 0 ) {
111
-				if ( $interval > 1 ) {
112
-					if ( $bill_times > 1 ) {
113
-						$description = wp_sprintf( __( '%1$s for each %2$d months, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
110
+			if ((int) $bill_times > 0) {
111
+				if ($interval > 1) {
112
+					if ($bill_times > 1) {
113
+						$description = wp_sprintf(__('%1$s for each %2$d months, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
114 114
 					} else {
115
-						$description = wp_sprintf( __( '%1$s for %2$d months.', 'invoicing' ), $amount, $interval );
115
+						$description = wp_sprintf(__('%1$s for %2$d months.', 'invoicing'), $amount, $interval);
116 116
 					}
117 117
 				} else {
118
-					$description = wp_sprintf( _n( '%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
118
+					$description = wp_sprintf(_n('%s for one month.', '%1$s for each month, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
119 119
 				}
120 120
 			} else {
121
-				$description = wp_sprintf( _n( '%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing' ), $amount, $interval );
121
+				$description = wp_sprintf(_n('%s for each month.', '%1$s for each %2$d months.', $interval, 'invoicing'), $amount, $interval);
122 122
 			}
123 123
 			break;
124 124
 		case 'Y':
125 125
 		case 'year':
126
-			if ( (int)$bill_times > 0 ) {
127
-				if ( $interval > 1 ) {
128
-					if ( $bill_times > 1 ) {
129
-						$description = wp_sprintf( __( '%1$s for each %2$d years, for %3$d installments.', 'invoicing' ), $amount, $interval, $bill_times );
126
+			if ((int) $bill_times > 0) {
127
+				if ($interval > 1) {
128
+					if ($bill_times > 1) {
129
+						$description = wp_sprintf(__('%1$s for each %2$d years, for %3$d installments.', 'invoicing'), $amount, $interval, $bill_times);
130 130
 					} else {
131
-						$description = wp_sprintf( __( '%1$s for %2$d years.', 'invoicing' ), $amount, $interval );
131
+						$description = wp_sprintf(__('%1$s for %2$d years.', 'invoicing'), $amount, $interval);
132 132
 					}
133 133
 				} else {
134
-					$description = wp_sprintf( _n( '%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing' ), $amount, $bill_times );
134
+					$description = wp_sprintf(_n('%s for one year.', '%1$s for each year, for %2$d installments.', $bill_times, 'invoicing'), $amount, $bill_times);
135 135
 				}
136 136
 			} else {
137
-				$description = wp_sprintf( _n( '%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing' ), $amount, $interval );
137
+				$description = wp_sprintf(_n('%s for each year.', '%1$s for each %2$d years.', $interval, 'invoicing'), $amount, $interval);
138 138
 			}
139 139
 			break;
140 140
 	}
141 141
 
142
-	return apply_filters( 'wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
142
+	return apply_filters('wpinv_subscription_recurring_payment_desc', $description, $amount, $period, $interval, $bill_times, $trial_period, $trial_interval);
143 143
 }
144 144
 
145
-function wpinv_subscription_payment_desc( $invoice ) {
146
-	if ( empty( $invoice ) ) {
145
+function wpinv_subscription_payment_desc($invoice) {
146
+	if (empty($invoice)) {
147 147
 		return null;
148 148
 	}
149 149
 
150 150
 	$description = '';
151
-	if ( $invoice->is_parent() && $item = $invoice->get_recurring( true ) ) {
152
-		if ( $item->has_free_trial() ) {
151
+	if ($invoice->is_parent() && $item = $invoice->get_recurring(true)) {
152
+		if ($item->has_free_trial()) {
153 153
 			$trial_period = $item->get_trial_period();
154 154
 			$trial_interval = $item->get_trial_interval();
155 155
 		} else {
@@ -157,40 +157,40 @@  discard block
 block discarded – undo
157 157
 			$trial_interval = 0;
158 158
 		}
159 159
 
160
-		$description = wpinv_get_billing_cycle( $invoice->get_total(), $invoice->get_recurring_details( 'total' ), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency() );
160
+		$description = wpinv_get_billing_cycle($invoice->get_total(), $invoice->get_recurring_details('total'), $item->get_recurring_period(), $item->get_recurring_interval(), $item->get_recurring_limit(), $trial_period, $trial_interval, $invoice->get_currency());
161 161
 	}
162 162
 
163
-	return apply_filters( 'wpinv_subscription_payment_desc', $description, $invoice );
163
+	return apply_filters('wpinv_subscription_payment_desc', $description, $invoice);
164 164
 }
165 165
 
166
-function wpinv_get_billing_cycle( $initial, $recurring, $period, $interval, $bill_times, $trial_period = '', $trial_interval = 0, $currency = '' ) {
167
-	$initial_total      = wpinv_round_amount( $initial );
168
-	$recurring_total    = wpinv_round_amount( $recurring );
166
+function wpinv_get_billing_cycle($initial, $recurring, $period, $interval, $bill_times, $trial_period = '', $trial_interval = 0, $currency = '') {
167
+	$initial_total      = wpinv_round_amount($initial);
168
+	$recurring_total    = wpinv_round_amount($recurring);
169 169
 
170
-	if ( $trial_interval > 0 && ! empty( $trial_period ) ) {
170
+	if ($trial_interval > 0 && !empty($trial_period)) {
171 171
 		// Free trial
172 172
 	} else {
173
-		if ( $bill_times == 1 ) {
173
+		if ($bill_times == 1) {
174 174
 			$recurring_total = $initial_total;
175
-		} elseif ( $bill_times > 1 && $initial_total != $recurring_total ) {
175
+		} elseif ($bill_times > 1 && $initial_total != $recurring_total) {
176 176
 			$bill_times--;
177 177
 		}
178 178
 	}
179 179
 
180
-	$initial_amount     = wpinv_price( $initial_total, $currency );
181
-	$recurring_amount   = wpinv_price( $recurring_total, $currency );
180
+	$initial_amount     = wpinv_price($initial_total, $currency);
181
+	$recurring_amount   = wpinv_price($recurring_total, $currency);
182 182
 
183
-	$recurring          = wpinv_subscription_recurring_payment_desc( $recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval );
183
+	$recurring          = wpinv_subscription_recurring_payment_desc($recurring_amount, $period, $interval, $bill_times, $trial_period, $trial_interval);
184 184
 
185
-	if ( $initial_total != $recurring_total ) {
186
-		$initial        = wpinv_subscription_initial_payment_desc( $initial_amount, $period, $interval, $trial_period, $trial_interval );
185
+	if ($initial_total != $recurring_total) {
186
+		$initial        = wpinv_subscription_initial_payment_desc($initial_amount, $period, $interval, $trial_period, $trial_interval);
187 187
 
188
-		$description    = wp_sprintf( __( '%1$s Then %2$s', 'invoicing' ), $initial, $recurring );
188
+		$description    = wp_sprintf(__('%1$s Then %2$s', 'invoicing'), $initial, $recurring);
189 189
 	} else {
190 190
 		$description    = $recurring;
191 191
 	}
192 192
 
193
-	return apply_filters( 'wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency );
193
+	return apply_filters('wpinv_get_billing_cycle', $description, $initial, $recurring, $period, $interval, $bill_times, $trial_period, $trial_interval, $currency);
194 194
 }
195 195
 
196 196
 /**
@@ -200,27 +200,27 @@  discard block
 block discarded – undo
200 200
  * @param string $card_number Card number.
201 201
  * @return string
202 202
  */
203
-function getpaid_get_card_name( $card_number ) {
203
+function getpaid_get_card_name($card_number) {
204 204
 
205 205
 	// Known regexes.
206 206
 	$regexes = array(
207
-		'/^4/'                     => __( 'Visa', 'invoicing' ),
208
-		'/^5[1-5]/'                => __( 'Mastercard', 'invoicing' ),
209
-		'/^3[47]/'                 => __( 'Amex', 'invoicing' ),
210
-		'/^3(?:0[0-5]|[68])/'      => __( 'Diners Club', 'invoicing' ),
211
-		'/^6(?:011|5)/'            => __( 'Discover', 'invoicing' ),
212
-		'/^(?:2131|1800|35\d{3})/' => __( 'JCB', 'invoicing' ),
207
+		'/^4/'                     => __('Visa', 'invoicing'),
208
+		'/^5[1-5]/'                => __('Mastercard', 'invoicing'),
209
+		'/^3[47]/'                 => __('Amex', 'invoicing'),
210
+		'/^3(?:0[0-5]|[68])/'      => __('Diners Club', 'invoicing'),
211
+		'/^6(?:011|5)/'            => __('Discover', 'invoicing'),
212
+		'/^(?:2131|1800|35\d{3})/' => __('JCB', 'invoicing'),
213 213
 	);
214 214
 
215 215
 	// Confirm if one matches.
216
-	foreach ( $regexes as $regex => $card ) {
217
-		if ( preg_match( $regex, $card_number ) >= 1 ) {
216
+	foreach ($regexes as $regex => $card) {
217
+		if (preg_match($regex, $card_number) >= 1) {
218 218
 			return $card;
219 219
 		}
220 220
 	}
221 221
 
222 222
 	// None matched.
223
-	return __( 'Card', 'invoicing' );
223
+	return __('Card', 'invoicing');
224 224
 
225 225
 }
226 226
 
@@ -229,25 +229,25 @@  discard block
 block discarded – undo
229 229
  *
230 230
  * @param WPInv_Invoice|int|null $invoice
231 231
  */
232
-function wpinv_send_back_to_checkout( $invoice = null ) {
233
-	$response = array( 'success' => false );
234
-	$invoice  = wpinv_get_invoice( $invoice );
232
+function wpinv_send_back_to_checkout($invoice = null) {
233
+	$response = array('success' => false);
234
+	$invoice  = wpinv_get_invoice($invoice);
235 235
 
236 236
 	// Was an invoice created?
237
-	if ( ! empty( $invoice ) ) {
238
-		$invoice             = is_scalar( $invoice ) ? new WPInv_Invoice( $invoice ) : $invoice;
237
+	if (!empty($invoice)) {
238
+		$invoice             = is_scalar($invoice) ? new WPInv_Invoice($invoice) : $invoice;
239 239
 		$response['invoice'] = $invoice->get_id();
240
-		do_action( 'getpaid_checkout_invoice_exception', $invoice );
240
+		do_action('getpaid_checkout_invoice_exception', $invoice);
241 241
 	}
242 242
 
243 243
 	// Do we have any errors?
244
-	if ( wpinv_get_errors() ) {
245
-		$response['data'] = getpaid_get_errors_html( true, false );
244
+	if (wpinv_get_errors()) {
245
+		$response['data'] = getpaid_get_errors_html(true, false);
246 246
 	} else {
247
-		$response['data'] = __( 'An error occured while processing your payment. Please try again.', 'invoicing' );
247
+		$response['data'] = __('An error occured while processing your payment. Please try again.', 'invoicing');
248 248
 	}
249 249
 
250
-	wp_send_json( $response );
250
+	wp_send_json($response);
251 251
 }
252 252
 
253 253
 /**
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
  * @return string
257 257
  */
258 258
 function getpaid_get_recaptcha_site_key() {
259
-	return apply_filters( 'getpaid_recaptcha_site_key', wpinv_get_option( 'recaptcha_site_key', '' ) );
259
+	return apply_filters('getpaid_recaptcha_site_key', wpinv_get_option('recaptcha_site_key', ''));
260 260
 }
261 261
 
262 262
 /**
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
  * @return string
266 266
  */
267 267
 function getpaid_get_recaptcha_secret_key() {
268
-	return apply_filters( 'getpaid_recaptcha_secret_key', wpinv_get_option( 'recaptcha_secret_key', '' ) );
268
+	return apply_filters('getpaid_recaptcha_secret_key', wpinv_get_option('recaptcha_secret_key', ''));
269 269
 }
270 270
 
271 271
 /**
@@ -274,7 +274,7 @@  discard block
 block discarded – undo
274 274
  * @return bool
275 275
  */
276 276
 function getpaid_is_recaptcha_enabled() {
277
-	return wpinv_get_option( 'enable_recaptcha', false ) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
277
+	return wpinv_get_option('enable_recaptcha', false) && getpaid_get_recaptcha_site_key() && getpaid_get_recaptcha_secret_key();
278 278
 }
279 279
 
280 280
 /**
@@ -283,18 +283,18 @@  discard block
 block discarded – undo
283 283
  * @return string
284 284
  */
285 285
 function getpaid_get_recaptcha_version() {
286
-	return apply_filters( 'getpaid_recaptcha_version', wpinv_get_option( 'recaptcha_version', 'v2' ) );
286
+	return apply_filters('getpaid_recaptcha_version', wpinv_get_option('recaptcha_version', 'v2'));
287 287
 }
288 288
 
289 289
 function getpaid_recaptcha_api_url() {
290 290
 	// Prevent conflicts with Ninja Forms recaptcha.
291
-	if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'geodir_ninja_forms' ) {
291
+	if (!empty($_REQUEST['action']) && $_REQUEST['action'] == 'geodir_ninja_forms') {
292 292
 		$url = '';
293 293
 	} else {
294 294
 		$url = getpaid_recaptcha_get_api_url();
295 295
 	}
296 296
 
297
-	return apply_filters( 'getpaid_recaptcha_api_url', $url );
297
+	return apply_filters('getpaid_recaptcha_api_url', $url);
298 298
 }
299 299
 
300 300
 function getpaid_recaptcha_get_api_url() {
@@ -317,14 +317,14 @@  discard block
 block discarded – undo
317 317
 		'version' => getpaid_get_recaptcha_version(),
318 318
 	);
319 319
 
320
-	if ( ! getpaid_is_recaptcha_enabled() ) {
320
+	if (!getpaid_is_recaptcha_enabled()) {
321 321
 		return $settings;
322 322
 	}
323 323
 
324 324
 	$settings['sitekey'] = getpaid_get_recaptcha_site_key();
325 325
 
326 326
 	// Version 2 render params.
327
-	if ( 'v2' === getpaid_get_recaptcha_version() ) {
327
+	if ('v2' === getpaid_get_recaptcha_version()) {
328 328
 		$settings['render_params'] = array(
329 329
 			'sitekey'  => getpaid_get_recaptcha_site_key(),
330 330
 			'theme'    => 'light',
@@ -333,41 +333,41 @@  discard block
 block discarded – undo
333 333
 		);
334 334
 	}
335 335
 
336
-	return apply_filters( 'getpaid_recaptcha_settings', $settings );
336
+	return apply_filters('getpaid_recaptcha_settings', $settings);
337 337
 }
338 338
 
339 339
 /**
340 340
  * Displays reCAPTCHA before payment button.
341 341
  */
342 342
 function getpaid_display_recaptcha_before_payment_button() {
343
-	if ( ! getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version() ) {
343
+	if (!getpaid_is_recaptcha_enabled() || 'v2' !== getpaid_get_recaptcha_version()) {
344 344
 		return;
345 345
 	}
346 346
 
347 347
 	printf(
348 348
 		'<div class="getpaid-recaptcha-wrapper"><div class="g-recaptcha mw-100 overflow-hidden my-2" id="getpaid-recaptcha-%s"></div></div>',
349
-		esc_attr( wp_unique_id() )
349
+		esc_attr(wp_unique_id())
350 350
 	);
351 351
 }
352
-add_action( 'getpaid_before_payment_form_pay_button', 'getpaid_display_recaptcha_before_payment_button' );
352
+add_action('getpaid_before_payment_form_pay_button', 'getpaid_display_recaptcha_before_payment_button');
353 353
 
354 354
 /**
355 355
  * Validates the reCAPTCHA response.
356 356
  *
357 357
  * @param GetPaid_Payment_Form_Submission $submission
358 358
  */
359
-function getpaid_validate_recaptcha_response( $submission ) {
359
+function getpaid_validate_recaptcha_response($submission) {
360 360
 
361 361
 	// Check if reCAPTCHA is enabled.
362
-	if ( ! getpaid_is_recaptcha_enabled() ) {
362
+	if (!getpaid_is_recaptcha_enabled()) {
363 363
 		return;
364 364
 	}
365 365
 
366
-	$token = $submission->get_field( 'g-recaptcha-response' );
366
+	$token = $submission->get_field('g-recaptcha-response');
367 367
 
368 368
 	// Abort if no token was provided.
369
-	if ( empty( $token ) ) {
370
-		wp_send_json_error( 'v2' === getpaid_get_recaptcha_version() ? __( 'Please confirm that you are not a robot.', 'invoicing' ) : __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
369
+	if (empty($token)) {
370
+		wp_send_json_error('v2' === getpaid_get_recaptcha_version() ? __('Please confirm that you are not a robot.', 'invoicing') : __("Unable to verify that you're not a robot. Please try again.", 'invoicing'));
371 371
 	}
372 372
 
373 373
 	$result = wp_remote_post(
@@ -381,20 +381,20 @@  discard block
 block discarded – undo
381 381
 	);
382 382
 
383 383
 	// Site not reachable, give benefit of doubt.
384
-	if ( is_wp_error( $result ) ) {
384
+	if (is_wp_error($result)) {
385 385
 		return;
386 386
 	}
387 387
 
388
-	$result = json_decode( wp_remote_retrieve_body( $result ), true );
388
+	$result = json_decode(wp_remote_retrieve_body($result), true);
389 389
 
390
-	if ( empty( $result['success'] ) && ! in_array( 'missing-input-secret', $result['error-codes'], true ) && ! in_array( 'invalid-input-secret', $result['error-codes'], true ) ) {
391
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
390
+	if (empty($result['success']) && !in_array('missing-input-secret', $result['error-codes'], true) && !in_array('invalid-input-secret', $result['error-codes'], true)) {
391
+		wp_send_json_error(__("Unable to verify that you're not a robot. Please try again.", 'invoicing'));
392 392
 	}
393 393
 
394 394
 	// For v3, check the score.
395
-	$minimum_score = apply_filters( 'getpaid_recaptcha_minimum_score', 0.4 );
396
-	if ( 'v3' === getpaid_get_recaptcha_version() && ( empty( $result['score'] ) || $result['score'] < $minimum_score ) ) {
397
-		wp_send_json_error( __( "Unable to verify that you're not a robot. Please try again.", 'invoicing' ) );
395
+	$minimum_score = apply_filters('getpaid_recaptcha_minimum_score', 0.4);
396
+	if ('v3' === getpaid_get_recaptcha_version() && (empty($result['score']) || $result['score'] < $minimum_score)) {
397
+		wp_send_json_error(__("Unable to verify that you're not a robot. Please try again.", 'invoicing'));
398 398
 	}
399 399
 }
400
-add_action( 'getpaid_checkout_error_checks', 'getpaid_validate_recaptcha_response' );
400
+add_action('getpaid_checkout_error_checks', 'getpaid_validate_recaptcha_response');
Please login to merge, or discard this patch.
includes/class-getpaid-template.php 1 patch
Indentation   +152 added lines, -152 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined( 'ABSPATH' ) ) {
3
-	exit;
3
+    exit;
4 4
 }
5 5
 
6 6
 /**
@@ -20,29 +20,29 @@  discard block
 block discarded – undo
20 20
     public $templates_url;
21 21
 
22 22
     /**
23
-	 * Class constructor.
24
-	 *
25
-	 * @since 1.0.19
26
-	 */
27
-	public function __construct() {
23
+     * Class constructor.
24
+     *
25
+     * @since 1.0.19
26
+     */
27
+    public function __construct() {
28 28
 
29 29
         $this->templates_dir = apply_filters( 'getpaid_default_templates_dir', WPINV_PLUGIN_DIR . 'templates' );
30 30
         $this->templates_url = apply_filters( 'getpaid_default_templates_url', WPINV_PLUGIN_URL . 'templates' );
31 31
 
32 32
         // Oxygen plugin
33
-		if ( defined( 'CT_VERSION' ) ) {
34
-			add_filter( 'wpinv_locate_template', array( $this, 'oxygen_override_template' ), 11, 4 );
35
-		}
33
+        if ( defined( 'CT_VERSION' ) ) {
34
+            add_filter( 'wpinv_locate_template', array( $this, 'oxygen_override_template' ), 11, 4 );
35
+        }
36 36
 
37 37
     }
38 38
 
39 39
     /**
40
-	 * Checks if this is a preview page
41
-	 *
42
-	 * @since 1.0.19
43
-	 * @return bool
44
-	 */
45
-	public function is_preview() {
40
+     * Checks if this is a preview page
41
+     *
42
+     * @since 1.0.19
43
+     * @return bool
44
+     */
45
+    public function is_preview() {
46 46
         return $this->is_divi_preview() ||
47 47
             $this->is_elementor_preview() ||
48 48
             $this->is_beaver_preview() ||
@@ -53,73 +53,73 @@  discard block
 block discarded – undo
53 53
     }
54 54
 
55 55
     /**
56
-	 * Checks if this is an elementor preview page
57
-	 *
58
-	 * @since 1.0.19
59
-	 * @return bool
60
-	 */
61
-	public function is_elementor_preview() {
62
-		return isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' );
63
-	}
64
-
65
-	/**
66
-	 * Checks if this is a DIVI preview page
67
-	 *
68
-	 * @since 1.0.19
69
-	 * @return bool
70
-	 */
71
-	public function is_divi_preview() {
72
-		return isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'et_pb' );
73
-	}
74
-
75
-	/**
76
-	 * Checks if this is a beaver builder preview page
77
-	 *
78
-	 * @since 1.0.19
79
-	 * @return bool
80
-	 */
81
-	public function is_beaver_preview() {
82
-		return isset( $_REQUEST['fl_builder'] );
83
-	}
84
-
85
-	/**
86
-	 * Checks if this is a siteorigin builder preview page
87
-	 *
88
-	 * @since 1.0.19
89
-	 * @return bool
90
-	 */
91
-	public function is_siteorigin_preview() {
92
-		return ! empty( $_REQUEST['siteorigin_panels_live_editor'] );
93
-	}
94
-
95
-	/**
96
-	 * Checks if this is a cornerstone builder preview page
97
-	 *
98
-	 * @since 1.0.19
99
-	 * @return bool
100
-	 */
101
-	public function is_cornerstone_preview() {
102
-		return ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint';
103
-	}
104
-
105
-	/**
106
-	 * Checks if this is a fusion builder preview page
107
-	 *
108
-	 * @since 1.0.19
109
-	 * @return bool
110
-	 */
111
-	public function is_fusion_preview() {
112
-		return ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] );
113
-	}
114
-
115
-	/**
116
-	 * Checks if this is an oxygen builder preview page
117
-	 *
118
-	 * @since 1.0.19
119
-	 * @return bool
120
-	 */
121
-	public function is_oxygen_preview() {
122
-		return ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === 'oxy_render_' || substr( $_REQUEST['action'], 0, 10 ) === 'ct_render_' ) );
56
+     * Checks if this is an elementor preview page
57
+     *
58
+     * @since 1.0.19
59
+     * @return bool
60
+     */
61
+    public function is_elementor_preview() {
62
+        return isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' );
63
+    }
64
+
65
+    /**
66
+     * Checks if this is a DIVI preview page
67
+     *
68
+     * @since 1.0.19
69
+     * @return bool
70
+     */
71
+    public function is_divi_preview() {
72
+        return isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'et_pb' );
73
+    }
74
+
75
+    /**
76
+     * Checks if this is a beaver builder preview page
77
+     *
78
+     * @since 1.0.19
79
+     * @return bool
80
+     */
81
+    public function is_beaver_preview() {
82
+        return isset( $_REQUEST['fl_builder'] );
83
+    }
84
+
85
+    /**
86
+     * Checks if this is a siteorigin builder preview page
87
+     *
88
+     * @since 1.0.19
89
+     * @return bool
90
+     */
91
+    public function is_siteorigin_preview() {
92
+        return ! empty( $_REQUEST['siteorigin_panels_live_editor'] );
93
+    }
94
+
95
+    /**
96
+     * Checks if this is a cornerstone builder preview page
97
+     *
98
+     * @since 1.0.19
99
+     * @return bool
100
+     */
101
+    public function is_cornerstone_preview() {
102
+        return ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint';
103
+    }
104
+
105
+    /**
106
+     * Checks if this is a fusion builder preview page
107
+     *
108
+     * @since 1.0.19
109
+     * @return bool
110
+     */
111
+    public function is_fusion_preview() {
112
+        return ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] );
113
+    }
114
+
115
+    /**
116
+     * Checks if this is an oxygen builder preview page
117
+     *
118
+     * @since 1.0.19
119
+     * @return bool
120
+     */
121
+    public function is_oxygen_preview() {
122
+        return ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === 'oxy_render_' || substr( $_REQUEST['action'], 0, 10 ) === 'ct_render_' ) );
123 123
     }
124 124
 
125 125
     /**
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
      * @param string $template_path The template path relative to the theme's root dir. Defaults to 'invoicing'.
130 130
      * @param string $default_path The root path to the default template. Defaults to invoicing/templates
131 131
      */
132
-	public function locate_template( $template_name, $template_path = '', $default_path = '' ) {
132
+    public function locate_template( $template_name, $template_path = '', $default_path = '' ) {
133 133
 
134 134
         // Load the defaults for the template path and default path.
135 135
         $template_path = empty( $template_path ) ? 'invoicing' : $template_path;
@@ -150,22 +150,22 @@  discard block
 block discarded – undo
150 150
     }
151 151
 
152 152
     /**
153
-	 * Loads a template
154
-	 *
155
-	 * @since 1.0.19
156
-	 * @return bool
157
-	 */
158
-	protected function load_template( $template_name, $template_path, $args ) {
153
+     * Loads a template
154
+     *
155
+     * @since 1.0.19
156
+     * @return bool
157
+     */
158
+    protected function load_template( $template_name, $template_path, $args ) {
159 159
 
160 160
         if ( is_array( $args ) ) {
161 161
             extract( $args );
162 162
         }
163 163
 
164 164
         // Fires before loading a template.
165
-	    do_action( 'wpinv_before_template_part', $template_name, $template_path, $args );
165
+        do_action( 'wpinv_before_template_part', $template_name, $template_path, $args );
166 166
 
167 167
         // Load the template.
168
-	    include $template_path;
168
+        include $template_path;
169 169
 
170 170
         // Fires after loading a template.
171 171
         do_action( 'wpinv_after_template_part', $template_name, $template_path, $args );
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
      * @param string $template_path The templates directory relative to the theme's root dir. Defaults to 'invoicing'.
183 183
      * @param string $default_path The root path to the default template. Defaults to invoicing/templates
184 184
      */
185
-	public function display_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
185
+    public function display_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
186 186
 
187 187
         // Locate the template.
188 188
         $located = $this->locate_template( $template_name, $template_path, $default_path );
@@ -207,74 +207,74 @@  discard block
 block discarded – undo
207 207
      * @param string $template_path The templates directory relative to the theme's root dir. Defaults to 'invoicing'.
208 208
      * @param string $default_path The root path to the default template. Defaults to invoicing/templates
209 209
      */
210
-	public function get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
210
+    public function get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
211 211
         ob_start();
212 212
         $this->display_template( $template_name, $args, $template_path, $default_path );
213 213
         return ob_get_clean();
214 214
     }
215 215
 
216 216
     /**
217
-	 * Get the GetPaid templates theme path.
218
-	 *
219
-	 *
220
-	 * @return string Template path.
221
-	 */
222
-	public static function get_theme_template_path() {
223
-		$template   = get_template();
224
-		$theme_root = get_theme_root( $template );
225
-
226
-		return $theme_root . '/' . $template . '/' . untrailingslashit( wpinv_get_theme_template_dir_name() );
227
-
228
-	}
229
-
230
-	/**
231
-	 * Oxygen locate theme template.
232
-	 *
233
-	 * @param string $template The template.
234
-	 * @return string The theme template.
235
-	 */
236
-	public static function oxygen_locate_template( $template ) {
237
-
238
-		if ( empty( $template ) ) {
239
-			return '';
240
-		}
241
-
242
-		$has_filter = has_filter( 'template', 'ct_oxygen_template_name' );
243
-
244
-		// Remove template filter
245
-		if ( $has_filter ) {
246
-			remove_filter( 'template', 'ct_oxygen_template_name' );
247
-		}
248
-
249
-		$template = self::get_theme_template_path() . '/' . $template;
250
-
251
-		if ( ! file_exists( $template ) ) {
252
-			$template = '';
253
-		}
254
-
255
-		// Add template filter
256
-		if ( $has_filter ) {
257
-			add_filter( 'template', 'ct_oxygen_template_name' );
258
-		}
259
-
260
-		return $template;
261
-	}
262
-
263
-	/**
264
-	 * Oxygen override theme template.
265
-	 *
266
-	 * @param string $located Located template.
267
-	 * @param string $template_name Template name.
268
-	 * @return string Located template.
269
-	 */
270
-	public function oxygen_override_template( $located, $template_name ) {
217
+     * Get the GetPaid templates theme path.
218
+     *
219
+     *
220
+     * @return string Template path.
221
+     */
222
+    public static function get_theme_template_path() {
223
+        $template   = get_template();
224
+        $theme_root = get_theme_root( $template );
225
+
226
+        return $theme_root . '/' . $template . '/' . untrailingslashit( wpinv_get_theme_template_dir_name() );
227
+
228
+    }
229
+
230
+    /**
231
+     * Oxygen locate theme template.
232
+     *
233
+     * @param string $template The template.
234
+     * @return string The theme template.
235
+     */
236
+    public static function oxygen_locate_template( $template ) {
237
+
238
+        if ( empty( $template ) ) {
239
+            return '';
240
+        }
241
+
242
+        $has_filter = has_filter( 'template', 'ct_oxygen_template_name' );
243
+
244
+        // Remove template filter
245
+        if ( $has_filter ) {
246
+            remove_filter( 'template', 'ct_oxygen_template_name' );
247
+        }
248
+
249
+        $template = self::get_theme_template_path() . '/' . $template;
250
+
251
+        if ( ! file_exists( $template ) ) {
252
+            $template = '';
253
+        }
254
+
255
+        // Add template filter
256
+        if ( $has_filter ) {
257
+            add_filter( 'template', 'ct_oxygen_template_name' );
258
+        }
259
+
260
+        return $template;
261
+    }
262
+
263
+    /**
264
+     * Oxygen override theme template.
265
+     *
266
+     * @param string $located Located template.
267
+     * @param string $template_name Template name.
268
+     * @return string Located template.
269
+     */
270
+    public function oxygen_override_template( $located, $template_name ) {
271 271
 
272 272
         $oxygen_overide = self::oxygen_locate_template( $template_name );
273
-		if ( ! empty( $oxygen_overide ) ) {
274
-			return $oxygen_overide;
275
-		}
273
+        if ( ! empty( $oxygen_overide ) ) {
274
+            return $oxygen_overide;
275
+        }
276 276
 
277
-		return $located;
278
-	}
277
+        return $located;
278
+    }
279 279
 
280 280
 }
Please login to merge, or discard this patch.