laipower/wp-content/plugins/easy-digital-downloads/includes/gateways/paypal/scripts.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 );