Completed
Push — renovate/debug-4.x ( f92d53...830252 )
by
unknown
07:08
created

Jetpack_Simple_Payments::get_blog_id()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 2
nop 0
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
/*
3
 * Simple Payments lets users embed a PayPal button fully integrated with wpcom to sell products on the site.
4
 * This is not a proper module yet, because not all the pieces are in place. Until everything is shipped, it can be turned
5
 * into module that can be enabled/disabled.
6
*/
7
class Jetpack_Simple_Payments {
8
	// These have to be under 20 chars because that is CPT limit.
9
	static $post_type_order = 'jp_pay_order';
10
	static $post_type_product = 'jp_pay_product';
11
12
	static $shortcode = 'simple-payment';
13
14
	static $css_classname_prefix = 'jetpack-simple-payments';
15
16
	static $required_plan;
17
18
	// Increase this number each time there's a change in CSS or JS to bust cache.
19
	static $version = '0.25';
20
21
	// Classic singleton pattern:
22
	private static $instance;
23
	private function __construct() {}
24 View Code Duplication
	static function getInstance() {
25
		if ( ! self::$instance ) {
26
			self::$instance = new self();
27
			self::$instance->register_init_hooks();
28
			self::$required_plan = ( defined( 'IS_WPCOM' ) && IS_WPCOM ) ? 'value_bundle' : 'jetpack_premium';
29
		}
30
		return self::$instance;
31
	}
32
33
	private function register_scripts_and_styles() {
34
		/**
35
		 * Paypal heavily discourages putting that script in your own server:
36
		 * @see https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/add-paypal-button/
37
		 */
38
		wp_register_script( 'paypal-checkout-js', 'https://www.paypalobjects.com/api/checkout.js', array(), null, true );
39
		wp_register_script( 'paypal-express-checkout', plugins_url( '/paypal-express-checkout.js', __FILE__ ),
40
			array( 'jquery', 'paypal-checkout-js' ), self::$version );
41
		wp_register_style( 'jetpack-simple-payments', plugins_url( '/simple-payments.css', __FILE__ ), array( 'dashicons' ) );
42
	}
43
44
	private function register_init_hooks() {
45
		add_action( 'init', array( $this, 'init_hook_action' ) );
46
		add_action( 'jetpack_register_gutenberg_extensions', array( $this, 'register_gutenberg_block' ) );
47
		add_action( 'rest_api_init', array( $this, 'register_meta_fields_in_rest_api' ) );
48
	}
49
50
	private function register_shortcode() {
51
		add_shortcode( self::$shortcode, array( $this, 'parse_shortcode' ) );
52
	}
53
54
	public function init_hook_action() {
55
		add_filter( 'rest_api_allowed_post_types', array( $this, 'allow_rest_api_types' ) );
56
		add_filter( 'jetpack_sync_post_meta_whitelist', array( $this, 'allow_sync_post_meta' ) );
57
		if ( ! is_admin() ) {
58
			$this->register_scripts_and_styles();
59
		}
60
		$this->register_shortcode();
61
		$this->setup_cpts();
62
63
		add_filter( 'the_content', array( $this, 'remove_auto_paragraph_from_product_description' ), 0 );
64
	}
65
66
	function register_gutenberg_block() {
67
		if ( $this->is_enabled_jetpack_simple_payments() ) {
68
			jetpack_register_block( 'jetpack/simple-payments' );
69
		} else {
70
			Jetpack_Gutenberg::set_extension_unavailable(
71
				'jetpack/simple-payments',
72
				'missing_plan',
73
				array(
74
					'required_feature' => 'simple-payments',
75
					'required_plan'    => self::$required_plan,
76
				)
77
			);
78
		}
79
	}
80
81
	function remove_auto_paragraph_from_product_description( $content ) {
82
		if ( get_post_type() === self::$post_type_product ) {
83
			remove_filter( 'the_content', 'wpautop' );
84
		}
85
86
		return $content;
87
	}
88
89
	function get_blog_id() {
90
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
91
			return get_current_blog_id();
92
		}
93
94
		return Jetpack_Options::get_option( 'id' );
95
	}
96
97
	/**
98
	 * Used to check whether Simple Payments are enabled for given site.
99
	 *
100
	 * @return bool True if Simple Payments are enabled, false otherwise.
101
	 */
