Simple Membership - Version 3.4.6

Version Description

  • Added Arabic language translation to the plugin. The translation was submitted by Hanin Fatani.
  • Added an email tag {primary_address} that can be used in the notification email when address field is used in the form builder addon.
  • Removed the unnecessary $_SERVER["REQUEST_URI"] value from the post action.
  • Added reCAPTCHA support on the password reset form (for reCAPTCHA addon).
  • Added an option to specify a custom CSS class for Stripe and Braintree buttons to customize the button style. (The new shortcode parameter is "class").
Download this release

Release Info

Developer mra13
Plugin Icon 128x128 Simple Membership
Version 3.4.6
Comparing to
See all releases

Code changes from version 3.4.5 to 3.4.6

classes/class.swpm-front-registration.php CHANGED
@@ -13,14 +13,14 @@ class SwpmFrontRegistration extends SwpmRegistration {
13
  }
14
 
15
  public function regigstration_ui($level) {
16
-
17
  //Trigger the filter to override the registration form (the form builder addon uses this filter)
18
- $form = apply_filters('swpm_registration_form_override', '', $level);//The $level value could be empty also so the code handling the filter need to check for it.
19
  if (!empty($form)) {
20
  //An addon has overridden the registration form. So use that one.
21
  return $form;
22
  }
23
-
24
  $settings_configs = SwpmSettings::get_instance();
25
  $joinuspage_url = $settings_configs->get_value('join-us-page-url');
26
  $membership_level = '';
@@ -34,15 +34,15 @@ class SwpmFrontRegistration extends SwpmRegistration {
34
  } else {
35
  $membership_level = $member->membership_level;
36
  }
37
- } else if (!empty($level)) {
38
  //Membership level is specified in the shortcode (level specific registration form).
39
  $member = SwpmTransfer::$default_fields;
40
  $membership_level = absint($level);
41
  }
42
-
43
  //Check if free membership registration is disalbed on the site
