-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmembership-profile-field-checkout-page.php
150 lines (129 loc) · 6.54 KB
/
membership-profile-field-checkout-page.php
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
use SkyVerge\WooCommerce\Memberships\Profile_Fields as Profile_Fields_Handler;
use SkyVerge\WooCommerce\Memberships\Profile_Fields\Profile_Field;
use SkyVerge\WooCommerce\Memberships\Profile_Fields\Exceptions\Invalid_Field;
if (!function_exists('on_add_visibility_options')) {
// Ajoute une nouvelle option de visibilité pour les champs de profil de membership
function on_add_visibility_options($options)
{
$options['checkout-page'] = 'Page de commande';
return $options;
}
add_filter('wc_memberships_profile_fields_visibility_options', 'on_add_visibility_options');
// Ajoute la nouvelle option de visibilité accessible à tout les plans d'adhésion
function on_wc_memberships_profile_fields_membership_plan_visibility_options($access, $membership_plan)
{
$access[] = 'checkout-page';
return $access;
}
add_filter('wc_memberships_profile_fields_membership_plan_visibility_options', 'on_wc_memberships_profile_fields_membership_plan_visibility_options', 10, 2);
// Affiche les champs de profil sur la page de commande
function on_woocommerce_checkout_after_customer_details()
{
$cart = WC()->cart;
$items = $cart->get_cart();
$applicable_plans = array();
foreach ($items as $item => $values) {
$_product = wc_get_product($values['data']->get_id());
foreach (wc_memberships()->get_plans_instance()->get_membership_plans_for_product($_product) as $membership_plan) {
$applicable_plans[] = $membership_plan->get_id();
}
}
$profile_field_definitions = Profile_Fields_Handler::get_profile_field_definitions([
'membership_plan_ids' => $applicable_plans,
'visibility' => ['checkout-page'],
'editable_by' => Profile_Fields_Handler\Profile_Field_Definition::EDITABLE_BY_CUSTOMER,
]);
if (empty($profile_field_definitions)) {
return;
}
$posted_data = isset($_POST['member_profile_fields']) ? $_POST['member_profile_fields'] : [];
$user_id = get_current_user_id();
foreach ($profile_field_definitions as $definition) {
$profile_field = Profile_Fields_Handler::get_profile_field($user_id, $definition->get_slug()) ?: new Profile_Field();
$profile_field->set_user_id($user_id);
$profile_field->set_slug($definition->get_slug());
if (isset($posted_data[$profile_field->get_slug()])) {
$profile_field->set_value($posted_data[$profile_field->get_slug()]);
}
$profile_fields[] = $profile_field;
}
?>
<h3 id="order_review_heading">Votre commande</h3>
<p>Merci de remplir ces informations pour mieux vous connaitre</p>
<div class="wc-memberships-profile-fields-wrapper">
<?php foreach ($profile_fields as $profile_field) : ?>
<?php wc_memberships_profile_field_form_field($profile_field); ?>
<?php endforeach; ?>
<input type="hidden" id="wc-memberships-member-profile-fields-membership-plans" name="member_profile_fields_membership_plans" value="<?php echo implode(',', $applicable_plans); ?>" />
</div>
<?php
}
add_action('woocommerce_after_order_notes', 'on_woocommerce_checkout_after_customer_details');
// Enregistre les champs de profil sur la page de commande
function on_woocommerce_checkout_update_order_meta($order)
{
$applicable_plans = explode(',', $_POST['member_profile_fields_membership_plans']);
$profile_field_definitions = Profile_Fields_Handler::get_profile_field_definitions([
'membership_plan_ids' => $applicable_plans,
'visibility' => ['checkout-page'],
'editable_by' => Profile_Fields_Handler\Profile_Field_Definition::EDITABLE_BY_CUSTOMER,
]);
if (empty($profile_field_definitions)) {
return;
}
$user_id = get_current_user_id();
$values = $_POST['member_profile_fields'];
$data = [];
$errors = new \WP_Error();
foreach ($profile_field_definitions as $definition) {
$profile_field = new Profile_Field();
$profile_field->set_user_id($user_id);
$profile_field->set_slug($definition->get_slug());
$profile_field->set_value(isset($_POST['member_profile_fields'][$profile_field->get_slug()]) ? $_POST['member_profile_fields'][$profile_field->get_slug()] : '');
$field_errors = $profile_field->validate();
if ( $message = $field_errors->get_error_message( Invalid_Field::ERROR_REQUIRED_VALUE ) ) {
$errors->add( $profile_field->get_slug(), $message );
continue;
}
if ( $message = $field_errors->get_error_message( Invalid_Field::ERROR_INVALID_VALUE ) ) {
$errors->add( $profile_field->get_slug(), $message );
continue;
}
$data[ $profile_field->get_slug() ] = $profile_field->get_value();
}
if ( $errors->has_errors() ) {
throw new \Exception( $errors->get_error_message() );
return;
}
$order->update_meta_data( Profile_Fields_Handler::ORDER_ITEM_PROFILE_FIELDS_META, $data );
}
add_action('woocommerce_checkout_create_order', 'on_woocommerce_checkout_update_order_meta');
function on_wc_memberships_grant_membership_access_from_purchase($plan, $args)
{
if ( ! isset( $args['order_id'], $args['user_membership_id'] ) || ! $order = wc_get_order( $args['order_id'] ) ) {
return;
}
$data = $order->get_meta(Profile_Fields_Handler::ORDER_ITEM_PROFILE_FIELDS_META);
if (empty($data)) {
return;
}
$user_id = $order->get_user_id();
$profile_fields = Profile_Fields_Handler::get_profile_field_definitions([
'membership_plan_ids' => [$plan->get_id()],
'visibility' => ['checkout-page'],
'editable_by' => Profile_Fields_Handler\Profile_Field_Definition::EDITABLE_BY_CUSTOMER,
]);
foreach ($profile_fields as $profile_field) {
if (isset($data[$profile_field->get_slug()])) {
$value = $data[$profile_field->get_slug()];
$field = new Profile_Field();
$field->set_user_id($user_id);
$field->set_slug($profile_field->get_slug());
$field->set_value($value);
$field->save();
}
}
}
add_action('wc_memberships_grant_membership_access_from_purchase', 'on_wc_memberships_grant_membership_access_from_purchase', 10, 2);
}