102
	function is_enabled_jetpack_simple_payments() {
103
		/**
104
		 * Can be used by plugin authors to disable the conflicting output of Simple Payments.
105
		 *
106
		 * @since 6.3.0
107
		 *
108
		 * @param bool True if Simple Payments should be disabled, false otherwise.
109
		 */
110
		if ( apply_filters( 'jetpack_disable_simple_payments', false ) ) {
111
			return false;
112
		}
113
114
		// For WPCOM sites
115 View Code Duplication
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM && function_exists( 'has_any_blog_stickers' ) ) {
116
			$site_id = $this->get_blog_id();
117
			return has_any_blog_stickers( array( 'premium-plan', 'business-plan', 'ecommerce-plan' ), $site_id );
118
		}
119
120
		// For all Jetpack sites
121
		return Jetpack::is_active() && Jetpack_Plan::supports( 'simple-payments');
122
	}
123
124
	function parse_shortcode( $attrs, $content = false ) {
125
		if ( empty( $attrs['id'] ) ) {
126
			return;
127
		}
128
		$product = get_post( $attrs['id'] );
129
		if ( ! $product || is_wp_error( $product ) ) {
130
			return;
131
		}
132
		if ( $product->post_type !== self::$post_type_product || 'publish' !== $product->post_status ) {
133
			return;
134
		}
135
136
		// We allow for overriding the presentation labels
137
		$data = shortcode_atts( array(
138
			'blog_id'     => $this->get_blog_id(),
139
			'dom_id'      => uniqid( self::$css_classname_prefix . '-' . $product->ID . '_', true ),
140
			'class'       => self::$css_classname_prefix . '-' . $product->ID,
141
			'title'       => get_the_title( $product ),
142
			'description' => $product->post_content,
143
			'cta'         => get_post_meta( $product->ID, 'spay_cta', true ),
144
			'multiple'    => get_post_meta( $product->ID, 'spay_multiple', true ) || '0'
145
		), $attrs );
146
147
		$data['price'] = $this->format_price(
148
			get_post_meta( $product->ID, 'spay_price', true ),
149
			get_post_meta( $product->ID, 'spay_currency', true )
150
		);
151
152
		$data['id'] = $attrs['id'];
153
154
		if( ! wp_style_is( 'jetpack-simple-payments', 'enqueued' ) ) {
155
			wp_enqueue_style( 'jetpack-simple-payments' );
156
		}
157
158
		if ( ! $this->is_enabled_jetpack_simple_payments() ) {
159
			if ( ! is_feed() ) {
160
				$this->output_admin_warning( $data );
161
			}
162
			return;
163
		}
164
165
		if ( ! wp_script_is( 'paypal-express-checkout', 'enqueued' ) ) {
166
			wp_enqueue_script( 'paypal-express-checkout' );
167
		}
168
169
		wp_add_inline_script( 'paypal-express-checkout', sprintf(
170
			"try{PaypalExpressCheckout.renderButton( '%d', '%d', '%s', '%d' );}catch(e){}",
171
			esc_js( $data['blog_id'] ),
172
			esc_js( $attrs['id'] ),
173
			esc_js( $data['dom_id'] ),
174
			esc_js( $data['multiple'] )
175
		) );
176
177
		return $this->output_shortcode( $data );
178
	}
179
180
	function output_admin_warning( $data ) {
181
		if ( ! current_user_can( 'manage_options' ) ) {
182
			return;
183
		}
184
185
		jetpack_require_lib( 'components' );
186
		return Jetpack_Components::render_upgrade_nudge( array(
187
			'plan' => self::$required_plan
188
		) );
189
	}