44
  if (empty($membership_level)) {
45
- $joinuspage_link = '<a href="' . $joinuspage_url . '">'.SwpmUtils::_('Join Us').'</a>';
46
  $free_rego_disabled_msg = '<p>';
47
  $free_rego_disabled_msg .= SwpmUtils::_('Free membership is disabled on this site. Please make a payment from the ' . $joinuspage_link . ' page to pay for a premium membership.');
48
  $free_rego_disabled_msg .= '</p><p>';
@@ -61,7 +61,7 @@ class SwpmFrontRegistration extends SwpmRegistration {
61
  $membership_level_alias = $mebership_info->get('alias');
62
  $swpm_registration_submit = filter_input(INPUT_POST, 'swpm_registration_submit');
63
  if (!empty($swpm_registration_submit)) {
64
- $member = array_map( 'sanitize_text_field', $_POST );
65
  }
66
  ob_start();
67
  extract((array) $member, EXTR_SKIP);
@@ -70,7 +70,7 @@ class SwpmFrontRegistration extends SwpmRegistration {
70
  }
71
 
72
  public function register_front_end() {
73
-
74
  //If captcha is present and validation failed, it returns an error string. If validation succeeds, it returns an empty string.
75
  $captcha_validation_output = apply_filters('swpm_validate_registration_form_submission', '');
76
  if (!empty($captcha_validation_output)) {
@@ -78,19 +78,19 @@ class SwpmFrontRegistration extends SwpmRegistration {
78
  SwpmTransfer::get_instance()->set('status', $message);
79
  return;
80
  }
81
-
82
  //Validate swpm level hash data.
83
  $hash_val_posted = sanitize_text_field($_POST['swpm_level_hash']);
84
  $level_value = sanitize_text_field($_POST['membership_level']);
85
  $swpm_p_key = get_option('swpm_private_key_one');
86
- $hash_val = md5($swpm_p_key.'|'.$level_value);
87
- if($hash_val != $hash_val_posted){//Level hash validation failed.
88
  $msg = '<p>Error! Security check failed for membership level validation.</p>';
89
  $msg .= '<p>The submitted membership level data does not seem to be authentic.</p>';
90
  $msg .= '<p>If you are using caching please empty the cache data and try again.</p>';
91
  wp_die($msg);
92
  }
93
-
94
  //Crete the member profile and send notification
95
  if ($this->create_swpm_user() && $this->prepare_and_create_wp_user_front_end() && $this->send_reg_email()) {
96
  do_action('swpm_front_end_registration_complete'); //Keep this action hook for people who are using it (so their implementation doesn't break).
@@ -98,7 +98,7 @@ class SwpmFrontRegistration extends SwpmRegistration {
98
 
99
  $login_page_url = SwpmSettings::get_instance()->get_value('login-page-url');
100
  $after_rego_msg = '<div class="swpm-registration-success-msg">' . SwpmUtils::_('Registration Successful. ') . SwpmUtils::_('Please') . ' <a href="' . $login_page_url . '">' . SwpmUtils::_('Login') . '</a></div>';
101
- $after_rego_msg = apply_filters ('swpm_registration_success_msg', $after_rego_msg);
102
  $message = array('succeeded' => true, 'message' => $after_rego_msg);
103
  SwpmTransfer::get_instance()->set('status', $message);
104
  return;
@@ -117,20 +117,20 @@ class SwpmFrontRegistration extends SwpmRegistration {
117
  }
118
 
119
  $member_info = $form->get_sanitized_member_form_data();
120
-
121
  //Check if the email belongs to an existing wp user account with admin role.
122
  $wp_user_id = email_exists($member_info['email']);
123
  if ($wp_user_id) {
124
  //A wp user account exist with this email.
125
  //Check if the user has admin role.
126
  $admin_user = SwpmMemberUtils::wp_user_has_admin_role($wp_user_id);
127
- if($admin_user){
128
  //This email belongs to an admin user. Update is not allowed on admin users. Show error message then exit.
129
- $error_msg = '<p>This email address ('.$member_info['email'].') belongs to an admin user. This email cannot be used to register a new account on this site.</p>';
130
- wp_die($error_msg);
131
  }
132
  }
133
-
134
  //Go ahead and create the SWPM user record.
135
  $free_level = SwpmUtils::get_free_level();
136
  $account_status = SwpmSettings::get_instance()->get_value('default-account-status', 'active');
@@ -167,14 +167,14 @@ class SwpmFrontRegistration extends SwpmRegistration {
167
  private function prepare_and_create_wp_user_front_end() {
168
  global $wpdb;
169
  $member_info = $this->member_info;
170
-
171
  //Retrieve the user role assigned for this level
172
  $query = $wpdb->prepare("SELECT role FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $member_info['membership_level']);
173
  $user_role = $wpdb->get_var($query);
174
  //Check to make sure that the user role of this level is not admin.
175
- if($user_role == 'administrator'){
176
  //For security reasons we don't allow users with administrator role to be creted from the front-end. That can only be done from the admin dashboard side.
177
- $error_msg = '<p>Error! The user role for this membership level (level ID: '.$member_info['membership_level'].') is set to "Administrator".</p>';
178
  $error_msg .= '<p>For security reasons, member registration to this level is not permitted from the front end.</p>';
179
  $error_msg .= '<p>An administrator of the site can manually create a member record with this access level from the admin dashboard side.</p>';
180
  wp_die($error_msg);
@@ -202,19 +202,20 @@ class SwpmFrontRegistration extends SwpmRegistration {
202
  if (!$auth->is_logged_in()) {
203
  return;
204
  }
205
-
206
  //Check nonce
207
- if ( !isset($_POST['swpm_profile_edit_nonce_val']) || !wp_verify_nonce($_POST['swpm_profile_edit_nonce_val'], 'swpm_profile_edit_nonce_action' )){
208
  //Nonce check failed.
209
  wp_die(SwpmUtils::_("Error! Nonce verification failed for front end profile edit."));
210
  }
211
-
212
  $user_data = (array) $auth->userData;
213
  unset($user_data['permitted']);
214
  $form = new SwpmForm($user_data);
215
  if ($form->is_valid()) {
216
  global $wpdb;
217
- $message = array('succeeded' => true, 'message' => SwpmUtils::_('Profile updated successfully.'));
 
218
 
219
  $member_info = $form->get_sanitized_member_form_data();
220
  SwpmUtils::update_wp_user($auth->get('user_name'), $member_info); //Update corresponding wp user record.
@@ -222,7 +223,8 @@ class SwpmFrontRegistration extends SwpmRegistration {
222
 
223
  if (isset($member_info['plain_password'])) {
224
  //Password was also changed so show the appropriate message
225
- $message = array('succeeded' => true, 'message' => SwpmUtils::_('Profile updated successfully. You will need to re-login since you changed your password.'));
 
226
  unset($member_info['plain_password']);
227
  }
228
 
@@ -231,16 +233,26 @@ class SwpmFrontRegistration extends SwpmRegistration {
231
 
232
  SwpmTransfer::get_instance()->set('status', $message);
233
  do_action('swpm_front_end_profile_edited', $member_info);
234
- return true;//Successful form submission.
235
  } else {
236
- $message = array('succeeded' => false, 'message' => SwpmUtils::_('Please correct the following'),
237
- 'extra' => $form->get_errors());
238
  SwpmTransfer::get_instance()->set('status', $message);
239
- return false;//Error in the form submission.
240
  }
241
  }
242
 
243
  public function reset_password($email) {
 
 
 
 
 
 
 
 
 
 
244
  $email = sanitize_email($email);
245
  if (!is_email($email)) {
246
  $message = '<div class="swpm-reset-pw-error">' . SwpmUtils::_("Email address not valid.") . '</div>';
@@ -267,7 +279,7 @@ class SwpmFrontRegistration extends SwpmRegistration {
267
  $wpdb->update($wpdb->prefix . "swpm_members_tbl", array('password' => $password_hash), array('member_id' => $user->member_id));
268
 
269
  //Update wp user password
270
- add_filter('send_password_change_email', array(&$this, 'dont_send_password_change_email'),1,3);//Stop wordpress from sending a reset password email to admin.
271
  SwpmUtils::update_wp_user($user->user_name, array('plain_password' => $password));
272
 
273
  $body = $settings->get_value('reset-mail-body');
@@ -278,19 +290,21 @@ class SwpmFrontRegistration extends SwpmRegistration {
278
  $from = $settings->get_value('email-from');
279
  $headers = "From: " . $from . "\r\n";
280
  wp_mail($email, $subject, $body, $headers);
281
- SwpmLog::log_simple_debug("Member password has been reset. Password reset email sent to: ".$email,true);
282
-
283
- $message = '<div class="swpm-reset-pw-success">' . SwpmUtils::_("New password has been sent to your email address.") . '</div>';
 
284
  $message .= '<div class="swpm-reset-pw-success-email">' . SwpmUtils::_("Email Address: ") . $email . '</div>';
 
285
 
286
  $message = array('succeeded' => false, 'message' => $message);
287
  SwpmTransfer::get_instance()->set('status', $message);
288
  }
289
 
290
- function dont_send_password_change_email($send=false, $user='', $userdata='')
291
- {
292
  //Stop the WordPress's default password change email notification to site admin
293
  //Only the simple membership plugin's password reset email will be sent.
294
  return false;
295
  }
 
296
  }
13
  }
14
 
15
  public function regigstration_ui($level) {
16
+
17
  //Trigger the filter to override the registration form (the form builder addon uses this filter)
18
+ $form = apply_filters('swpm_registration_form_override', '', $level); //The $level value could be empty also so the code handling the filter need to check for it.
19
  if (!empty($form)) {
20
  //An addon has overridden the registration form. So use that one.
21
  return $form;
22
  }
23
+
24
  $settings_configs = SwpmSettings::get_instance();
25
  $joinuspage_url = $settings_configs->get_value('join-us-page-url');
26
  $membership_level = '';
34
  } else {
35
  $membership_level = $member->membership_level;
36
  }
37
+ } else if (!empty($level)) {
38
  //Membership level is specified in the shortcode (level specific registration form).
39
  $member = SwpmTransfer::$default_fields;
40
  $membership_level = absint($level);
41
  }
42
+
43
  //Check if free membership registration is disalbed on the site
44
  if (empty($membership_level)) {
45
+ $joinuspage_link = '<a href="' . $joinuspage_url . '">' . SwpmUtils::_('Join Us') . '</a>';
46
  $free_rego_disabled_msg = '<p>';
47
  $free_rego_disabled_msg .= SwpmUtils::_('Free membership is disabled on this site. Please make a payment from the ' . $joinuspage_link . ' page to pay for a premium membership.');
48
  $free_rego_disabled_msg .= '</p><p>';
61
  $membership_level_alias = $mebership_info->get('alias');
62
  $swpm_registration_submit = filter_input(INPUT_POST, 'swpm_registration_submit');
63
  if (!empty($swpm_registration_submit)) {
64
+ $member = array_map('sanitize_text_field', $_POST);
65
  }
66
  ob_start();
67
  extract((array) $member, EXTR_SKIP);
70
  }
71
 
72
  public function register_front_end() {
73
+
74
  //If captcha is present and validation failed, it returns an error string. If validation succeeds, it returns an empty string.
75
  $captcha_validation_output = apply_filters('swpm_validate_registration_form_submission', '');
76
  if (!empty($captcha_validation_output)) {
78
  SwpmTransfer::get_instance()->set('status', $message);
79
  return;
80
  }
81
+
82
  //Validate swpm level hash data.
83
  $hash_val_posted = sanitize_text_field($_POST['swpm_level_hash']);
84
  $level_value = sanitize_text_field($_POST['membership_level']);
85
  $swpm_p_key = get_option('swpm_private_key_one');
86
+ $hash_val = md5($swpm_p_key . '|' . $level_value);
87
+ if ($hash_val != $hash_val_posted) {//Level hash validation failed.
88
  $msg = '<p>Error! Security check failed for membership level validation.</p>';
89
  $msg .= '<p>The submitted membership level data does not seem to be authentic.</p>';
90
  $msg .= '<p>If you are using caching please empty the cache data and try again.</p>';
91
  wp_die($msg);
92
  }
93
+
94
  //Crete the member profile and send notification
95
  if ($this->create_swpm_user() && $this->prepare_and_create_wp_user_front_end() && $this->send_reg_email()) {
96
  do_action('swpm_front_end_registration_complete'); //Keep this action hook for people who are using it (so their implementation doesn't break).
98
 
99
  $login_page_url = SwpmSettings::get_instance()->get_value('login-page-url');
100
  $after_rego_msg = '<div class="swpm-registration-success-msg">' . SwpmUtils::_('Registration Successful. ') . SwpmUtils::_('Please') . ' <a href="' . $login_page_url . '">' . SwpmUtils::_('Login') . '</a></div>';
101
+ $after_rego_msg = apply_filters('swpm_registration_success_msg', $after_rego_msg);
102
  $message = array('succeeded' => true, 'message' => $after_rego_msg);
103
  SwpmTransfer::get_instance()->set('status', $message);
104
  return;
117
  }
118
 
119
  $member_info = $form->get_sanitized_member_form_data();
120
+
121
  //Check if the email belongs to an existing wp user account with admin role.
122
  $wp_user_id = email_exists($member_info['email']);
123
  if ($wp_user_id) {
124
  //A wp user account exist with this email.
125
  //Check if the user has admin role.
126
  $admin_user = SwpmMemberUtils::wp_user_has_admin_role($wp_user_id);
127
+ if ($admin_user) {
128
  //This email belongs to an admin user. Update is not allowed on admin users. Show error message then exit.
129
+ $error_msg = '<p>This email address (' . $member_info['email'] . ') belongs to an admin user. This email cannot be used to register a new account on this site.</p>';
130
+ wp_die($error_msg);
131
  }
132
  }
133
+
134
  //Go ahead and create the SWPM user record.
135
  $free_level = SwpmUtils::get_free_level();
136
  $account_status = SwpmSettings::get_instance()->get_value('default-account-status', 'active');
167
  private function prepare_and_create_wp_user_front_end() {
168
  global $wpdb;
169
  $member_info = $this->member_info;
170
+
171
  //Retrieve the user role assigned for this level
172
  $query = $wpdb->prepare("SELECT role FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $member_info['membership_level']);
173
  $user_role = $wpdb->get_var($query);
174
  //Check to make sure that the user role of this level is not admin.
175
+ if ($user_role == 'administrator') {
176
  //For security reasons we don't allow users with administrator role to be creted from the front-end. That can only be done from the admin dashboard side.
177
+ $error_msg = '<p>Error! The user role for this membership level (level ID: ' . $member_info['membership_level'] . ') is set to "Administrator".</p>';
178
  $error_msg .= '<p>For security reasons, member registration to this level is not permitted from the front end.</p>';
179
  $error_msg .= '<p>An administrator of the site can manually create a member record with this access level from the admin dashboard side.</p>';
180
  wp_die($error_msg);
202
  if (!$auth->is_logged_in()) {
203
  return;
204
  }
205
+
206
  //Check nonce
207
+ if (!isset($_POST['swpm_profile_edit_nonce_val']) || !wp_verify_nonce($_POST['swpm_profile_edit_nonce_val'], 'swpm_profile_edit_nonce_action')) {
208
  //Nonce check failed.
209
  wp_die(SwpmUtils::_("Error! Nonce verification failed for front end profile edit."));
210
  }
211
+
212
  $user_data = (array) $auth->userData;
213
  unset($user_data['permitted']);
214
  $form = new SwpmForm($user_data);
215
  if ($form->is_valid()) {
216
  global $wpdb;
217
+ $msg_str = '<div class="swpm-profile-update-success">' . SwpmUtils::_('Profile updated successfully.') . '</div>';
218
+ $message = array('succeeded' => true, 'message' => $msg_str);
219
 
220
  $member_info = $form->get_sanitized_member_form_data();
221
  SwpmUtils::update_wp_user($auth->get('user_name'), $member_info); //Update corresponding wp user record.
223
 
224
  if (isset($member_info['plain_password'])) {
225
  //Password was also changed so show the appropriate message
226
+ $msg_str = '<div class="swpm-profile-update-success">' . SwpmUtils::_('Profile updated successfully. You will need to re-login since you changed your password.') . '</div>';
227
+ $message = array('succeeded' => true, 'message' => $msg_str);
228
  unset($member_info['plain_password']);
229
  }
230
 
233
 
234
  SwpmTransfer::get_instance()->set('status', $message);
235
  do_action('swpm_front_end_profile_edited', $member_info);
236
+ return true; //Successful form submission.
237
  } else {
238
+ $msg_str = '<div class="swpm-profile-update-error">' . SwpmUtils::_('Please correct the following.') . '</div>';
239
+ $message = array('succeeded' => false, 'message' => $msg_str, 'extra' => $form->get_errors());
240
  SwpmTransfer::get_instance()->set('status', $message);
241
+ return false; //Error in the form submission.
242
  }
243
  }
244
 
245
  public function reset_password($email) {
246
+
247
+ //If captcha is present and validation failed, it returns an error string. If validation succeeds, it returns an empty string.
248
+ $captcha_validation_output = apply_filters('swpm_validate_pass_reset_form_submission', '');
249
+ if (!empty($captcha_validation_output)) {
250
+ $message = '<div class="swpm-reset-pw-error">' . SwpmUtils::_("Captcha validation failed.") . '</div>';
251
+ $message = array('succeeded' => false, 'message' => $message);
252
+ SwpmTransfer::get_instance()->set('status', $message);
253
+ return;
254
+ }
255
+
256
  $email = sanitize_email($email);
257
  if (!is_email($email)) {
258
  $message = '<div class="swpm-reset-pw-error">' . SwpmUtils::_("Email address not valid.") . '</div>';
279
  $wpdb->update($wpdb->prefix . "swpm_members_tbl", array('password' => $password_hash), array('member_id' => $user->member_id));
280
 
281
  //Update wp user password
282
+ add_filter('send_password_change_email', array(&$this, 'dont_send_password_change_email'), 1, 3); //Stop wordpress from sending a reset password email to admin.
283
  SwpmUtils::update_wp_user($user->user_name, array('plain_password' => $password));
284
 
285
  $body = $settings->get_value('reset-mail-body');
290
  $from = $settings->get_value('email-from');
291
  $headers = "From: " . $from . "\r\n";
292
  wp_mail($email, $subject, $body, $headers);
293
+ SwpmLog::log_simple_debug("Member password has been reset. Password reset email sent to: " . $email, true);
294
+
295
+ $message = '<div class="swpm-reset-pw-success-box">';
296
+ $message .= '<div class="swpm-reset-pw-success">' . SwpmUtils::_("New password has been sent to your email address.") . '</div>';
297
  $message .= '<div class="swpm-reset-pw-success-email">' . SwpmUtils::_("Email Address: ") . $email . '</div>';
298
+ $message .= '</div>';
299
 
300
  $message = array('succeeded' => false, 'message' => $message);
301
  SwpmTransfer::get_instance()->set('status', $message);
302
  }
303
 
304
+ function dont_send_password_change_email($send = false, $user = '', $userdata = '') {
 
305
  //Stop the WordPress's default password change email notification to site admin
306
  //Only the simple membership plugin's password reset email will be sent.
307
  return false;
308
  }
309
+
310
  }
classes/class.swpm-members.php CHANGED
@@ -461,7 +461,7 @@ class SwpmMembers extends WP_List_Table {
461
  <?php SwpmUtils::e('You can manually change the membership level of any member by editing the record from the members menu. '); ?>
462
  <?php SwpmUtils::e('You can use the following option to bulk update the membership level of users who belong to the level you select below.'); ?>
463
  </p>
464
- <form method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>">
465
  <table width="100%" border="0" cellspacing="0" cellpadding="6">
466
  <tr valign="top">
467
  <td width="25%" align="left">
@@ -508,7 +508,7 @@ class SwpmMembers extends WP_List_Table {
508
  <?php SwpmUtils::e('The access starts date of a member is set to the day the user registers. This date value is used to calculate how long the member can access your content that are protected with a duration type protection in the membership level. '); ?>
509
  <?php SwpmUtils::e('You can manually set a specific access starts date value of all members who belong to a particular level using the following option.'); ?>
510
  </p>
511
- <form method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>">
512
 
513
  <table width="100%" border="0" cellspacing="0" cellpadding="6">
514
  <tr valign="top">
461
  <?php SwpmUtils::e('You can manually change the membership level of any member by editing the record from the members menu. '); ?>
462
  <?php SwpmUtils::e('You can use the following option to bulk update the membership level of users who belong to the level you select below.'); ?>
463
  </p>
464
+ <form method="post" action="">
465
  <table width="100%" border="0" cellspacing="0" cellpadding="6">
466
  <tr valign="top">
467
  <td width="25%" align="left">
508
  <?php SwpmUtils::e('The access starts date of a member is set to the day the user registers. This date value is used to calculate how long the member can access your content that are protected with a duration type protection in the membership level. '); ?>
509
  <?php SwpmUtils::e('You can manually set a specific access starts date value of all members who belong to a particular level using the following option.'); ?>
510
  </p>
511
+ <form method="post" action="">
512
 
513
  <table width="100%" border="0" cellspacing="0" cellpadding="6">
514
  <tr valign="top">
classes/class.swpm-utils-misc.php CHANGED
@@ -187,17 +187,34 @@ class SwpmMiscUtils {
187
  $reg_link = isset($additional_args['reg_link']) ? $additional_args['reg_link'] : $reg_link;
188
  }
189
  $login_link = $settings->get_value('login-page-url');
190
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  //Define the replacable tags
192
  $tags = array("{member_id}", "{user_name}", "{first_name}", "{last_name}", "{membership_level}",
193
  "{account_state}", "{email}", "{phone}", "{member_since}", "{subscription_starts}", "{company_name}",
194
- "{password}", "{login_link}", "{reg_link}"
195
  );
196
 
197
  //Define the values
198
  $vals = array($member_id, $user_record->user_name, $user_record->first_name, $user_record->last_name, $user_record->membership_level,
199
  $user_record->account_state, $user_record->email, $user_record->phone, $user_record->member_since, $user_record->subscription_starts, $user_record->company_name,
200
- $password, $login_link, $reg_link
201
  );
202
 
203
  $msg_body = str_replace($tags, $vals, $msg_body);
187
  $reg_link = isset($additional_args['reg_link']) ? $additional_args['reg_link'] : $reg_link;
188
  }
189
  $login_link = $settings->get_value('login-page-url');
190
+
191
+ //Construct the primary address value
192
+ $primary_address = "";
193
+ if(!empty($user_record->address_street) && !empty($user_record->address_city)){
194
+ //An address value is present.
195
+ $primary_address .= $user_record->address_street;
196
+ $primary_address .= "\n" . $user_record->address_city;
197
+ if(!empty($user_record->address_state)){
198
+ $primary_address .= " " . $user_record->address_state;
199
+ }
200
+ if(!empty($user_record->address_zipcode)){
201
+ $primary_address .= " " . $user_record->address_zipcode;
202
+ }
203
+ if(!empty($user_record->country)){
204
+ $primary_address .= "\n" . $user_record->country;
205
+ }
206
+ }
207
+
208
  //Define the replacable tags
209
  $tags = array("{member_id}", "{user_name}", "{first_name}", "{last_name}", "{membership_level}",
210
  "{account_state}", "{email}", "{phone}", "{member_since}", "{subscription_starts}", "{company_name}",
211
+ "{password}", "{login_link}", "{reg_link}", "{primary_address}"
212
  );
213
 
214
  //Define the values
215
  $vals = array($member_id, $user_record->user_name, $user_record->first_name, $user_record->last_name, $user_record->membership_level,
216
  $user_record->account_state, $user_record->email, $user_record->phone, $user_record->member_since, $user_record->subscription_starts, $user_record->company_name,
217
+ $password, $login_link, $reg_link, $primary_address
218
  );
219
 
220
  $msg_body = str_replace($tags, $vals, $msg_body);
classes/shortcode-related/class.swpm-shortcodes-handler.php CHANGED
@@ -15,6 +15,7 @@ class SwpmShortcodesHandler {
15
  'id' => '',
16
  'button_text' => '',
17
  'new_window' => '',
 
18
  ), $args));
19
 
20
  if (empty($id)) {
15
  'id' => '',
16
  'button_text' => '',
17
  'new_window' => '',
18
+ 'class' => '',
19
  ), $args));
20
 
21
  if (empty($id)) {
css/swpm.common.css CHANGED
@@ -106,6 +106,20 @@
106
  .swpm-pw-reset-widget-form td{
107
  border: none;
108
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
 
110
  /* Registration form CSS */
111
  .swpm-registration-widget-form td{
@@ -130,7 +144,14 @@
130
  .swpm-profile-account-delete-section a{
131
  color: red !important;
132
  }
133
-
 
 
 
 
 
 
 
134
  /* Misc CSS */
135
  .swpm-restricted{
136
  font-weight: bold;
106
  .swpm-pw-reset-widget-form td{
107
  border: none;
108
  }
109
+ .swpm-reset-pw-error{
110
+ font-weight: bold;
111
+ color: red;
112
+ }
113
+ .swpm-reset-pw-success-box{
114
+ margin: 10px 0px;
115
+ padding: 15px 10px;
116
+ background-color: #CCF4D6;
117
+ border-color: #059B53;
118
+ color: #043B14;
119
+ border-radius: 3px 3px 3px 3px;
120
+ border-style: solid;
121
+ border-width: 1px;
122
+ }
123
 
124
  /* Registration form CSS */
125
  .swpm-registration-widget-form td{
144
  .swpm-profile-account-delete-section a{
145
  color: red !important;
146
  }
147
+ .swpm-profile-update-success{
148
+ font-weight: bold;
149
+ color: green;
150
+ }
151
+ .swpm-profile-update-error{
152
+ font-weight: bold;
153
+ color: red;
154
+ }
155
  /* Misc CSS */
156
  .swpm-restricted{
157
  font-weight: bold;
languages/swpm-ar_SA.mo ADDED
Binary file
languages/swpm-ar_SA.po ADDED
@@ -0,0 +1,929 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Simple Membership\n"
4
+ "POT-Creation-Date: 2017-03-31 15:23+0300\n"
5
+ "PO-Revision-Date: 2017-03-31 22:50+0300\n"
6
+ "Language-Team: \n"
7
+ "MIME-Version: 1.0\n"
8
+ "Content-Type: text/plain; charset=UTF-8\n"
9
+ "Content-Transfer-Encoding: 8bit\n"
10
+ "X-Generator: Poedit 2.0\n"
11
+ "X-Poedit-KeywordsList: __;_e\n"
12
+ "X-Poedit-Basepath: .\n"
13
+ "Last-Translator: \n"
14
+ "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
15
+ "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
16
+ "Language: ar_SA\n"
17
+ "X-Poedit-SearchPath-0: .\n"
18
+
19
+ #: simple-membership/classes/class.bAccessControl.php:21
20
+ #: simple-membership/classes/class.bAccessControl.php:28
21
+ #: simple-membership/classes/class.bAccessControl.php:48
22
+ msgid "You need to login to view this content. "
23
+ msgstr "تحتاج إلى تسجيل الدخول لعرض هذا المحتوى. "
24
+
25
+ #: simple-membership/classes/class.bAccessControl.php:35
26
+ #: simple-membership/classes/class.bAccessControl.php:39
27
+ #: simple-membership/classes/class.bAccessControl.php:54
28
+ msgid "You are not allowed to view this content"
29
+ msgstr "غير مسموح لك بعرض هذا المحتوى"
30
+
31
+ #: simple-membership/classes/class.bAccessControl.php:72
32
+ msgid "You do no have permission to view rest of the content"
33
+ msgstr "ليس لديك الإذن لعرض باقي محتوى"
34
+
35
+ #: simple-membership/classes/class.bAccessControl.php:76
36
+ #: simple-membership/classes/class.bAccessControl.php:94
37
+ msgid "You need to login to view the rest of the content. "
38
+ msgstr "تحتاج إلى تسجيل الدخول لعرض بقية المحتوى. "
39
+
40
+ #: simple-membership/classes/class.bAdminRegistration.php:49
41
+ msgid "Registration Successful."
42
+ msgstr "تم التسجيل بنجاح."
43
+
44
+ #: simple-membership/classes/class.bAdminRegistration.php:54
45
+ #: simple-membership/classes/class.bAdminRegistration.php:89
46
+ #: simple-membership/classes/class.bMembershipLevel.php:42
47
+ #: simple-membership/classes/class.bMembershipLevel.php:60
48
+ msgid "Please correct the following:"
49
+ msgstr "الرجاء تصحيح ما يلي:"
50
+
51
+ #: simple-membership/classes/class.bAjax.php:17
52
+ #: simple-membership/classes/class.bAjax.php:28
53
+ msgid "Aready taken"
54
+ msgstr "حٌجز بالفعل"
55
+
56
+ #: simple-membership/classes/class.bAjax.php:29
57
+ msgid "Available"
58
+ msgstr "متوفر"
59
+
60
+ #: simple-membership/classes/class.bAuth.php:46
61
+ #: simple-membership/classes/class.bFrontRegistration.php:173
62
+ msgid "User Not Found."
63
+ msgstr "لم يتم العثور على المستخدم."
64
+
65
+ #: simple-membership/classes/class.bAuth.php:53
66
+ msgid "Password Empty or Invalid."
67
+ msgstr "كلمة مرور فارغة أو صالحة."
68
+
69
+ #: simple-membership/classes/class.bAuth.php:76
70
+ msgid "Account is inactive."
71
+ msgstr "الحساب غير نشط."
72
+
73
+ #: simple-membership/classes/class.bAuth.php:93
74
+ msgid "Account has expired."
75
+ msgstr "انتهت صلاحية الحساب."
76
+
77
+ #: simple-membership/classes/class.bAuth.php:100
78
+ msgid "You are logged in as:"
79
+ msgstr "أنت مسجل الدخول باسم:"
80
+
81
+ #: simple-membership/classes/class.bAuth.php:139
82
+ msgid "Logged Out Successfully."
83
+ msgstr "تم تسجيل الخروج بنجاح."
84
+
85
+ #: simple-membership/classes/class.bAuth.php:186
86
+ msgid "Session Expired."
87
+ msgstr "انتهت الجلسة."
88
+
89
+ #: simple-membership/classes/class.bAuth.php:194
90
+ msgid "Invalid User Name"
91
+ msgstr "اسم المستخدم غير صالح"
92
+
93
+ #: simple-membership/classes/class.bAuth.php:202
94
+ msgid "Sorry! Something went wrong"
95
+ msgstr "المعذرة هناك خطأ ما"
96
+
97
+ #: simple-membership/classes/class.bCategoryList.php:15
98
+ #: simple-membership/classes/class.bMembers.php:21
99
+ #: simple-membership/classes/class.bMembershipLevels.php:8
100
+ #: simple-membership/classes/class.bMembershipLevels.php:17
101
+ #: simple-membership/views/add.php:30
102
+ #: simple-membership/views/admin_member_form_common_part.php:2
103
+ #: simple-membership/views/edit.php:52
104
+ msgid "Membership Level"
105
+ msgstr "مستوى العضوية"
106
+
107
+ #: simple-membership/classes/class.bCategoryList.php:16
108
+ #: simple-membership/classes/class.bMembershipLevels.php:9
109
+ #: simple-membership/classes/class.simple-wp-membership.php:464
110
+ msgid "Membership Levels"
111
+ msgstr "مستويات العضوية"
112
+
113
+ #: simple-membership/classes/class.bCategoryList.php:29
114
+ #: simple-membership/classes/class.bMembers.php:16
115
+ #: simple-membership/classes/class.bMembershipLevels.php:16
116
+ msgid "ID"
117
+ msgstr "الرقم التعريفي"
118
+
119
+ #: simple-membership/classes/class.bCategoryList.php:30
120
+ msgid "Name"
121
+ msgstr "الاسم"
122
+
123
+ #: simple-membership/classes/class.bCategoryList.php:31
124
+ msgid "Description"
125
+ msgstr "الوصف"
126
+
127
+ #: simple-membership/classes/class.bCategoryList.php:32
128
+ msgid "Count"
129
+ msgstr "العدد"
130
+
131
+ #: simple-membership/classes/class.bCategoryList.php:63
132
+ msgid "Updated! "
133
+ msgstr "تم التحديث! "
134
+
135
+ #: simple-membership/classes/class.bForm.php:26
136
+ msgid ""
137
+ "Wordpress account exists with given user name. But given email doesn't match."
138
+ msgstr "يوجد حساب وردبريس بهذا الاسم. ولكن البريد الإلكتروني غير متطابق."
139
+
140
+ #: simple-membership/classes/class.bForm.php:31
141
+ msgid ""
142
+ "Wordpress account exists with given email. But given user name doesn't match."
143
+ msgstr ""
144
+ "يوجد حساب وردبريس بهذا البريد الإلكتروني. ولكن اسم المستخدم غير متطابق."
145
+
146
+ #: simple-membership/classes/class.bForm.php:40
147
+ msgid "User name is required"
148
+ msgstr "اسم المستخدم مطلوب"
149
+
150
+ #: simple-membership/classes/class.bForm.php:44
151
+ msgid "User name contains invalid character"
152
+ msgstr "اسم المستخدم يحتوي على رموز غير صالحة"
153
+
154
+ #: simple-membership/classes/class.bForm.php:52
155
+ msgid "User name already exists."
156
+ msgstr "اسم المستخدم موجود مسبقاً."
157
+
158
+ #: simple-membership/classes/class.bForm.php:75
159
+ msgid "Password is required"
160
+ msgstr "الرقم السري مطلوب"
161
+
162
+ #: simple-membership/classes/class.bForm.php:82
163
+ msgid "Password mismatch"
164
+ msgstr "الرقم السري غير متطابق"
165
+
166
+ #: simple-membership/classes/class.bForm.php:98
167
+ msgid "Email is required"
168
+ msgstr "البريد الإلكتروني مطلوب"
169
+
170
+ #: simple-membership/classes/class.bForm.php:102
171
+ msgid "Email is invalid"
172
+ msgstr "البريد الإلكتروني غير صالح"
173
+
174
+ #: simple-membership/classes/class.bForm.php:118
175
+ msgid "Email is already used."
176
+ msgstr "البريد الإلكتروني موجود مسبقاً."
177
+
178
+ #: simple-membership/classes/class.bForm.php:184
179
+ msgid "Member since field is invalid"
180
+ msgstr "حقل \"عضو منذ\" غير صالح"
181
+
182
+ #: simple-membership/classes/class.bForm.php:195
183
+ msgid "Access starts field is invalid"
184
+ msgstr "حقل \"إتاحة الوصول بدأ\" غير صالح"
185
+
186
+ #: simple-membership/classes/class.bForm.php:205
187
+ msgid "Gender field is invalid"
188
+ msgstr "حقل \"الجنس\" غير صالح"
189
+
190
+ #: simple-membership/classes/class.bForm.php:216
191
+ msgid "Account state field is invalid"
192
+ msgstr "حقل \"حالة الحساب\" غير صالح"
193
+
194
+ #: simple-membership/classes/class.bForm.php:223
195
+ msgid "Invalid membership level"
196
+ msgstr "مستوى عضوية غير صالح"
197
+
198
+ #: simple-membership/classes/class.bFrontRegistration.php:61
199
+ msgid "Registration Successful. "
200
+ msgstr "تم التسجيل بنجاح. "
201
+
202
+ #: simple-membership/classes/class.bFrontRegistration.php:61
203
+ #: simple-membership/classes/class.bSettings.php:367
204
+ msgid "Please"
205
+ msgstr "أرجو"
206
+
207
+ #: simple-membership/classes/class.bFrontRegistration.php:61
208
+ #: simple-membership/classes/class.bSettings.php:367
209
+ #: simple-membership/views/login.php:21
210
+ msgid "Login"
211
+ msgstr "تسجيل الدخول"
212
+
213
+ #: simple-membership/classes/class.bFrontRegistration.php:72
214
+ #: simple-membership/classes/class.bFrontRegistration.php:152
215
+ msgid "Please correct the following"
216
+ msgstr "أرجو تصحيح ما يلي"
217
+
218
+ #: simple-membership/classes/class.bFrontRegistration.php:106
219
+ msgid "Membership Level Couldn't be found."
220
+ msgstr "مستوى العضوية هذا غير موجود."
221
+
222
+ #: simple-membership/classes/class.bFrontRegistration.php:162
223
+ msgid "Email Address Not Valid."
224
+ msgstr "عنوان بريد إلكتروني غير صالح."
225
+
226
+ #: simple-membership/classes/class.bFrontRegistration.php:193
227
+ msgid "New password has been sent to your email address."
228
+ msgstr "رقم سري جديد تم إرساله إلى بريدك الإلكتروني."
229
+
230
+ #: simple-membership/classes/class.bLevelForm.php:47
231
+ msgid "Date format is not valid."
232
+ msgstr "صيغة التاريخ غير صالحة."
233
+
234
+ #: simple-membership/classes/class.bLevelForm.php:54
235
+ msgid "Access duration must be > 0."
236
+ msgstr "مدة إتاحة الوصول يجب أن تكون أكبر من صفر."
237
+
238
+ #: simple-membership/classes/class.bMembers.php:7
239
+ msgid "Member"
240
+ msgstr "عضو"
241
+
242
+ #: simple-membership/classes/class.bMembers.php:8
243
+ #: simple-membership/classes/class.simple-wp-membership.php:462
244
+ msgid "Members"
245
+ msgstr "أعضاء"
246
+
247
+ #: simple-membership/classes/class.bMembers.php:17
248
+ #: simple-membership/views/add.php:6 simple-membership/views/edit.php:4
249
+ msgid "User Name"
250
+ msgstr "اسم المستخدم"
251
+
252
+ #: simple-membership/classes/class.bMembers.php:18
253
+ #: simple-membership/views/add.php:22
254
+ #: simple-membership/views/admin_member_form_common_part.php:15
255
+ #: simple-membership/views/edit.php:20
256
+ msgid "First Name"
257
+ msgstr "الاسم الأول"
258
+
259
+ #: simple-membership/classes/class.bMembers.php:19
260
+ #: simple-membership/views/add.php:26
261
+ #: simple-membership/views/admin_member_form_common_part.php:19
262
+ #: simple-membership/views/edit.php:24
263
+ msgid "Last Name"
264
+ msgstr "الاسم الأخير"
265
+
266
+ #: simple-membership/classes/class.bMembers.php:20
267
+ #: simple-membership/views/add.php:10 simple-membership/views/edit.php:8
268
+ msgid "Email"
269
+ msgstr "البريد الإلكتروني"
270
+
271
+ #: simple-membership/classes/class.bMembers.php:22
272
+ #: simple-membership/views/admin_member_form_common_part.php:11
273
+ msgid "Access Starts"
274
+ msgstr "إتاحة الوصول بدأ"
275
+
276
+ #: simple-membership/classes/class.bMembers.php:23
277
+ msgid "Account State"
278
+ msgstr "حالة الحساب"
279
+
280
+ #: simple-membership/classes/class.bMembers.php:35
281
+ #: simple-membership/classes/class.bMembershipLevels.php:29
282
+ msgid "Delete"
283
+ msgstr "حذف"
284
+
285
+ #: simple-membership/classes/class.bMembers.php:101
286
+ msgid "No Member found."
287
+ msgstr "لا يوجد أعضاء."
288
+
289
+ #: simple-membership/classes/class.bMembershipLevel.php:37
290
+ msgid "Membership Level Creation Successful."
291
+ msgstr "تم إنشاء مستوى عضوية بنجاح."
292
+
293
+ #: simple-membership/classes/class.bMembershipLevel.php:56
294
+ msgid "Updated Successfully."
295
+ msgstr "تم التحديث بنجاح."
296
+
297
+ #: simple-membership/classes/class.bMembershipLevels.php:18
298
+ msgid "Role"
299
+ msgstr "الدور"
300
+
301
+ #: simple-membership/classes/class.bMembershipLevels.php:19
302
+ msgid "Access Valid For/Until"
303
+ msgstr "الوصول متاح إلى/حتى"
304
+
305
+ #: simple-membership/classes/class.bSettings.php:30
306
+ msgid "Plugin Documentation"
307
+ msgstr "وثيقة الإضافة"
308
+
309
+ #: simple-membership/classes/class.bSettings.php:32
310
+ msgid "General Settings"
311
+ msgstr "إعدادات عامة"
312
+
313
+ #: simple-membership/classes/class.bSettings.php:34
314
+ msgid "Enable Free Membership"
315
+ msgstr "إتاحة عضوية مجانية"
316
+
317
+ #: simple-membership/classes/class.bSettings.php:37
318
+ msgid "Enable/disable registration for free membership level"
319
+ msgstr "تمكين/تعطيل إتاحة تسجيل عضوية مجانية"
320
+
321
+ #: simple-membership/classes/class.bSettings.php:38
322
+ msgid "Free Membership Level ID"
323
+ msgstr "الرقم التعريفي للعضوية المجانية"
324
+
325
+ #: simple-membership/classes/class.bSettings.php:41
326
+ msgid "Assign free membership level ID"
327
+ msgstr "تعيين رقم تعريفي للعضوية المجانية"
328
+
329
+ #: simple-membership/classes/class.bSettings.php:42
330
+ msgid "Enable More Tag Protection"
331
+ msgstr "إتاحة المزيد من الحماية للوسم"
332
+
333
+ #: simple-membership/classes/class.bSettings.php:45
334
+ msgid ""
335
+ "Enables or disables \"more\" tag protection in the posts and pages. Anything "
336
+ "after the More tag is protected. Anything before the more tag is teaser "
337
+ "content."
338
+ msgstr ""
339
+ "تمكين/تعطيل وسم الحماية \"المزيد\" في المشاركات والصفحات. أي محتوى بعد هذا "
340
+ "الوسم سيكون محمي وأي محتوى قبل هذا الوسم سيكون مقدمة."
341
+
342
+ #: simple-membership/classes/class.bSettings.php:46
343
+ msgid "Hide Adminbar"
344
+ msgstr "إخفاء لوحة تحكم المشرف"
345
+
346
+ #: simple-membership/classes/class.bSettings.php:49
347
+ msgid ""
348
+ "WordPress shows an admin toolbar to the logged in users of the site. Check "
349
+ "this box if you want to hide that admin toolbar in the fronend of your site."
350
+ msgstr ""
351
+ "يعرض وردبريس شريط أدوات المشرف للمستخدمين المسجلين للموقع. حدد هذا المربع "
352
+ "إذا كنت تريد إخفاء شريط أدوات المشرف هذا في مقدمة موقعك."
353
+
354
+ #: simple-membership/classes/class.bSettings.php:51
355
+ msgid "Default Account Status"
356
+ msgstr "حالة الحساب الافتراضية"
357
+
358
+ #: simple-membership/classes/class.bSettings.php:56
359
+ msgid ""
360
+ "Select the default account status for newly registered users. If you want to "
361
+ "manually approve the members then you can set the status to \"Pending\"."
362
+ msgstr ""
363
+ "حدد حالة الحساب الافتراضية للمستخدمين المسجلين حديثا. بإمكانك الموافقة على "
364
+ "الأعضاء يدويا ثم يمكنك تعيين الحالة إلى \" قيد الانتظار\"."
365
+
366
+ #: simple-membership/classes/class.bSettings.php:62
367
+ msgid "Pages Settings"
368
+ msgstr "إعداد الصفحات"
369
+
370
+ #: simple-membership/classes/class.bSettings.php:64
371
+ msgid "Login Page URL"
372
+ msgstr "عنوان URL لصفحة تسجيل الدخول"
373
+
374
+ #: simple-membership/classes/class.bSettings.php:68
375
+ msgid "Registration Page URL"
376
+ msgstr "عنوان URL لصفحة التسجيل"
377
+
378
+ #: simple-membership/classes/class.bSettings.php:72
379
+ msgid "Join Us Page URL"
380
+ msgstr "عنوان URL لصفحة الانضمام"
381
+
382
+ #: simple-membership/classes/class.bSettings.php:76
383
+ msgid "Edit Profile Page URL"
384
+ msgstr "عنوان URL لصفحة تعديل الملف الشخصي"
385
+
386
+ #: simple-membership/classes/class.bSettings.php:80
387
+ msgid "Password Reset Page URL"
388
+ msgstr "عنوان URL لصفحة تغيير الرقم السري"
389
+
390
+ #: simple-membership/classes/class.bSettings.php:85
391
+ msgid "Test & Debug Settings"
392
+ msgstr "إعدادات الاختبار والتصحيح"
393
+
394
+ #: simple-membership/classes/class.bSettings.php:91
395
+ msgid "Enable Sandbox Testing"
396
+ msgstr "إتاحة اختبار Sandbox"
397
+
398
+ #: simple-membership/classes/class.bSettings.php:94
399
+ msgid "Enable this option if you want to do sandbox payment testing."
400
+ msgstr "اتح هذا الخيار لو أردت إجراء اختبار sandbox."
401
+
402
+ #: simple-membership/classes/class.bSettings.php:104
403
+ msgid "Email Misc. Settings"
404
+ msgstr "إعدادات البريد الإلكتروني"
405
+
406
+ #: simple-membership/classes/class.bSettings.php:106
407
+ msgid "From Email Address"
408
+ msgstr "من عنوان البريد الإلكتروني"
409
+
410
+ #: simple-membership/classes/class.bSettings.php:111
411
+ msgid "Email Settings (Prompt to Complete Registration )"
412
+ msgstr "إعدادات البريد الإلكتروني (لإكمال التسجيل)"
413
+
414
+ #: simple-membership/classes/class.bSettings.php:113
415
+ #: simple-membership/classes/class.bSettings.php:124
416
+ #: simple-membership/classes/class.bSettings.php:143
417
+ msgid "Email Subject"
418
+ msgstr "عنوان البريد الإلكتروني"
419
+
420
+ #: simple-membership/classes/class.bSettings.php:117
421
+ #: simple-membership/classes/class.bSettings.php:128
422
+ #: simple-membership/classes/class.bSettings.php:147
423
+ msgid "Email Body"
424
+ msgstr "نص البريد الإلكتروني"
425
+
426
+ #: simple-membership/classes/class.bSettings.php:122
427
+ msgid "Email Settings (Registration Complete)"
428
+ msgstr "إعدادات البريد الإلكتروني (إتمام التسجيل)"
429
+
430
+ #: simple-membership/classes/class.bSettings.php:132
431
+ msgid "Send Notification To Admin"
432
+ msgstr "إرسال إشعار إلى المشرف"
433
+
434
+ #: simple-membership/classes/class.bSettings.php:136
435
+ msgid "Send Email to Member When Added via Admin Dashboard"
436
+ msgstr "إرسال رسالة إلكترونية إلى العضو عند إضافتها عبر لوحة تحكم المشرف"
437
+
438
+ #: simple-membership/classes/class.bSettings.php:141
439
+ msgid " Email Settings (Account Upgrade Notification)"
440
+ msgstr " إعدادات البريد الإلكتروني (إشعار ترقية الحساب)"
441
+
442
+ #: simple-membership/classes/class.bSettings.php:367
443
+ msgid "Not a Member?"
444
+ msgstr "لست عضو?"
445
+
446
+ #: simple-membership/classes/class.bSettings.php:367
447
+ #: simple-membership/views/login.php:27
448
+ msgid "Join Us"
449
+ msgstr "انضم إلينا"
450
+
451
+ #: simple-membership/classes/class.bUtils.php:63
452
+ msgid "Active"
453
+ msgstr "نشِط"
454
+
455
+ #: simple-membership/classes/class.bUtils.php:64
456
+ msgid "Inactive"
457
+ msgstr "غير نشِط"
458
+
459
+ #: simple-membership/classes/class.bUtils.php:65
460
+ msgid "Pending"
461
+ msgstr "قيد الانتظار"
462
+
463
+ #: simple-membership/classes/class.bUtils.php:66
464
+ msgid "Expired"
465
+ msgstr "منتهي الصلاحية"
466
+
467
+ #: simple-membership/classes/class.bUtils.php:251
468
+ msgid "Never"
469
+ msgstr "أبداً"
470
+
471
+ #: simple-membership/classes/class.miscUtils.php:51
472
+ msgid "Registration"
473
+ msgstr "التسجيل"
474
+
475
+ #: simple-membership/classes/class.miscUtils.php:74
476
+ msgid "Member Login"
477
+ msgstr "تسجيل دخول عضو"
478
+
479
+ #: simple-membership/classes/class.miscUtils.php:97
480
+ msgid "Profile"
481
+ msgstr "الملف الشخصي"
482
+
483
+ #: simple-membership/classes/class.miscUtils.php:120
484
+ msgid "Password Reset"
485
+ msgstr "تغيير الرقم السري"
486
+
487
+ #: simple-membership/classes/class.simple-wp-membership.php:184
488
+ msgid "You are not logged in."
489
+ msgstr "أنت غير مسجل الدخول."
490
+
491
+ #: simple-membership/classes/class.simple-wp-membership.php:215
492
+ msgid "Simple WP Membership Protection"
493
+ msgstr "حماية Simple WP Membership"
494
+
495
+ #: simple-membership/classes/class.simple-wp-membership.php:228
496
+ msgid "Simple Membership Protection options"
497
+ msgstr "خيارات الحماية في Simple Membership"
498
+
499
+ #: simple-membership/classes/class.simple-wp-membership.php:244
500
+ msgid "Do you want to protect this content?"
501
+ msgstr "هل تريد حماية هذا المحتوى?"
502
+
503
+ #: simple-membership/classes/class.simple-wp-membership.php:249
504
+ msgid "Select the membership level that can access this content:"
505
+ msgstr "اختر مستوى العضوية الذي يتاح له الوصول إلى هذا المحتوى:"
506
+
507
+ #: simple-membership/classes/class.simple-wp-membership.php:459
508
+ msgid "WP Membership"
509
+ msgstr "عضوية ووردبريس"
510
+
511
+ #: simple-membership/classes/class.simple-wp-membership.php:466
512
+ msgid "Settings"
513
+ msgstr "إعدادات"
514
+
515
+ #: simple-membership/classes/class.simple-wp-membership.php:468
516
+ msgid "Add-ons"
517
+ msgstr "الإضافات"
518
+
519
+ #: simple-membership/views/add.php:14 simple-membership/views/admin_add.php:19
520
+ #: simple-membership/views/admin_edit.php:17
521
+ #: simple-membership/views/edit.php:12 simple-membership/views/login.php:11
522
+ msgid "Password"
523
+ msgstr "الرقم السري"
524
+
525
+ #: simple-membership/views/add.php:18 simple-membership/views/edit.php:16
526
+ msgid "Repeat Password"
527
+ msgstr "إعادة الرقم السري"
528
+
529
+ #: simple-membership/views/add.php:37
530
+ msgid "Register"
531
+ msgstr "سجل"
532
+
533
+ #: simple-membership/views/admin_add.php:6
534
+ msgid "Add Member"
535
+ msgstr "أضف عضو"
536
+
537
+ #: simple-membership/views/admin_add.php:7
538
+ msgid "Create a brand new user and add it to this site."
539
+ msgstr "إنشاء مستخدم جديد تماما وإضافته إلى هذا الموقع."
540
+
541
+ #: simple-membership/views/admin_add.php:11
542
+ msgid "User name"
543
+ msgstr "اسم المستخدم"
544
+
545
+ #: simple-membership/views/admin_add.php:11
546
+ #: simple-membership/views/admin_add.php:15
547
+ #: simple-membership/views/admin_add_level.php:11
548
+ #: simple-membership/views/admin_add_level.php:15
549
+ #: simple-membership/views/admin_add_level.php:19
550
+ #: simple-membership/views/admin_edit.php:9
551
+ #: simple-membership/views/admin_edit.php:13
552
+ #: simple-membership/views/admin_edit_level.php:10
553
+ #: simple-membership/views/admin_edit_level.php:14
554
+ #: simple-membership/views/admin_edit_level.php:18
555
+ msgid "(required)"
556
+ msgstr "(مطلوب)"
557
+
558
+ #: simple-membership/views/admin_add.php:15
559
+ #: simple-membership/views/admin_edit.php:13
560
+ msgid "E-mail"
561
+ msgstr "بريد إلكتروني"
562
+
563
+ #: simple-membership/views/admin_add.php:19
564
+ msgid "(twice, required)"
565
+ msgstr "(مطلوب، مرتان)"
566
+
567
+ #: simple-membership/views/admin_add.php:24
568
+ #: simple-membership/views/admin_edit.php:21
569
+ msgid "Strength indicator"
570
+ msgstr "مؤشر القوة"
571
+
572
+ #: simple-membership/views/admin_add.php:25
573
+ #: simple-membership/views/admin_edit.php:22
574
+ msgid ""
575
+ "Hint: The password should be at least seven characters long. To make it "
576
+ "stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
577
+ "$ % ^ &amp; )."
578
+ msgstr ""
579
+ "ميح: يجب أن تتكون كلمة المرور من سبعة أحرف على الأقل. لجعله أقوى، استخدم "
580
+ "الأحرف الكبيرة والصغيرة والأرقام والرموز مثل! \"؟٪٪ ^ & amp؛)."
581
+
582
+ #: simple-membership/views/admin_add.php:29
583
+ #: simple-membership/views/admin_edit.php:26
584
+ #: simple-membership/views/loggedin.php:7
585
+ msgid "Account Status"
586
+ msgstr "حالة الحساب"
587
+
588
+ #: simple-membership/views/admin_add.php:36
589
+ msgid "Add New Member "
590
+ msgstr "أضف عضو جديد "
591
+
592
+ #: simple-membership/views/admin_addon_settings.php:2
593
+ #: simple-membership/views/admin_payment_settings.php:2
594
+ #: simple-membership/views/admin_settings.php:2
595
+ #: simple-membership/views/admin_tools_settings.php:2
596
+ msgid "Simple WP Membership::Settings"
597
+ msgstr "Simple WP Membership::الإعدادات"
598
+
599
+ #: simple-membership/views/admin_addon_settings.php:7
600
+ msgid ""
601
+ "Some of the simple membership plugin's addon settings and options will be "
602
+ "displayed here (if you have them)"
603
+ msgstr ""
604
+ "سيتم عرض بعض إعدادات تخص الإضافات والخيارات في Simple membership هنا (في "
605
+ "حال قمت بإضافتهم)"
606
+
607
+ #: simple-membership/views/admin_add_level.php:6
608
+ msgid "Create new membership level."
609
+ msgstr "إنشاء عضوية جديد."
610
+
611
+ #: simple-membership/views/admin_add_level.php:11
612
+ #: simple-membership/views/admin_edit_level.php:10
613
+ msgid "Membership Level Name"
614
+ msgstr "اسم مستوى العضوية"
615
+
616
+ #: simple-membership/views/admin_add_level.php:15
617
+ #: simple-membership/views/admin_edit_level.php:14
618
+ msgid "Default WordPress Role"
619
+ msgstr "الدور الافتراضي في ووردبريس"
620
+
621
+ #: simple-membership/views/admin_add_level.php:19
622
+ #: simple-membership/views/admin_edit_level.php:18
623
+ msgid "Access Duration"
624
+ msgstr "مدة إتاحة الوصول"
625
+
626
+ #: simple-membership/views/admin_add_level.php:22
627
+ msgid "No Expiry (Access for this level will not expire until cancelled"
628
+ msgstr ""
629
+ "لا يوجد انتهاء صلاحية (صلاحية الوصول لهذه العضوية غير منتهية حتى يلغيها "
630
+ "المستخدم نفسه"
631
+
632
+ #: simple-membership/views/admin_add_level.php:23
633
+ #: simple-membership/views/admin_add_level.php:25
634
+ #: simple-membership/views/admin_add_level.php:27
635
+ #: simple-membership/views/admin_add_level.php:29
636
+ #: simple-membership/views/admin_edit_level.php:22
637
+ #: simple-membership/views/admin_edit_level.php:25
638
+ #: simple-membership/views/admin_edit_level.php:28
639
+ #: simple-membership/views/admin_edit_level.php:31
640
+ msgid "Expire After"
641
+ msgstr "انتهاء صلاحية بعد"
642
+
643
+ #: simple-membership/views/admin_add_level.php:24
644
+ #: simple-membership/views/admin_edit_level.php:23
645
+ msgid "Days (Access expires after given number of days)"
646
+ msgstr "يوم/ أيام (انتهاء صلاحية الوصول بعد عدد معين من الأيام)"
647
+
648
+ #: simple-membership/views/admin_add_level.php:26
649
+ msgid "Weeks (Access expires after given number of weeks"
650
+ msgstr "أسبوع/ أسابيع (انتهاء صلاحية الوصول بعد عدد معين من الأسابيع"
651
+
652
+ #: simple-membership/views/admin_add_level.php:28
653
+ #: simple-membership/views/admin_edit_level.php:29
654
+ msgid "Months (Access expires after given number of months)"
655
+ msgstr "شهر/ أشهر (انتهاء صلاحية الوصول بعد عدد معين من الأشهر)"
656
+
657
+ #: simple-membership/views/admin_add_level.php:30
658
+ #: simple-membership/views/admin_edit_level.php:32
659
+ msgid "Years (Access expires after given number of years)"
660
+ msgstr "سنة/ سنوات (انتهاء صلاحية الوصول بعد عدد معين من السنوات)"
661
+
662
+ #: simple-membership/views/admin_add_level.php:31
663
+ #: simple-membership/views/admin_edit_level.php:34
664
+ msgid "Fixed Date Expiry"
665
+ msgstr "تاريخ انتهاء الصلاحية"
666
+
667
+ #: simple-membership/views/admin_add_level.php:32
668
+ #: simple-membership/views/admin_edit_level.php:35
669
+ msgid "(Access expires on a fixed date)"
670
+ msgstr "(تنتهي صلاحية الوصول)"
671
+
672
+ #: simple-membership/views/admin_add_level.php:36
673
+ msgid "Access to older posts."
674
+ msgstr "الوصول إلى المواضيع القديمة."
675
+
676
+ #: simple-membership/views/admin_add_level.php:39
677
+ msgid "Only allow access to posts published after the user's join date."
678
+ msgstr "السماح بالوصول إلى المواضيع المنشورة بعد تاريخ الانضمام العضو."
679
+
680
+ #: simple-membership/views/admin_add_level.php:45
681
+ msgid "Add New Membership Level "
682
+ msgstr "إضافة مستوى عضوية الجديدة "
683
+
684
+ #: simple-membership/views/admin_add_ons_page.php:6
685
+ msgid "Simple WP Membership::Add-ons"
686
+ msgstr "Simple WP Membership::الإضافات"
687
+
688
+ #: simple-membership/views/admin_category_list.php:2
689
+ msgid "Simple WP Membership::Categories"
690
+ msgstr "Simple WP Membership::الفئات"
691
+
692
+ #: simple-membership/views/admin_category_list.php:7
693
+ msgid ""
694
+ "First of all, globally protect the category on your site by selecting "
695
+ "\"General Protection\" from the drop-down box below and then select the "
696
+ "categories that should be protected from non-logged in users."
697
+ msgstr ""
698
+ "أولا، قم بحماية الفئة على موقعك من خلال تحديد \"الحماية العامة\" من المربع "
699
+ "المنسدل أدناه، ثم حدد الفئات التي يجب حمايتها من المستخدمين غير المسجلين."
700
+
701
+ #: simple-membership/views/admin_category_list.php:10
702
+ msgid ""
703
+ "Next, select an existing membership level from the drop-down box below and "
704
+ "then select the categories you want to grant access to (for that particular "
705
+ "membership level)."
706
+ msgstr ""
707
+ "بعد ذلك، حدد مستوى العضوية الموجودة من المربع المنسدل أدناه، ثم حدد الفئات "
708
+ "التي تريد منحها حق الدخول (على مستوى العضوية المحدد)."
709
+
710
+ #: simple-membership/views/admin_edit.php:5
711
+ msgid "Edit Member"
712
+ msgstr "تعديل عضوية"
713
+
714
+ #: simple-membership/views/admin_edit.php:6
715
+ msgid "Edit existing member details."
716
+ msgstr "تعديل تفاصيل عضوية موجودة."
717
+
718
+ #: simple-membership/views/admin_edit.php:9 simple-membership/views/login.php:5
719
+ msgid "Username"
720
+ msgstr "اسم المستخدم"
721
+
722
+ #: simple-membership/views/admin_edit.php:17
723
+ msgid "(twice, leave empty to retain old password)"
724
+ msgstr "(اترك فراغاً لاسترجاع الرقم السري السابق، مرتان)"
725
+
726
+ #: simple-membership/views/admin_edit.php:33
727
+ msgid "Notify User"
728
+ msgstr "إرسال ملاحظة للمستخدم"
729
+
730
+ #: simple-membership/views/admin_edit.php:40
731
+ msgid "Edit User "
732
+ msgstr "تعديل "
733
+
734
+ #: simple-membership/views/admin_edit_level.php:5
735
+ msgid "Edit membership level"
736
+ msgstr "تعديل مستوى العضوية"
737
+
738
+ #: simple-membership/views/admin_edit_level.php:6
739
+ msgid "Edit membership level."
740
+ msgstr "تعديل مستوى العضوية."
741
+
742
+ #: simple-membership/views/admin_edit_level.php:21
743
+ msgid "No Expiry (Access for this level will not expire until cancelled)"
744
+ msgstr ""
745
+ "لا يوجد انتهاء صلاحية (صلاحية الوصول لهذه العضوية غير منتهية حتى يلغيها "
746
+ "المستخدم نفسه)"
747
+
748
+ #: simple-membership/views/admin_edit_level.php:26
749
+ msgid "Weeks (Access expires after given number of weeks)"
750
+ msgstr "أسبوع/ أسابيع (انتهاء صلاحية الوصول بعد عدد معين من الأسابيع)"
751
+
752
+ #: simple-membership/views/admin_edit_level.php:40
753
+ msgid "Protect Older Posts (optional)"
754
+ msgstr "حماية المشاركات القديمة (اختياري)"
755
+
756
+ #: simple-membership/views/admin_edit_level.php:43
757
+ msgid ""
758
+ "Only allow access to protected posts published after the members's join date."
759
+ msgstr "السماح بالوصول إلى المواضيع المحمية بعد تاريخ الانضمام العضو."
760
+
761
+ #: simple-membership/views/admin_edit_level.php:51
762
+ msgid "Edit Membership Level "
763
+ msgstr "تعديل مستوى العضوية "
764
+
765
+ #: simple-membership/views/admin_members.php:2
766
+ msgid "Simple WP Membership::Members"
767
+ msgstr "Simple WP Membership::العضويات"
768
+
769
+ #: simple-membership/views/admin_members.php:3
770
+ #: simple-membership/views/admin_members.php:19
771
+ #: simple-membership/views/admin_membership_levels.php:20
772
+ msgid "Add New"
773
+ msgstr "إضافة جديدة"
774
+
775
+ #: simple-membership/views/admin_members.php:9
776
+ #: simple-membership/views/admin_membership_levels.php:10
777
+ msgid "search"
778
+ msgstr "ابحث"
779
+
780
+ #: simple-membership/views/admin_membership_levels.php:2
781
+ msgid "Simple WP Membership::Membership Levels"
782
+ msgstr "Simple WP Membership::مستويات العضوية"
783
+
784
+ #: simple-membership/views/admin_membership_level_menu.php:2
785
+ msgid "Membership level"
786
+ msgstr "مستوى العضوية"
787
+
788
+ #: simple-membership/views/admin_membership_level_menu.php:3
789
+ msgid "Manage Content Production"
790
+ msgstr "إدارة إنتاج المحتوى"
791
+
792
+ #: simple-membership/views/admin_membership_level_menu.php:4
793
+ msgid "Category Protection"
794
+ msgstr "فئة الحماية"
795
+
796
+ #: simple-membership/views/admin_membership_manage.php:17
797
+ msgid "Example Content Protection Settings"
798
+ msgstr "مثال إعدادات حماية المحتوى"
799
+
800
+ #: simple-membership/views/admin_member_form_common_part.php:23
801
+ msgid "Gender"
802
+ msgstr "الجنس"
803
+
804
+ #: simple-membership/views/admin_member_form_common_part.php:30
805
+ #: simple-membership/views/edit.php:28
806
+ msgid "Phone"
807
+ msgstr "الهاتف"
808
+
809
+ #: simple-membership/views/admin_member_form_common_part.php:34
810
+ #: simple-membership/views/edit.php:32
811
+ msgid "Street"
812
+ msgstr "الشارع"
813
+
814
+ #: simple-membership/views/admin_member_form_common_part.php:38
815
+ #: simple-membership/views/edit.php:36
816
+ msgid "City"
817
+ msgstr "المدينة"
818
+
819
+ #: simple-membership/views/admin_member_form_common_part.php:42
820
+ #: simple-membership/views/edit.php:40
821
+ msgid "State"
822
+ msgstr "المنطقة"
823
+
824
+ #: simple-membership/views/admin_member_form_common_part.php:46
825
+ #: simple-membership/views/edit.php:44
826
+ msgid "Zipcode"
827
+ msgstr "الرمز البريدي"
828
+
829
+ #: simple-membership/views/admin_member_form_common_part.php:50
830
+ #: simple-membership/views/edit.php:48
831
+ msgid "Country"
832
+ msgstr "الدولة"
833
+
834
+ #: simple-membership/views/admin_member_form_common_part.php:54
835
+ msgid "Company"
836
+ msgstr "الشركة"
837
+
838
+ #: simple-membership/views/admin_member_form_common_part.php:58
839
+ msgid "Member Since"
840
+ msgstr "عضو منذ"
841
+
842
+ #: simple-membership/views/admin_payment_settings.php:33
843
+ msgid "PayPal Integration Settings"
844
+ msgstr "إعدادات الباي بال"
845
+
846
+ #: simple-membership/views/admin_payment_settings.php:36
847
+ msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
848
+ msgstr ""
849
+
850
+ #: simple-membership/views/admin_payment_settings.php:39
851
+ msgid "Enter the Membership Level ID"
852
+ msgstr "ادخل الرقم التعريفي لمستوى هذه العضوية"
853
+
854
+ #: simple-membership/views/admin_payment_settings.php:41
855
+ msgid "Generate Code"
856
+ msgstr "إنشاء رمز"
857
+
858
+ #: simple-membership/views/admin_tools_settings.php:9
859
+ msgid "Generate a Registration Completion link"
860
+ msgstr "إنشاء رابط إتمام التسجيل"
861
+
862
+ #: simple-membership/views/admin_tools_settings.php:12
863
+ msgid ""
864
+ "You can manually generate a registration completion link here and give it to "
865
+ "your customer if they have missed the email that was automatically sent out "
866
+ "to them after the payment."
867
+ msgstr ""
868
+ "يمكنك إنشاء رابط إتمام التسجيل يدويا وإعطائه للعميل إذا فاته البريد "
869
+ "الإلكتروني الذي تم إرساله تلقائيا إليه بعد الدفع."
870
+
871
+ #: simple-membership/views/admin_tools_settings.php:17
872
+ msgid "Generate Registration Completion Link"
873
+ msgstr "إنشاء رابط إتمام التسجيل"
874
+
875
+ #: simple-membership/views/admin_tools_settings.php:20
876
+ msgid "OR"
877
+ msgstr "أو"
878
+
879
+ #: simple-membership/views/admin_tools_settings.php:21
880
+ msgid "For All Pending Registrations"
881
+ msgstr "لجميع التسجيلات المعلقة"
882
+
883
+ #: simple-membership/views/admin_tools_settings.php:24
884
+ msgid "Registration Completion Links Will Appear Below:"
885
+ msgstr "روابط إتمام التسجيل سوف تظهر أدناه:"
886
+
887
+ #: simple-membership/views/admin_tools_settings.php:31
888
+ msgid "Send Registration Reminder Email too"
889
+ msgstr "إرسال تذكير بالتسجيل على البريد الإلكتروني أيضاً"
890
+
891
+ #: simple-membership/views/admin_tools_settings.php:34
892
+ msgid "Submit"
893
+ msgstr "إرسال"
894
+
895
+ #: simple-membership/views/edit.php:58
896
+ msgid "Update"
897
+ msgstr "تحديث"
898
+
899
+ #: simple-membership/views/forgot_password.php:5
900
+ msgid "Email Address"
901
+ msgstr "عنوان البريد الإلكتروني"
902
+
903
+ #: simple-membership/views/forgot_password.php:12
904
+ msgid "Reset Password"
905
+ msgstr "تغيير الرقم السري"
906
+
907
+ #: simple-membership/views/loggedin.php:3
908
+ msgid "Logged in as"
909
+ msgstr "تم تسجيل الدخول باسم"
910
+
911
+ #: simple-membership/views/loggedin.php:11
912
+ msgid "Membership"
913
+ msgstr "عضوية"
914
+
915
+ #: simple-membership/views/loggedin.php:15
916
+ msgid "Account Expiry"
917
+ msgstr "انتهت صلاحية الحساب"
918
+
919
+ #: simple-membership/views/loggedin.php:19
920
+ msgid "Logout"
921
+ msgstr "تسجيل خروج"
922
+
923
+ #: simple-membership/views/login.php:18
924
+ msgid "Remember Me"
925
+ msgstr "تذكرني"
926
+
927
+ #: simple-membership/views/login.php:24
928
+ msgid "Forgot Password"
929
+ msgstr "نسيت الرقم السري"
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://simple-membership-plugin.com/
4
  Tags: member, members, members only, membership, memberships, register, WordPress membership plugin, content, content protection, paypal, restrict, restrict access, Restrict content, admin, access control, subscription, teaser, protection, profile, login, login page, bbpress, stripe, braintree
5
  Requires at least: 4.0
6
  Tested up to: 4.7
7
- Stable tag: 3.4.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -70,6 +70,7 @@ You can create a free forum user account and ask your questions.
70
  * Send quick notification email to your members.
71
  * Customize the password reset email for members.
72
  * Use Google reCAPTCHA on your member registration form.
 
73
  * The login and registration widgets will be responsive if you are using a responsive theme.
74
  * Ability to restrict the commenting feature on your site to your members only.
75
  * Front-end member registration page.
@@ -110,6 +111,7 @@ The following language translations are already available:
110
  * Italian
111
  * Norwegian
112
  * Mexican
 
113
 
114
  You can translate the plugin using the language [translation documentation](https://simple-membership-plugin.com/translate-simple-membership-plugin/).
115
 
@@ -131,6 +133,13 @@ https://simple-membership-plugin.com/
131
 
132
  == Changelog ==
133
 
 
 
 
 
 
 
 
134
  = 3.4.5 =
135
  - Added a new action hook that gets triggered when a member is added via the "Add Member" menu of admin dashboard.
136
  - The mailchimp addon will now add users to a list when added via the admin dashboard.
4
  Tags: member, members, members only, membership, memberships, register, WordPress membership plugin, content, content protection, paypal, restrict, restrict access, Restrict content, admin, access control, subscription, teaser, protection, profile, login, login page, bbpress, stripe, braintree
5
  Requires at least: 4.0
6
  Tested up to: 4.7
7
+ Stable tag: 3.4.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
70
  * Send quick notification email to your members.
71
  * Customize the password reset email for members.
72
  * Use Google reCAPTCHA on your member registration form.
73
+ * Use Google reCAPTCHA on your member login and password reset form.
74
  * The login and registration widgets will be responsive if you are using a responsive theme.
75
  * Ability to restrict the commenting feature on your site to your members only.
76
  * Front-end member registration page.
111
  * Italian
112
  * Norwegian
113
  * Mexican
114
+ * Arabic
115
 
116
  You can translate the plugin using the language [translation documentation](https://simple-membership-plugin.com/translate-simple-membership-plugin/).
117
 
133
 
134
  == Changelog ==
135
 
136
+ = 3.4.6 =
137
+ - Added Arabic language translation to the plugin. The translation was submitted by Hanin Fatani.
138
+ - Added an email tag {primary_address} that can be used in the notification email when address field is used in the form builder addon.
139
+ - Removed the unnecessary $_SERVER["REQUEST_URI"] value from the post action.
140
+ - Added reCAPTCHA support on the password reset form (for reCAPTCHA addon).
141
+ - Added an option to specify a custom CSS class for Stripe and Braintree buttons to customize the button style. (The new shortcode parameter is "class").
142
+
143
  = 3.4.5 =
144
  - Added a new action hook that gets triggered when a member is added via the "Add Member" menu of admin dashboard.
145
  - The mailchimp addon will now add users to a list when added via the admin dashboard.
simple-wp-membership.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Plugin Name: Simple WordPress Membership
4
- Version: 3.4.5
5
  Plugin URI: https://simple-membership-plugin.com/
6
  Author: smp7, wp.insider
7
  Author URI: https://simple-membership-plugin.com/
@@ -17,7 +17,7 @@ include_once('classes/class.simple-wp-membership.php');
17
  include_once('classes/class.swpm-cronjob.php');
18
  include_once('swpm-compat.php');
19
 
20
- define('SIMPLE_WP_MEMBERSHIP_VER', '3.4.5');
21
  define('SIMPLE_WP_MEMBERSHIP_DB_VER', '1.2');
22
  define('SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL', home_url());
23
  define('SIMPLE_WP_MEMBERSHIP_PATH', dirname(__FILE__) . '/');
1
  <?php
2
  /*
3
  Plugin Name: Simple WordPress Membership
4
+ Version: 3.4.6
5
  Plugin URI: https://simple-membership-plugin.com/
6
  Author: smp7, wp.insider
7
  Author URI: https://simple-membership-plugin.com/
17
  include_once('classes/class.swpm-cronjob.php');
18
  include_once('swpm-compat.php');
19
 
20
+ define('SIMPLE_WP_MEMBERSHIP_VER', '3.4.6');
21
  define('SIMPLE_WP_MEMBERSHIP_DB_VER', '1.2');
22
  define('SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL', home_url());
23
  define('SIMPLE_WP_MEMBERSHIP_PATH', dirname(__FILE__) . '/');
views/forgot_password.php CHANGED
@@ -1,15 +1,16 @@
1
  <div class="swpm-pw-reset-widget-form">
2
- <form id="swpm-pw-reset-form" name="swpm-reset-form" method="post" action="">
3
- <div class="swpm-pw-reset-widget-inside">
4
- <div class="swpm-pw-reset-email swpm-margin-top-10">
5
- <label for="swpm_reset_email" class="swpm_label swpm-pw-reset-email-label"><?php echo SwpmUtils::_('Email Address')?></label>
 
 
 
 
 
 
 
 
6
  </div>
7
- <div class="swpm-pw-reset-email-input swpm-margin-top-10">
8
- <input type="text" name="swpm_reset_email" class="swpm-text-field swpm-pw-reset-text" id="swpm_reset_email" value="" size="60" />
9
- </div>
10
- <div class="swpm-pw-reset-submit-button swpm-margin-top-10">
11
- <input type="submit" name="swpm-reset" class="swpm-pw-reset-submit" value="<?php echo SwpmUtils::_('Reset Password'); ?>" />
12
- </div>
13
- </div>
14
- </form>
15
  </div>
1
  <div class="swpm-pw-reset-widget-form">
2
+ <form id="swpm-pw-reset-form" name="swpm-reset-form" method="post" action="">
3
+ <div class="swpm-pw-reset-widget-inside">
4
+ <div class="swpm-pw-reset-email swpm-margin-top-10">
5
+ <label for="swpm_reset_email" class="swpm_label swpm-pw-reset-email-label"><?php echo SwpmUtils::_('Email Address') ?></label>
6
+ </div>
7
+ <div class="swpm-pw-reset-email-input swpm-margin-top-10">
8
+ <input type="text" name="swpm_reset_email" class="swpm-text-field swpm-pw-reset-text" id="swpm_reset_email" value="" size="60" />
9
+ </div>
10
+ <div class="swpm-before-login-submit-section swpm-margin-top-10"><?php echo apply_filters('swpm_before_pass_reset_form_submit_button', ''); ?></div>
11
+ <div class="swpm-pw-reset-submit-button swpm-margin-top-10">
12
+ <input type="submit" name="swpm-reset" class="swpm-pw-reset-submit" value="<?php echo SwpmUtils::_('Reset Password'); ?>" />
13
+ </div>
14
  </div>
15
+ </form>
 
 
 
 
 
 
 
16
  </div>
views/payments/payment-gateway/braintree_button_shortcode_view.php CHANGED
@@ -12,6 +12,9 @@ function swpm_render_braintree_buy_now_button_sc_output($button_code, $args) {
12
  return '<p class="swpm-red-box">Error! swpm_render_braintree_buy_now_button_sc_output() function requires the button ID value to be passed to it.</p>';
13
  }
14
 
 
 
 
15
  //Check new_window parameter
16
  $window_target = isset($args['new_window']) ? 'target="_blank"' : '';
17
  $button_text = (isset($args['button_text'])) ? $args['button_text'] : SwpmUtils::_('Buy Now');
@@ -82,7 +85,7 @@ function swpm_render_braintree_buy_now_button_sc_output($button_code, $args) {
82
  $e_class = get_class($e);
83
  $ret = 'Braintree Pay Now button error: ' . $e_class;
84
  if ($e_class == "Braintree\Exception\Authentication")
85
- $ret.="<br />API keys are incorrect. Double-check that you haven't accidentally tried to use your sandbox keys in production or vice-versa.";
86
  return $ret;
87
  }
88
 
@@ -92,25 +95,25 @@ function swpm_render_braintree_buy_now_button_sc_output($button_code, $args) {
92
  $output = '';
93
  $output .= '<div class="swpm-button-wrapper swpm-braintree-buy-now-wrapper">';
94
  $output .= "<form action='" . $notify_url . "' METHOD='POST'> ";
95
- $output.='<div id="swpm-form-cont-' . $uniqid . '" class="swpm-braintree-form-container swpm-form-container-' . $button_id . '" style="display:none;"></div>';
96
- $output.='<div id="swpm-braintree-additional-fields-container-' . $uniqid . '" class="swpm-braintree-additional-fields-container swpm-braintree-additional-fields-container-' . $button_id . '" style="display:none;">';
97
- $output.='<p><input type="text" name="first_name" placeholder="First Name" value="' . (isset($member_first_name) ? $member_first_name : '') . '" required></p>';
98
- $output.='<p><input type="text" name="last_name" placeholder="Last Name" value="' . (isset($member_last_name) ? $member_last_name : '') . '" required></p>';
99
- $output.='<p><input type="text" name="member_email" placeholder="Email" value="' . (isset($member_email) ? $member_email : '') . '" required></p>';
100
- $output.='<div id="swpm-braintree-amount-container-' . $uniqid . '" class="swpm-braintree-amount-container"><p>' . $payment_amount_formatted . ' ' . $payment_currency . '</p></div>';
101
- $output.='</div>';
102
- $output.='<button id="swpm-show-form-btn-' . $uniqid . '" class="swpm-braintree-pay-now-button swpm-braintree-show-form-button-' . $button_id . '" type="button" onclick="swpm_braintree_show_form_' . $uniqid . '();">' . $button_text . '</button>';
103
- $output.='<button id="swpm-submit-form-btn-' . $uniqid . '" class="swpm-braintree-pay-now-button swpm-braintree-submit-form-button-' . $button_id . '" type="submit" style="display: none;">' . $button_text . '</button>';
104
- $output.='<script src="https://js.braintreegateway.com/js/braintree-2.30.0.min.js"></script>';
105
- $output.='<script>';
106
  $output .= "function swpm_braintree_show_form_" . $uniqid . "() {";
107
  $output .= 'document.getElementById(\'swpm-show-form-btn-' . $uniqid . '\').style.display = "none";';
108
  $output .= 'document.getElementById(\'swpm-submit-form-btn-' . $uniqid . '\').style.display = "block";';
109
  $output .= 'document.getElementById(\'swpm-form-cont-' . $uniqid . '\').style.display = "block";';
110
- $output.="braintree.setup('" . $clientToken . "', 'dropin', {container: 'swpm-form-cont-" . $uniqid . "', ";
111
- $output.="onReady: function(obj){document.getElementById('swpm-braintree-additional-fields-container-" . $uniqid . "').style.display = \"block\";}});";
112
  $output .= '}';
113
- $output.='</script>';
114
 
115
  $output .= wp_nonce_field('stripe_payments', '_wpnonce', true, false);
116
  $output .= '<input type="hidden" name="item_number" value="' . $button_id . '" />';
12
  return '<p class="swpm-red-box">Error! swpm_render_braintree_buy_now_button_sc_output() function requires the button ID value to be passed to it.</p>';
13
  }
14
 
15
+ //Get class option for button styling, set Stripe's default if none specified
16
+ $class = isset($args['class']) ? $args['class'] : 'stripe-button-el';
17
+
18
  //Check new_window parameter
19
  $window_target = isset($args['new_window']) ? 'target="_blank"' : '';
20
  $button_text = (isset($args['button_text'])) ? $args['button_text'] : SwpmUtils::_('Buy Now');
85
  $e_class = get_class($e);
86
  $ret = 'Braintree Pay Now button error: ' . $e_class;
87
  if ($e_class == "Braintree\Exception\Authentication")
88
+ $ret .= "<br />API keys are incorrect. Double-check that you haven't accidentally tried to use your sandbox keys in production or vice-versa.";
89
  return $ret;
90
  }
91
 
95
  $output = '';
96
  $output .= '<div class="swpm-button-wrapper swpm-braintree-buy-now-wrapper">';
97
  $output .= "<form action='" . $notify_url . "' METHOD='POST'> ";
98
+ $output .= '<div id="swpm-form-cont-' . $uniqid . '" class="swpm-braintree-form-container swpm-form-container-' . $button_id . '" style="display:none;"></div>';
99
+ $output .= '<div id="swpm-braintree-additional-fields-container-' . $uniqid . '" class="swpm-braintree-additional-fields-container swpm-braintree-additional-fields-container-' . $button_id . '" style="display:none;">';
100
+ $output .= '<p><input type="text" name="first_name" placeholder="First Name" value="' . (isset($member_first_name) ? $member_first_name : '') . '" required></p>';
101
+ $output .= '<p><input type="text" name="last_name" placeholder="Last Name" value="' . (isset($member_last_name) ? $member_last_name : '') . '" required></p>';
102
+ $output .= '<p><input type="text" name="member_email" placeholder="Email" value="' . (isset($member_email) ? $member_email : '') . '" required></p>';
103
+ $output .= '<div id="swpm-braintree-amount-container-' . $uniqid . '" class="swpm-braintree-amount-container"><p>' . $payment_amount_formatted . ' ' . $payment_currency . '</p></div>';
104
+ $output .= '</div>';
105
+ $output .= '<button id="swpm-show-form-btn-' . $uniqid . '" class="swpm-braintree-pay-now-button swpm-braintree-show-form-button-' . $button_id . ' ' . $class . '" type="button" onclick="swpm_braintree_show_form_' . $uniqid . '();"><span>' . $button_text . '</span></button>';
106
+ $output .= '<button id="swpm-submit-form-btn-' . $uniqid . '" class="swpm-braintree-pay-now-button swpm-braintree-submit-form-button-' . $button_id . ' ' . $class . '" type="submit" style="display: none;"><span>' . $button_text . '</span></button>';
107
+ $output .= '<script src="https://js.braintreegateway.com/js/braintree-2.30.0.min.js"></script>';
108
+ $output .= '<script>';
109
  $output .= "function swpm_braintree_show_form_" . $uniqid . "() {";
110
  $output .= 'document.getElementById(\'swpm-show-form-btn-' . $uniqid . '\').style.display = "none";';
111
  $output .= 'document.getElementById(\'swpm-submit-form-btn-' . $uniqid . '\').style.display = "block";';
112
  $output .= 'document.getElementById(\'swpm-form-cont-' . $uniqid . '\').style.display = "block";';
113
+ $output .= "braintree.setup('" . $clientToken . "', 'dropin', {container: 'swpm-form-cont-" . $uniqid . "', ";
114
+ $output .= "onReady: function(obj){document.getElementById('swpm-braintree-additional-fields-container-" . $uniqid . "').style.display = \"block\";}});";
115
  $output .= '}';
116
+ $output .= '</script>';
117
 
118
  $output .= wp_nonce_field('stripe_payments', '_wpnonce', true, false);
119
  $output .= '<input type="hidden" name="item_number" value="' . $button_id . '" />';
views/payments/payment-gateway/stripe_button_shortcode_view.php CHANGED
@@ -12,11 +12,15 @@ function swpm_render_stripe_buy_now_button_sc_output($button_code, $args) {
12
  return '<p class="swpm-red-box">Error! swpm_render_stripe_buy_now_button_sc_output() function requires the button ID value to be passed to it.</p>';
13
  }
14
 
 
 
 
15
  //Check new_window parameter
16
  $window_target = isset($args['new_window']) ? 'target="_blank"' : '';
17
  $button_text = (isset($args['button_text'])) ? $args['button_text'] : SwpmUtils::_('Buy Now');
18
- $billing_address = isset($args['billing_address']) ? '1' : '';;//By default don't show the billing address in the checkout form.
19
- $item_logo = '';//Can be used to show an item logo or thumbnail in the checkout form.
 
20
 
21
  $settings = SwpmSettings::get_instance();
22
  $button_cpt = get_post($button_id); //Retrieve the CPT for this button
@@ -24,84 +28,86 @@ function swpm_render_stripe_buy_now_button_sc_output($button_code, $args) {
24
 
25
  $membership_level_id = get_post_meta($button_id, 'membership_level_id', true);
26
  //Verify that this membership level exists (to prevent user paying for a level that has been deleted)
27
- if(!SwpmUtils::membership_level_id_exists($membership_level_id)){
28
  return '<p class="swpm-red-box">Error! The membership level specified in this button does not exist. You may have deleted this membership level. Edit the button and use the correct membership level.</p>';
29
  }
30
-
31
  //Payment amount and currency
32
  $payment_amount = get_post_meta($button_id, 'payment_amount', true);
33
  if (!is_numeric($payment_amount)) {
34
  return '<p class="swpm-red-box">Error! The payment amount value of the button must be a numeric number. Example: 49.50 </p>';
35
  }
36
  $payment_amount = round($payment_amount, 2); //round the amount to 2 decimal place.
37
- $price_in_cents = $payment_amount * 100 ;//The amount (in cents). This value is passed to Stripe API.
38
  $payment_currency = get_post_meta($button_id, 'payment_currency', true);
39
-
40
  //Return, cancel, notifiy URLs
41
  $return_url = get_post_meta($button_id, 'return_url', true);
42
  if (empty($return_url)) {
43
  $return_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL;
44
  }
45
- $notify_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL . '/?swpm_process_stripe_buy_now=1';//We are going to use it to do post payment processing.
46
  //$button_image_url = get_post_meta($button_id, 'button_image_url', true);//Stripe doesn't currenty support button image for their standard checkout.
47
-
48
  //User's IP address
49
  $user_ip = SwpmUtils::get_user_ip_address();
50
  $_SESSION['swpm_payment_button_interaction'] = $user_ip;
51
-
52
  //Custom field data
53
- $custom_field_value = 'subsc_ref=' . $membership_level_id;
54
  $custom_field_value .= '&user_ip=' . $user_ip;
55
  if (SwpmMemberUtils::is_member_logged_in()) {
56
  $custom_field_value .= '&swpm_id=' . SwpmMemberUtils::get_logged_in_members_id();
57
  }
58
  $custom_field_value = apply_filters('swpm_custom_field_value_filter', $custom_field_value);
59
-
60
  //Sandbox settings
61
  $sandbox_enabled = $settings->get_value('enable-sandbox-testing');
62
-
63
  //API keys
64
  $stripe_test_secret_key = get_post_meta($button_id, 'stripe_test_secret_key', true);
65
  $stripe_test_publishable_key = get_post_meta($button_id, 'stripe_test_publishable_key', true);
66
  $stripe_live_secret_key = get_post_meta($button_id, 'stripe_live_secret_key', true);
67
  $stripe_live_publishable_key = get_post_meta($button_id, 'stripe_live_publishable_key', true);
68
- if($sandbox_enabled){
69
- $publishable_key = $stripe_test_publishable_key;//Use sandbox API key
70
  } else {
71
- $publishable_key = $stripe_live_publishable_key;//Use live API key
72
  }
73
-
74
  /* === Stripe Buy Now Button Form === */
75
  $output = '';
76
  $output .= '<div class="swpm-button-wrapper swpm-stripe-buy-now-wrapper">';
77
  $output .= "<form action='" . $notify_url . "' METHOD='POST'> ";
 
78
  $output .= "<script src='https://checkout.stripe.com/checkout.js' class='stripe-button'
79
- data-key='".$publishable_key."'
80
  data-panel-label='Pay'
81
  data-amount='{$price_in_cents}'
82
  data-name='{$item_name}'";
83
  $output .= "data-description='{$payment_amount} {$payment_currency}'";
84
- $output .= "data-label='{$button_text}'";//Stripe doesn't currenty support button image for their standard checkout.
85
  $output .= "data-currency='{$payment_currency}'";
86
- if(!empty($item_logo)){//Show item logo/thumbnail in the stripe payment window
87
  $output .= "data-image='{$item_logo}'";
88
- }
89
- if(!empty($billing_address)){//Show billing address in the stipe payment window
90
  $output .= "data-billingAddress='true'";
91
  }
92
- $output .= apply_filters('swpm_stripe_additional_checkout_data_parameters', '');//Filter to allow the addition of extra data parameters for stripe checkout.
93
- $output .="></script>";
94
-
 
 
95
  $output .= wp_nonce_field('stripe_payments', '_wpnonce', true, false);
96
  $output .= '<input type="hidden" name="item_number" value="' . $button_id . '" />';
97
  $output .= "<input type='hidden' value='{$item_name}' name='item_name' />";
98
  $output .= "<input type='hidden' value='{$payment_amount}' name='item_price' />";
99
  $output .= "<input type='hidden' value='{$payment_currency}' name='currency_code' />";
100
  $output .= "<input type='hidden' value='{$custom_field_value}' name='custom' />";
101
-
102
  //Filter to add additional payment input fields to the form.
103
  $output .= apply_filters('swpm_stripe_payment_form_additional_fields', '');
104
-
105
  $output .= "</form>";
106
  $output .= '</div>'; //End .swpm_button_wrapper
107
 
12
  return '<p class="swpm-red-box">Error! swpm_render_stripe_buy_now_button_sc_output() function requires the button ID value to be passed to it.</p>';
13
  }
14
 
15
+ //Get class option for button styling, set Stripe's default if none specified
16
+ $class=isset($args['class']) ? $args['class'] : 'stripe-button-el';
17
+
18
  //Check new_window parameter
19
  $window_target = isset($args['new_window']) ? 'target="_blank"' : '';
20
  $button_text = (isset($args['button_text'])) ? $args['button_text'] : SwpmUtils::_('Buy Now');
21
+ $billing_address = isset($args['billing_address']) ? '1' : '';
22
+ ; //By default don't show the billing address in the checkout form.
23
+ $item_logo = ''; //Can be used to show an item logo or thumbnail in the checkout form.
24
 
25
  $settings = SwpmSettings::get_instance();
26
  $button_cpt = get_post($button_id); //Retrieve the CPT for this button
28
 
29
  $membership_level_id = get_post_meta($button_id, 'membership_level_id', true);
30
  //Verify that this membership level exists (to prevent user paying for a level that has been deleted)
31
+ if (!SwpmUtils::membership_level_id_exists($membership_level_id)) {
32
  return '<p class="swpm-red-box">Error! The membership level specified in this button does not exist. You may have deleted this membership level. Edit the button and use the correct membership level.</p>';
33
  }
34
+
35
  //Payment amount and currency
36
  $payment_amount = get_post_meta($button_id, 'payment_amount', true);
37
  if (!is_numeric($payment_amount)) {
38
  return '<p class="swpm-red-box">Error! The payment amount value of the button must be a numeric number. Example: 49.50 </p>';
39
  }
40
  $payment_amount = round($payment_amount, 2); //round the amount to 2 decimal place.
41
+ $price_in_cents = $payment_amount * 100; //The amount (in cents). This value is passed to Stripe API.
42
  $payment_currency = get_post_meta($button_id, 'payment_currency', true);
43
+
44
  //Return, cancel, notifiy URLs
45
  $return_url = get_post_meta($button_id, 'return_url', true);
46
  if (empty($return_url)) {
47
  $return_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL;
48
  }
49
+ $notify_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL . '/?swpm_process_stripe_buy_now=1'; //We are going to use it to do post payment processing.
50
  //$button_image_url = get_post_meta($button_id, 'button_image_url', true);//Stripe doesn't currenty support button image for their standard checkout.
 
51
  //User's IP address
52
  $user_ip = SwpmUtils::get_user_ip_address();
53
  $_SESSION['swpm_payment_button_interaction'] = $user_ip;
54
+
55
  //Custom field data
56
+ $custom_field_value = 'subsc_ref=' . $membership_level_id;
57
  $custom_field_value .= '&user_ip=' . $user_ip;
58
  if (SwpmMemberUtils::is_member_logged_in()) {
59
  $custom_field_value .= '&swpm_id=' . SwpmMemberUtils::get_logged_in_members_id();
60
  }
61
  $custom_field_value = apply_filters('swpm_custom_field_value_filter', $custom_field_value);
62
+
63
  //Sandbox settings
64
  $sandbox_enabled = $settings->get_value('enable-sandbox-testing');
65
+
66
  //API keys
67
  $stripe_test_secret_key = get_post_meta($button_id, 'stripe_test_secret_key', true);
68
  $stripe_test_publishable_key = get_post_meta($button_id, 'stripe_test_publishable_key', true);
69
  $stripe_live_secret_key = get_post_meta($button_id, 'stripe_live_secret_key', true);
70
  $stripe_live_publishable_key = get_post_meta($button_id, 'stripe_live_publishable_key', true);
71
+ if ($sandbox_enabled) {
72
+ $publishable_key = $stripe_test_publishable_key; //Use sandbox API key
73
  } else {
74
+ $publishable_key = $stripe_live_publishable_key; //Use live API key
75
  }
76
+
77
  /* === Stripe Buy Now Button Form === */
78
  $output = '';
79
  $output .= '<div class="swpm-button-wrapper swpm-stripe-buy-now-wrapper">';
80
  $output .= "<form action='" . $notify_url . "' METHOD='POST'> ";
81
+ $output .= "<div style='display: none !important'>";
82
  $output .= "<script src='https://checkout.stripe.com/checkout.js' class='stripe-button'
83
+ data-key='" . $publishable_key . "'
84
  data-panel-label='Pay'
85
  data-amount='{$price_in_cents}'
86
  data-name='{$item_name}'";
87
  $output .= "data-description='{$payment_amount} {$payment_currency}'";
88
+ $output .= "data-label='{$button_text}'"; //Stripe doesn't currenty support button image for their standard checkout.
89
  $output .= "data-currency='{$payment_currency}'";
90
+ if (!empty($item_logo)) {//Show item logo/thumbnail in the stripe payment window
91
  $output .= "data-image='{$item_logo}'";
92
+ }
93
+ if (!empty($billing_address)) {//Show billing address in the stipe payment window
94
  $output .= "data-billingAddress='true'";
95
  }
96
+ $output .= apply_filters('swpm_stripe_additional_checkout_data_parameters', ''); //Filter to allow the addition of extra data parameters for stripe checkout.
97
+ $output .= "></script>";
98
+ $output .= '</div>';
99
+ $output .= "<button id='{$button_id}' type='submit' class='{$class}'><span>{$button_text}</span></button>";
100
+
101
  $output .= wp_nonce_field('stripe_payments', '_wpnonce', true, false);
102
  $output .= '<input type="hidden" name="item_number" value="' . $button_id . '" />';
103
  $output .= "<input type='hidden' value='{$item_name}' name='item_name' />";
104
  $output .= "<input type='hidden' value='{$payment_amount}' name='item_price' />";
105
  $output .= "<input type='hidden' value='{$payment_currency}' name='currency_code' />";
106
  $output .= "<input type='hidden' value='{$custom_field_value}' name='custom' />";
107
+
108
  //Filter to add additional payment input fields to the form.
109
  $output .= apply_filters('swpm_stripe_payment_form_additional_fields', '');
110
+
111
  $output .= "</form>";
112
  $output .= '</div>'; //End .swpm_button_wrapper
113