191 lines
4.6 KiB
PHP
191 lines
4.6 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* PayPal Commerce Scripts
|
||
|
*
|
||
|
* @package Sandhills Development, LLC
|
||
|
* @subpackage Gateways\PayPal
|
||
|
* @copyright Copyright (c) 2021, Ashley Gibson
|
||
|
* @license GPL2+
|
||
|
* @since 2.11
|
||
|
*/
|
||
|
|
||
|
namespace EDD\Gateways\PayPal;
|
||
|
|
||
|
use EDD\Gateways\PayPal\Exceptions\Authentication_Exception;
|
||
|
|
||
|
/**
|
||
|
* Enqueues polyfills for Promise and Fetch.
|
||
|
*
|
||
|
* @since 2.11
|
||
|
*/
|
||
|
function maybe_enqueue_polyfills() {
|
||
|
/**
|
||
|
* Filters whether or not IE11 polyfills should be loaded.
|
||
|
* Note: This filter may have its default changed at any time, or may entirely
|
||
|
* go away at one point.
|
||
|
*
|
||
|
* @since 2.11
|
||
|
*/
|
||
|
if ( ! apply_filters( 'edd_load_ie11_polyfills', true ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
global $wp_version;
|
||
|
if ( version_compare( $wp_version, '5.0', '>=' ) ) {
|
||
|
wp_enqueue_script( 'wp-polyfill' );
|
||
|
} else {
|
||
|
wp_enqueue_script(
|
||
|
'wp-polyfill',
|
||
|
EDD_PLUGIN_URL . 'assets/js/wp-polyfill.min.js',
|
||
|
array(),
|
||
|
false,
|
||
|
false
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Registers PayPal JavaScript
|
||
|
*
|
||
|
* @param bool $force_load
|
||
|
*
|
||
|
* @since 2.11
|
||
|
* @return void
|
||
|
*/
|
||
|
function register_js( $force_load = false ) {
|
||
|
if ( ! edd_is_gateway_active( 'paypal_commerce' ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( ! ready_to_accept_payments() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
$api = new API();
|
||
|
} catch ( Authentication_Exception $e ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filters the query arguments added to the SDK URL.
|
||
|
*
|
||
|
* @link https://developer.paypal.com/docs/checkout/reference/customize-sdk/#query-parameters
|
||
|
*
|
||
|
* @since 2.11
|
||
|
*/
|
||
|
$sdk_query_args = apply_filters( 'edd_paypal_js_sdk_query_args', array(
|
||
|
'client-id' => urlencode( $api->client_id ),
|
||
|
'currency' => urlencode( strtoupper( edd_get_currency() ) ),
|
||
|
'intent' => 'capture',
|
||
|
'disable-funding' => 'card,credit,bancontact,blik,eps,giropay,ideal,mercadopago,mybank,p24,sepa,sofort,venmo'
|
||
|
) );
|
||
|
|
||
|
wp_register_script(
|
||
|
'sandhills-paypal-js-sdk',
|
||
|
esc_url_raw( add_query_arg( array_filter( $sdk_query_args ), 'https://www.paypal.com/sdk/js' ) )
|
||
|
);
|
||
|
|
||
|
wp_register_script(
|
||
|
'edd-paypal',
|
||
|
EDD_PLUGIN_URL . 'assets/js/paypal-checkout.js',
|
||
|
array(
|
||
|
'sandhills-paypal-js-sdk',
|
||
|
'jquery',
|
||
|
'edd-ajax'
|
||
|
),
|
||
|
EDD_VERSION,
|
||
|
true
|
||
|
);
|
||
|
|
||
|
if ( edd_is_checkout() || $force_load ) {
|
||
|
maybe_enqueue_polyfills();
|
||
|
|
||
|
wp_enqueue_script( 'sandhills-paypal-js-sdk' );
|
||
|
wp_enqueue_script( 'edd-paypal' );
|
||
|
|
||
|
$paypal_script_vars = array(
|
||
|
/**
|
||
|
* Filters the order approval handler.
|
||
|
*
|
||
|
* @since 2.11
|
||
|
*/
|
||
|
'approvalAction' => apply_filters( 'edd_paypal_on_approve_action', 'edd_capture_paypal_order' ),
|
||
|
'defaultError' => edd_build_errors_html( array(
|
||
|
'paypal-error' => esc_html__( 'An unexpected error occurred. Please try again.', 'easy-digital-downloads' )
|
||
|
) ),
|
||
|
'intent' => ! empty( $sdk_query_args['intent'] ) ? $sdk_query_args['intent'] : 'capture',
|
||
|
'style' => get_button_styles(),
|
||
|
);
|
||
|
|
||
|
wp_localize_script( 'edd-paypal', 'eddPayPalVars', $paypal_script_vars );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
add_action( 'wp_enqueue_scripts', __NAMESPACE__ . '\register_js', 100 );
|
||
|
|
||
|
/**
|
||
|
* Removes the "?ver=" query arg from the PayPal JS SDK URL, because PayPal will throw an error
|
||
|
* if it's included.
|
||
|
*
|
||
|
* @param string $url
|
||
|
*
|
||
|
* @since 2.11
|
||
|
* @return string
|
||
|
*/
|
||
|
function remove_ver_query_arg( $url ) {
|
||
|
$sdk_url = 'https://www.paypal.com/sdk/js';
|
||
|
|
||
|
if ( false !== strpos( $url, $sdk_url ) ) {
|
||
|
$new_url = preg_split( "/(&ver|\?ver)/", $url );
|
||
|
|
||
|
return $new_url[0];
|
||
|
}
|
||
|
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
add_filter( 'script_loader_src', __NAMESPACE__ . '\remove_ver_query_arg', 100 );
|
||
|
|
||
|
/**
|
||
|
* Adds data attributes to the PayPal JS SDK <script> tag.
|
||
|
*
|
||
|
* @link https://developer.paypal.com/docs/checkout/reference/customize-sdk/#script-parameters
|
||
|
*
|
||
|
* @since 2.11
|
||
|
*
|
||
|
* @param string $script_tag HTML <script> tag.
|
||
|
* @param string $handle Registered handle.
|
||
|
* @param string $src Script SRC value.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
function add_data_attributes( $script_tag, $handle, $src ) {
|
||
|
if ( 'sandhills-paypal-js-sdk' !== $handle ) {
|
||
|
return $script_tag;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filters the data attributes to add to the <script> tag.
|
||
|
*
|
||
|
* @since 2.11
|
||
|
*
|
||
|
* @param array $data_attributes
|
||
|
*/
|
||
|
$data_attributes = apply_filters( 'edd_paypal_js_sdk_data_attributes', array(
|
||
|
'partner-attribution-id' => EDD_PAYPAL_PARTNER_ATTRIBUTION_ID
|
||
|
) );
|
||
|
|
||
|
if ( empty( $data_attributes ) || ! is_array( $data_attributes ) ) {
|
||
|
return $script_tag;
|
||
|
}
|
||
|
|
||
|
$formatted_attributes = array_map( function ( $key, $value ) {
|
||
|
return sprintf( 'data-%s="%s"', sanitize_html_class( $key ), esc_attr( $value ) );
|
||
|
}, array_keys( $data_attributes ), $data_attributes );
|
||
|
|
||
|
return str_replace( ' src', ' ' . implode( ' ', $formatted_attributes ) . ' src', $script_tag );
|
||
|
}
|
||
|
|
||
|
add_filter( 'script_loader_tag', __NAMESPACE__ . '\add_data_attributes', 10, 3 );
|