190
191
	function output_shortcode( $data ) {
192
		$items = '';
193
		$css_prefix = self::$css_classname_prefix;
194
195
		if ( $data['multiple'] ) {
196
			$items = sprintf( '
197
				<div class="%1$s">
198
					<input class="%2$s" type="number" value="1" min="1" id="%3$s" />
199
				</div>
200
				',
201
				esc_attr( "${css_prefix}-items" ),
202
				esc_attr( "${css_prefix}-items-number" ),
203
				esc_attr( "{$data['dom_id']}_number" )
204
			);
205
		}
206
		$image = "";
207
		if( has_post_thumbnail( $data['id'] ) ) {
208
			$image = sprintf( '<div class="%1$s"><div class="%2$s">%3$s</div></div>',
209
				esc_attr( "${css_prefix}-product-image" ),
210
				esc_attr( "${css_prefix}-image" ),
211
				get_the_post_thumbnail( $data['id'], 'full' )
212
			);
213
		}
214
		return sprintf( '
215
<div class="%1$s">
216
	<div class="%2$s">
217
		%3$s
218
		<div class="%4$s">
219
			<div class="%5$s"><p>%6$s</p></div>
220
			<div class="%7$s"><p>%8$s</p></div>
221
			<div class="%9$s"><p>%10$s</p></div>
222
			<div class="%11$s" id="%12$s"></div>
223
			<div class="%13$s">
224
				%14$s
225
				<div class="%15$s" id="%16$s"></div>
226
			</div>
227
		</div>
228
	</div>
229
</div>
230
',
231
			esc_attr( "{$data['class']} ${css_prefix}-wrapper" ),
232
			esc_attr( "${css_prefix}-product" ),
233
			$image,
234
			esc_attr( "${css_prefix}-details" ),
235
			esc_attr( "${css_prefix}-title" ),
236
			esc_html( $data['title'] ),
237
			esc_attr( "${css_prefix}-description" ),
238
			wp_kses( $data['description'], wp_kses_allowed_html( 'post' ) ),
239
			esc_attr( "${css_prefix}-price" ),
240
			esc_html( $data['price'] ),
241
			esc_attr( "${css_prefix}-purchase-message" ),
242
			esc_attr( "{$data['dom_id']}-message-container" ),
243
			esc_attr( "${css_prefix}-purchase-box" ),
244
			$items,
245
			esc_attr( "${css_prefix}-button" ),
246
			esc_attr( "{$data['dom_id']}_button" )
247
		);
248
	}
249
250
	/**
251
	 * Format a price with currency
252
	 *
253
	 * Uses currency-aware formatting to output a formatted price with a simple fallback.
254
	 *
255
	 * Largely inspired by WordPress.com's Store_Price::display_currency
256
	 *
257
	 * @param  string $price    Price.
258
	 * @param  string $currency Currency.
259
	 * @return string           Formatted price.
260
	 */
261
	private function format_price( $price, $currency ) {
262
		$currency_details = self::get_currency( $currency );
263
264
		if ( $currency_details ) {
265
			// Ensure USD displays as 1234.56 even in non-US locales.
266
			$amount = 'USD' === $currency
267
				? number_format( $price, $currency_details['decimal'], '.', ',' )
268
				: number_format_i18n( $price, $currency_details['decimal'] );
269
270
			return sprintf(
271
				$currency_details['format'],
272
				$currency_details['symbol'],
273
				$amount
274
			);
275
		}
276
277
		// Fall back to unspecified currency symbol like `¤1,234.05`.
278
		// @link https://en.wikipedia.org/wiki/Currency_sign_(typography).
279
		if ( ! $currency ) {
280
			return '¤' . number_format_i18n( $price, 2 );
281
		}
282
283
		return number_format_i18n( $price, 2 ) . ' ' . $currency;
284
	}
285
286
	/**
287
	 * Allows custom post types to be used by REST API.
288
	 * @param $post_types
289
	 * @see hook 'rest_api_allowed_post_types'
290
	 * @return array
291
	 */
292
	function allow_rest_api_types( $post_types ) {
293
		$post_types[] = self::$post_type_order;
294
		$post_types[] = self::$post_type_product;
295
		return $post_types;
296
	}
297
298
	function allow_sync_post_meta( $post_meta ) {
299
		return array_merge( $post_meta, array(
300
			'spay_paypal_id',
301
			'spay_status',
302
			'spay_product_id',
303
			'spay_quantity',
304
			'spay_price',
305
			'spay_customer_email',
306
			'spay_currency',
307
			'spay_cta',
308
			'spay_email',
309
			'spay_multiple',
310
			'spay_formatted_price',
311
		) );
312
	}
