1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/**
* This code is in the public domain.
*
* This snippet integrates the OIDC connect button with WooCommerce
* to allow importing the customer's shopping details via OIDC.
*/
/**
* Add OIDC login form to checkout page.
*/
add_action ('openid-connect-generic-register-login-form',
function ( $login_form ) {
// if WooCommerce is inactive, do nothing
if ( ! in_array( 'woocommerce/woocommerce.php',
apply_filters( 'active_plugins',
get_option( 'active_plugins' ) ) ) ) {
return;
}
// show login form at the shopping cart (if not logged in)
add_action( 'woocommerce_before_checkout_billing_form',
function () use ( $login_form ) {
$user = wp_get_current_user ();
if (0 == $user->ID) {
// ID 0 is used to indicate user is not logged in.
// Re-use filter logic to generate login page
print ( $login_form->handle_login_page ('') );
}
});
// Add action to set cookie to redirect back to current
// (checkout) page after OIDC provided the data
add_action( 'woocommerce_before_checkout_billing_form',
array( $login_form, 'handle_redirect_cookie' ) );
}
);
// hook to convert OIDC fields to WC checkout fields if logged in
add_filter( 'woocommerce_checkout_fields',
'filter_checkout_get_value' );
/**
* Filter to transform (defaults) for the Billing details according to
* the information obtained from OpenID Connect (OIDC). WooCommerce
* already grabs many of the values properly, but there are some fields
* which we have to convert manually.
*/
function filter_checkout_get_value ($in=array()){
$user = wp_get_current_user ();
if (0 != $user->ID) {
$token_response = $user->get ('openid-connect-generic-last-user-claim');
if ( (isset( $token_response)) &&
(array_key_exists ('given_name', $token_response)) ){
$given_name = $token_response [ 'given_name' ];
$in['billing']['billing_first_name']['default'] = $given_name;
$in['shipping']['shipping_first_name']['default'] = $given_name;
}
if ( (isset( $token_response)) &&
(array_key_exists ('family_name', $token_response)) ){
$family_name = $token_response [ 'family_name' ];
$in['billing']['billing_last_name']['default'] = $family_name;
$in['shipping']['shipping_last_name']['default'] = $family_name;
}
if ( (isset( $token_response)) &&
(array_key_exists ('phone_number', $token_response)) ){
$phone_number = $token_response [ 'phone_number' ];
$in['billing']['billing_phone']['default'] = $phone_number;
$in['shipping']['shipping_phone']['default'] = $phone_number;
}
if ( (isset( $token_response)) &&
(array_key_exists ('address', $token_response)) ){
$address = $token_response [ 'address' ];
if ( array_key_exists( 'postal_code', $address ) ){
$postal_code = $address [ 'postal_code' ];
$in['billing']['billing_postcode']['default'] = $postal_code;
$in['shipping']['shipping_postcode']['default'] = $postal_code;
}
if ( array_key_exists( 'country', $address ) ){
$country = $address [ 'country' ];
$in['billing']['billing_country']['default'] = $country;
$in['shipping']['shipping_country']['default'] = $country;
}
if ( array_key_exists( 'locality', $address ) ){
$locality = $address [ 'locality' ];
$in['billing']['billing_city']['default'] = $locality;
$in['shipping']['shipping_city']['default'] = $locality;
}
if ( array_key_exists ( 'region', $address ) ){
$region = $address [ 'region' ];
$in['billing']['billing_state']['default'] = $region;
$in['shipping']['shipping_state']['default'] = $region;
}
if ( array_key_exists ( 'formatted', $address ) ){
$formatted = $address [ 'formatted' ];
$lines = explode ( '\r\n', $formatted );
if ( count($lines) > 0 ){
$in['billing']['billing_address_1']['default'] = $lines[0];
$in['shipping']['shipping_address_1']['default'] = $lines[0];
}
if ( count($lines) > 1 ){
$in['billing']['billing_address_2']['default'] = $lines[1];
$in['shipping']['shipping_address_2']['default'] = $lines[1];
}
}
if ( array_key_exists ( 'street_address', $address ) ){
$street_address = $address [ 'street_address' ];
if ( ! array_key_exists ( 'formatted', $address ) ){
$in['billing']['billing_address_1']['default'] = $street_address;
$in['shipping']['shipping_address_1']['default'] = $street_address;
}
}
}
}
return $in;
}
|