313
314
	/**
315
	 * Enable Simple payments custom meta values for access through the REST API.
316
	 * Field’s value will be exposed on a .meta key in the endpoint response,
317
	 * and WordPress will handle setting up the callbacks for reading and writing
318
	 * to that meta key.
319
	 *
320
	 * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/
321
	 */
322
	public function register_meta_fields_in_rest_api() {
323
		register_meta( 'post', 'spay_price', array(
324
			'description'       => esc_html__( 'Simple payments; price.', 'jetpack' ),
325
			'object_subtype'    => self::$post_type_product,
326
			'sanitize_callback' => array( $this, 'sanitize_price' ),
327
			'show_in_rest'      => true,
328
			'single'            => true,
329
			'type'              => 'number',
330
		) );
331
332
		register_meta( 'post', 'spay_currency', array(
333
			'description'       => esc_html__( 'Simple payments; currency code.', 'jetpack' ),
334
			'object_subtype'    => self::$post_type_product,
335
			'sanitize_callback' => array( $this, 'sanitize_currency' ),
336
			'show_in_rest'      => true,
337
			'single'            => true,
338
			'type'              => 'string',
339
		) );
340
341
		register_meta( 'post', 'spay_cta', array(
342
			'description'       => esc_html__( 'Simple payments; text with "Buy" or other CTA', 'jetpack' ),
343
			'object_subtype'    => self::$post_type_product,
344
			'sanitize_callback' => 'sanitize_text_field',
345
			'show_in_rest'      => true,
346
			'single'            => true,
347
			'type'              => 'string',
348
		) );
349
350
		register_meta( 'post', 'spay_multiple', array(
351
			'description'       => esc_html__( 'Simple payments; allow multiple items', 'jetpack' ),
352
			'object_subtype'    => self::$post_type_product,
353
			'sanitize_callback' => 'rest_sanitize_boolean',
354
			'show_in_rest'      => true,
355
			'single'            => true,
356
			'type'              => 'boolean',
357
		) );
358
359
		register_meta( 'post', 'spay_email', array(
360
			'description'       => esc_html__( 'Simple payments button; paypal email.', 'jetpack' ),
361
			'sanitize_callback' => 'sanitize_email',
362
			'show_in_rest'      => true,
363
			'single'            => true,
364
			'type'              => 'string',
365
		) );
366
367
		register_meta( 'post', 'spay_status', array(
368
			'description'       => esc_html__( 'Simple payments; status.', 'jetpack' ),
369
			'object_subtype'    => self::$post_type_product,
370
			'sanitize_callback' => 'sanitize_text_field',
371
			'show_in_rest'      => true,
372
			'single'            => true,
373
			'type'              => 'string',
374
		) );
375
	}
376
377
	/**
378
	 * Sanitize three-character ISO-4217 Simple payments currency
379
	 *
380
	 * List has to be in sync with list at the client side:
381
	 * @link https://github.com/Automattic/wp-calypso/blob/6d02ffe73cc073dea7270a22dc30881bff17d8fb/client/lib/simple-payments/constants.js
382
	 *
383
	 * Currencies should be supported by PayPal:
384
	 * @link https://developer.paypal.com/docs/integration/direct/rest/currency-codes/
385
	 */
386
	public static function sanitize_currency( $currency ) {
387
		$valid_currencies = array(
388
			'USD',
389
			'EUR',
390
			'AUD',
391
			'BRL',
392
			'CAD',
393
			'CZK',
394
			'DKK',
395
			'HKD',
396
			'HUF',
397
			'ILS',
398
			'JPY',
399
			'MYR',
400
			'MXN',
401
			'TWD',
402
			'NZD',
403
			'NOK',
404
			'PHP',
405
			'PLN',
406
			'GBP',
407
			'RUB',
408
			'SGD',
409
			'SEK',
410
			'CHF',
411
			'THB',
412
		);
413
414
		return in_array( $currency, $valid_currencies ) ? $currency : false;
415
	}
416
417
	/**
418
	 * Sanitize price:
419
	 *
420
	 * Positive integers and floats
421
	 * Supports two decimal places.
422
	 * Maximum length: 10.
423
	 *
424
	 * See `price` from PayPal docs:
425
	 * @link https://developer.paypal.com/docs/api/orders/v1/#definition-item
426
	 *
427
	 * @param      $value
428
	 * @return null|string
429
	 */
430
	public static function sanitize_price( $price ) {
431
		return preg_match( '/^[0-9]{0,10}(\.[0-9]{0,2})?$/', $price ) ? $price : false;
432
	}
433
434
	/**
435
	 * Sets up the custom post types for the module.
436
	 */
437
	function setup_cpts() {
438
439
		/*
440
		 * ORDER data structure. holds:
441
		 * title = customer_name | 4xproduct_name
442
		 * excerpt = customer_name + customer contact info + customer notes from paypal form
443
		 * metadata:
444
		 * spay_paypal_id - paypal id of transaction
445
		 * spay_status
446
		 * spay_product_id - post_id of bought product
447
		 * spay_quantity - quantity of product
448
		 * spay_price - item price at the time of purchase
449
		 * spay_customer_email - customer email
450
		 * ... (WIP)
451
		 */
452
		$order_capabilities = array(
453
			'edit_post'             => 'edit_posts',
454
			'read_post'             => 'read_private_posts',
455
			'delete_post'           => 'delete_posts',
456
			'edit_posts'            => 'edit_posts',
457
			'edit_others_posts'     => 'edit_others_posts',
458
			'publish_posts'         => 'publish_posts',
459
			'read_private_posts'    => 'read_private_posts',
460
		);
461
		$order_args = array(
462
			'label'                 => esc_html_x( 'Order', 'noun: a quantity of goods or items purchased or sold', 'jetpack' ),
463
			'description'           => esc_html__( 'Simple Payments orders', 'jetpack' ),
464
			'supports'              => array( 'custom-fields', 'excerpt' ),
465
			'hierarchical'          => false,
466
			'public'                => false,
467
			'show_ui'               => false,
468
			'show_in_menu'          => false,
469
			'show_in_admin_bar'     => false,
470
			'show_in_nav_menus'     => false,
471
			'can_export'            => true,
472
			'has_archive'           => false,
473
			'exclude_from_search'   => true,
474
			'publicly_queryable'    => false,
475
			'rewrite'               => false,
476
			'capabilities'          => $order_capabilities,
477
			'show_in_rest'          => true,
478
		);
479
		register_post_type( self::$post_type_order, $order_args );
480
481
		/*
482
		 * PRODUCT data structure. Holds:
483
		 * title - title
484
		 * content - description
485
		 * thumbnail - image
486
		 * metadata:
487
		 * spay_price - price
488
		 * spay_formatted_price
489
		 * spay_currency - currency code
490
		 * spay_cta - text with "Buy" or other CTA
491
		 * spay_email - paypal email
492
		 * spay_multiple - allow for multiple items
493
		 * spay_status - status. { enabled | disabled }
494
		 */
495
		$product_capabilities = array(
496
			'edit_post'             => 'edit_posts',
497
			'read_post'             => 'read_private_posts',
498
			'delete_post'           => 'delete_posts',
499
			'edit_posts'            => 'publish_posts',
500
			'edit_others_posts'     => 'edit_others_posts',
501
			'publish_posts'         => 'publish_posts',
502
			'read_private_posts'    => 'read_private_posts',
503
		);
504
		$product_args = array(
505
			'label'                 => esc_html__( 'Product', 'jetpack' ),
506
			'description'           => esc_html__( 'Simple Payments products', 'jetpack' ),
507
			'supports'              => array( 'title', 'editor','thumbnail', 'custom-fields', 'author' ),
508
			'hierarchical'          => false,
509
			'public'                => false,
510
			'show_ui'               => false,
511
			'show_in_menu'          => false,
512
			'show_in_admin_bar'     => false,
513
			'show_in_nav_menus'     => false,
514
			'can_export'            => true,
515
			'has_archive'           => false,
516
			'exclude_from_search'   => true,
517
			'publicly_queryable'    => false,
518
			'rewrite'               => false,
519
			'capabilities'          => $product_capabilities,
520
			'show_in_rest'          => true,
521
		);
522
		register_post_type( self::$post_type_product, $product_args );
523
	}
524
525
	/**
526
	 * Format a price for display
527
	 *
528
	 * Largely taken from WordPress.com Store_Price class
529
	 *
530
	 * The currency array will have the shape:
531
	 *   format  => string sprintf format with placeholders `%1$s`: Symbol `%2$s`: Price.
532
	 *   symbol  => string Symbol string
533
	 *   desc    => string Text description of currency
534
	 *   decimal => int    Number of decimal places
535
	 *
536
	 * @param  string $the_currency The desired currency, e.g. 'USD'.
537
	 * @return ?array               Currency object or null if not found.
0 ignored issues
show
Documentation introduced by
The doc-type ?array could not be parsed: Unknown type name "?array" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
538
	 */
539
	private static function get_currency( $the_currency ) {
540
		$currencies = array(
541
			'USD' => array(
542
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
543
				'symbol'  => '$',
544
				'decimal' => 2,
545
			),
546
			'GBP' => array(
547
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
548
				'symbol'  => '&#163;',
549
				'decimal' => 2,
550
			),
551
			'JPY' => array(
552
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
553
				'symbol'  => '&#165;',
554
				'decimal' => 0,
555
			),
556
			'BRL' => array(
557
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
558
				'symbol'  => 'R$',
559
				'decimal' => 2,
560
			),
561
			'EUR' => array(
562
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
563
				'symbol'  => '&#8364;',
564
				'decimal' => 2,
565
			),
566
			'NZD' => array(
567
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
568
				'symbol'  => 'NZ$',
569
				'decimal' => 2,
570
			),
571
			'AUD' => array(
572
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
573
				'symbol'  => 'A$',
574
				'decimal' => 2,
575
			),
576
			'CAD' => array(
577
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
578
				'symbol'  => 'C$',
579
				'decimal' => 2,
580
			),
581
			'ILS' => array(
582
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
583
				'symbol'  => '₪',
584
				'decimal' => 2,
585
			),
586
			'RUB' => array(
587
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
588
				'symbol'  => '₽',
589
				'decimal' => 2,
590
			),
591
			'MXN' => array(
592
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
593
				'symbol'  => 'MX$',
594
				'decimal' => 2,
595
			),
596
			'MYR' => array(
597
				'format'  => '%2$s%1$s', // 1: Symbol 2: currency value
598
				'symbol'  => 'RM',
599
				'decimal' => 2,
600
			),
601
			'SEK' => array(
602
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
603
				'symbol'  => 'Skr',
604
				'decimal' => 2,
605
			),
606
			'HUF' => array(
607
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
608
				'symbol'  => 'Ft',
609
				'decimal' => 0, // Decimals are supported by Stripe but not by PayPal.
610
			),
611
			'CHF' => array(
612
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
613
				'symbol'  => 'CHF',
614
				'decimal' => 2,
615
			),
616
			'CZK' => array(
617
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
618
				'symbol'  => 'Kč',
619
				'decimal' => 2,
620
			),
621
			'DKK' => array(
622
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
623
				'symbol'  => 'Dkr',
624
				'decimal' => 2,
625
			),
626
			'HKD' => array(
627
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
628
				'symbol'  => 'HK$',
629
				'decimal' => 2,
630
			),
631
			'NOK' => array(
632
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
633
				'symbol'  => 'Kr',
634
				'decimal' => 2,
635
			),
636
			'PHP' => array(
637
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
638
				'symbol'  => '₱',
639
				'decimal' => 2,
640
			),
641
			'PLN' => array(
642
				'format'  => '%2$s %1$s', // 1: Symbol 2: currency value
643
				'symbol'  => 'PLN',
644
				'decimal' => 2,
645
			),
646
			'SGD' => array(
647
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
648
				'symbol'  => 'S$',
649
				'decimal' => 2,
650
			),
651
			'TWD' => array(
652
				'format'  => '%1$s%2$s', // 1: Symbol 2: currency value
653
				'symbol'  => 'NT$',
654
				'decimal' => 0, // Decimals are supported by Stripe but not by PayPal.
655
			),
656
			'THB' => array(
657
				'format'  => '%2$s%1$s', // 1: Symbol 2: currency value
658
				'symbol'  => '฿',
659
				'decimal' => 2,
660
			),
661
		);
662
663
		if ( isset( $currencies[ $the_currency ] ) ) {
664
			return $currencies[ $the_currency ];
665
		}
666
		return null;
667
	}
668
}
669
Jetpack_Simple_Payments::getInstance();
670