Paid Memberships Pro - Version 2.8

Version Description

  • 2022-05-05 =
  • FEATURE: Added refunds buttons for Stripe and Paypal Express orders. #1948 (@JarrydLong)
  • FEATURE: Released Beta version of Stripe Checkout. Add define('PMPRO_STRIPE_CHECKOUT_BETA_ENABLED', true); to your wp-config.php to enable this gateway during the beta. #1923 (@dlparker1005)
  • ENHANCEMENT: Introduced a new set of functions that handle cron-related tasks including: pmpro_get_crons() to get the list of PMPro registered crons. #1999 (@sc0ttkclark)
  • ENHANCEMENT: New filter pmpro_registered_crons which you can register new crons to be handled by PMPro. They show up in the PMPro Site Health info and are automatically scheduled when they need to be. #1999 (@sc0ttkclark)
  • ENHANCEMENT: Added an opt-in stats collection so we can get better insight on how people use Paid Memberships Pro. (@sc0ttkclark, @ideadude)
  • ENHANCEMENT: Added Formal German translation files. #1926
  • ENHANCEMENT: Tracking library conflicts in Site Health, e.g. when other plugins are loading gateway libraries at the same time as PMPro. (@dparker1005)
  • ENHANCEMENT: UI/UX improvements to the Orders admin area for list and single edit view. #2017 (@kimcoleman)
  • ENHANCEMENT: Improved the UI for email template variables reference on the Settings > Email Templates admin page. #2018 (@kimcoleman)
  • ENHANCEMENT: Various other UI improvements to the admin area. #2019 (@kimcoleman)
  • ENHANCEMENT: Improved block names, descriptions, keywords, and organization for discover and usability. #2011 (@kimcoleman)
  • ENHANCEMENT: Added "show_noaccess" as a setting on the Membership Required block for swapping in the appropriate content message. #2011 (@kimcoleman)
  • ENHANCEMENT: Added filter 'pmpro_braintree_transaction_sale_array' to allow adding or adjusting of the sale transaction method. #2006 (@andrewlimaza)
  • ENHANCEMENT: Moved the TOS input inside the label to support multiline i18n. #2002 (#mircobabini)
  • ENHANCEMENT: Added new action pmpro_checkout_after_tos to output content after the TOS. #2003 (@mircobabini)
  • ENHANCEMENT: Added filters to change gateway ipn/webhook logfile. #1996 (@mircobabini)
  • ENHANCEMENT: Added filter to perform actions during PPHttpPost() method of the PayPal gateways. #1992 (@mircobabini)
  • ENHANCEMENT: Added untranslated gateway identifiers to Site Health info. #1989 (@JarrydLong)
  • BUG FIX/ENHANCEMENT: Fixed escaping and localization for many strings across the codebase. #1976 (@mircobabini)
  • BUG FIX/ENHANCEMENT: Resolve admin area conflicts with other plugins using similar class names. #1991 (@sc0ttkclark)
  • BUG FIX: Crons are now automatically rescheduled if they disappear form the cron schedule. #1999 (@sc0ttkclark, @mircobabini)
  • BUG FIX: Resolved problems with PHP float precision and prevent passing along faulty floats to the gateway APIs. #1929 (@sc0ttkclark)
  • BUG FIX: Fixed issue where TOS setting was not saving when using the PayFast gateway. #1990 (@andrewlimaza)
  • BUG FIX: Fixed issue where the is_renewal() method didn't work during the pmpro_added_order hook. (@andrewlimaza)
Download this release

Release Info

Developer strangerstudios
Plugin Icon 128x128 Paid Memberships Pro
Version 2.8
Comparing to
See all releases

Code changes from version 2.7.5 to 2.8

Files changed (89) hide show
  1. CHANGELOG.txt +26 -0
  2. adminpages/addons.php +11 -11
  3. adminpages/admin_footer.php +19 -0
  4. adminpages/admin_header.php +17 -17
  5. adminpages/advancedsettings.php +102 -70
  6. adminpages/dashboard.php +34 -34
  7. adminpages/discountcodes.php +77 -66
  8. adminpages/emailsettings.php +14 -14
  9. adminpages/emailtemplates.php +71 -84
  10. adminpages/functions.php +4 -4
  11. adminpages/license.php +24 -22
  12. adminpages/membershiplevels.php +60 -62
  13. adminpages/memberslist-csv.php +6 -0
  14. adminpages/memberslist.php +1 -2
  15. adminpages/orders.php +442 -263
  16. adminpages/pagesettings.php +50 -51
  17. adminpages/paymentsettings.php +47 -30
  18. adminpages/reports.php +5 -2
  19. adminpages/reports/login.php +118 -115
  20. adminpages/reports/memberships.php +58 -59
  21. adminpages/reports/sales.php +14 -13
  22. adminpages/templates/orders-email.php +78 -75
  23. adminpages/templates/orders-print.php +106 -103
  24. adminpages/updates.php +2 -2
  25. blocks/account-invoices-section/block.js +15 -6
  26. blocks/account-links-section/block.js +15 -6
  27. blocks/account-membership-section/block.js +13 -6
  28. blocks/account-page/block.js +20 -6
  29. blocks/account-profile-section/block.js +12 -6
  30. blocks/billing-page/block.js +12 -6
  31. blocks/blocks.js +1 -0
  32. blocks/blocks.php +4 -0
  33. blocks/cancel-page/block.js +12 -6
  34. blocks/checkout-button/block.js +8 -5
  35. blocks/checkout-page/block.js +11 -4
  36. blocks/confirmation-page/block.js +14 -6
  37. blocks/invoice-page/block.js +13 -6
  38. blocks/levels-page/block.js +11 -5
  39. blocks/login/block.js +35 -34
  40. blocks/member-profile-edit/block.js +33 -28
  41. blocks/membership/block.js +40 -11
  42. blocks/membership/block.php +2 -0
  43. classes/class-pmpro-admin-activity-email.php +4 -4
  44. classes/class-pmpro-members-list-table.php +22 -16
  45. classes/class-pmpro-site-health.php +43 -17
  46. classes/class-pmpro-wisdom-integration.php +490 -0
  47. classes/class-pmpro-wisdom-tracker.php +1107 -0
  48. classes/class.memberorder.php +44 -4
  49. classes/class.pmproemail.php +133 -0
  50. classes/gateways/class.pmprogateway_authorizenet.php +11 -11
  51. classes/gateways/class.pmprogateway_braintree.php +48 -38
  52. classes/gateways/class.pmprogateway_check.php +3 -3
  53. classes/gateways/class.pmprogateway_cybersource.php +16 -16
  54. classes/gateways/class.pmprogateway_payflowpro.php +7 -7
  55. classes/gateways/class.pmprogateway_paypal.php +42 -22
  56. classes/gateways/class.pmprogateway_paypalexpress.php +111 -31
  57. classes/gateways/class.pmprogateway_paypalstandard.php +25 -15
  58. classes/gateways/class.pmprogateway_stripe.php +718 -175
  59. classes/gateways/class.pmprogateway_twocheckout.php +26 -20
  60. css/admin-rtl.css +1 -5
  61. css/admin.css +188 -92
  62. css/blocks.editor.css +29 -13
  63. includes/compatibility.php +46 -1
  64. includes/crons.php +124 -0
  65. includes/email-templates.php +30 -0
  66. includes/functions.php +284 -95
  67. includes/init.php +1 -1
  68. includes/lib/Twocheckout/Twocheckout/TwocheckoutCharge.php +5 -5
  69. includes/license.php +29 -28
  70. includes/login.php +1 -1
  71. includes/menus.php +3 -3
  72. includes/metaboxes.php +2 -2
  73. includes/notifications.php +3 -3
  74. includes/privacy.php +1 -0
  75. includes/profile.php +65 -25
  76. includes/rest-api.php +62 -0
  77. includes/updates.php +1 -1
  78. includes/updates/upgrade_1.php +3 -0
  79. includes/updates/upgrade_1_8_7.php +5 -5
  80. includes/updates/upgrade_1_9_4.php +3 -3
  81. includes/updates/upgrade_2_6.php +1 -1
  82. includes/upgradecheck.php +11 -2
  83. js/blocks.build.js +1 -1883
  84. js/pmpro-admin.js +36 -36
  85. js/pmpro-confirmation.js +25 -0
  86. languages/paid-memberships-pro-ca.mo +0 -0
  87. languages/paid-memberships-pro-ca.po +2147 -2
  88. languages/paid-memberships-pro-ca_AD.mo +0 -0
  89. languages/paid-memberships-pro-ca_AD.po +231 -2
CHANGELOG.txt CHANGED
@@ -1,4 +1,30 @@
1
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  = 2.7.5 - 2022-03-01 =
3
  * ENHANCEMENT: Now sending "name" separate from the "description" when creating customers for Stripe checkouts. (@ideadude)
4
  * ENHANCEMENT: You can now search the members list on specific user table columns or user meta fields by using a colon in your search term. These queries are faster than the default queries. The format is meta_key:meta_value (no backticks). You can also use login, nicename, email, url, or display_name as the meta_key and the users table will be searched against the related column. (@ideadude)
1
  == Changelog ==
2
+ = 2.8 - 2022-05-05 =
3
+ * FEATURE: Added refunds buttons for Stripe and Paypal Express orders. #1948 (@JarrydLong)
4
+ * FEATURE: Released Beta version of Stripe Checkout. Add `define('PMPRO_STRIPE_CHECKOUT_BETA_ENABLED', true);` to your wp-config.php to enable this gateway during the beta. #1923 (@dlparker1005)
5
+ * ENHANCEMENT: Introduced a new set of functions that handle cron-related tasks including: `pmpro_get_crons()` to get the list of PMPro registered crons. #1999 (@sc0ttkclark)
6
+ * ENHANCEMENT: New filter `pmpro_registered_crons` which you can register new crons to be handled by PMPro. They show up in the PMPro Site Health info and are automatically scheduled when they need to be. #1999 (@sc0ttkclark)
7
+ * ENHANCEMENT: Added an opt-in stats collection so we can get better insight on how people use Paid Memberships Pro. (@sc0ttkclark, @ideadude)
8
+ * ENHANCEMENT: Added Formal German translation files. #1926
9
+ * ENHANCEMENT: Tracking library conflicts in Site Health, e.g. when other plugins are loading gateway libraries at the same time as PMPro. (@dparker1005)
10
+ * ENHANCEMENT: UI/UX improvements to the Orders admin area for list and single edit view. #2017 (@kimcoleman)
11
+ * ENHANCEMENT: Improved the UI for email template variables reference on the Settings > Email Templates admin page. #2018 (@kimcoleman)
12
+ * ENHANCEMENT: Various other UI improvements to the admin area. #2019 (@kimcoleman)
13
+ * ENHANCEMENT: Improved block names, descriptions, keywords, and organization for discover and usability. #2011 (@kimcoleman)
14
+ * ENHANCEMENT: Added "show_noaccess" as a setting on the Membership Required block for swapping in the appropriate content message. #2011 (@kimcoleman)
15
+ * ENHANCEMENT: Added filter 'pmpro_braintree_transaction_sale_array' to allow adding or adjusting of the sale transaction method. #2006 (@andrewlimaza)
16
+ * ENHANCEMENT: Moved the TOS input inside the label to support multiline i18n. #2002 (#mircobabini)
17
+ * ENHANCEMENT: Added new action `pmpro_checkout_after_tos` to output content after the TOS. #2003 (@mircobabini)
18
+ * ENHANCEMENT: Added filters to change gateway ipn/webhook logfile. #1996 (@mircobabini)
19
+ * ENHANCEMENT: Added filter to perform actions during PPHttpPost() method of the PayPal gateways. #1992 (@mircobabini)
20
+ * ENHANCEMENT: Added untranslated gateway identifiers to Site Health info. #1989 (@JarrydLong)
21
+ * BUG FIX/ENHANCEMENT: Fixed escaping and localization for many strings across the codebase. #1976 (@mircobabini)
22
+ * BUG FIX/ENHANCEMENT: Resolve admin area conflicts with other plugins using similar class names. #1991 (@sc0ttkclark)
23
+ * BUG FIX: Crons are now automatically rescheduled if they disappear form the cron schedule. #1999 (@sc0ttkclark, @mircobabini)
24
+ * BUG FIX: Resolved problems with PHP float precision and prevent passing along faulty floats to the gateway APIs. #1929 (@sc0ttkclark)
25
+ * BUG FIX: Fixed issue where TOS setting was not saving when using the PayFast gateway. #1990 (@andrewlimaza)
26
+ * BUG FIX: Fixed issue where the is_renewal() method didn't work during the pmpro_added_order hook. (@andrewlimaza)
27
+
28
  = 2.7.5 - 2022-03-01 =
29
  * ENHANCEMENT: Now sending "name" separate from the "description" when creating customers for Stripe checkouts. (@ideadude)
30
  * ENHANCEMENT: You can now search the members list on specific user table columns or user meta fields by using a colon in your search term. These queries are faster than the default queries. The format is meta_key:meta_value (no backticks). You can also use login, nicename, email, url, or display_name as the meta_key and the users table will be searched against the related column. (@ideadude)
adminpages/addons.php CHANGED
@@ -87,15 +87,15 @@
87
 
88
  <p>
89
  <?php printf(__('Last checked on %s at %s.', 'paid-memberships-pro' ), date_i18n(get_option('date_format'), $addons_timestamp), date_i18n(get_option('time_format'), $addons_timestamp));?> &nbsp;
90
- <a class="button" href="<?php echo admin_url("admin.php?page=pmpro-addons&force-check=1&plugin_status=" . $status);?>"><?php _e('Check Again', 'paid-memberships-pro' ); ?></a>
91
  </p>
92
 
93
  <ul class="subsubsub">
94
- <li class="all"><a href="admin.php?page=pmpro-addons&plugin_status=all" <?php if(empty($status) || $status == "all") { ?>class="current"<?php } ?>><?php _e('All', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($all_visible_addons);?>)</span></a> |</li>
95
- <li class="active"><a href="admin.php?page=pmpro-addons&plugin_status=active" <?php if($status == "active") { ?>class="current"<?php } ?>><?php _e('Active', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($active_addons);?>)</span></a> |</li>
96
- <li class="inactive"><a href="admin.php?page=pmpro-addons&plugin_status=inactive" <?php if($status == "inactive") { ?>class="current"<?php } ?>><?php _e('Inactive', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($inactive_addons);?>)</span></a> |</li>
97
- <li class="update"><a href="admin.php?page=pmpro-addons&plugin_status=update" <?php if($status == "update") { ?>class="current"<?php } ?>><?php _e('Update Available', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($update_available_addons);?>)</span></a> |</li>
98
- <li class="uninstalled"><a href="admin.php?page=pmpro-addons&plugin_status=uninstalled" <?php if($status == "uninstalled") { ?>class="current"<?php } ?>><?php _e('Not Installed', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($not_installed_addons);?>)</span></a></li>
99
  </ul>
100
 
101
  <table class="wp-list-table widefat plugins">
@@ -103,12 +103,12 @@
103
  <tr>
104
  <th scope="col" id="cb" class="manage-column column-cb check-column" style="">
105
  <?php /*
106
- <label class="screen-reader-text" for="cb-select-all-1"><?php _e('Select All'); ?></label><input id="cb-select-all-1" type="checkbox">
107
  */ ?>
108
  </th>
109
- <th scope="col" id="name" class="manage-column column-name" style=""><?php _e('Add On Name', 'paid-memberships-pro' ); ?></th>
110
- <th scope="col" id="type" class="manage-column column-type" style=""><?php _e('Type', 'paid-memberships-pro' ); ?></th>
111
- <th scope="col" id="description" class="manage-column column-description" style=""><?php _e('Description', 'paid-memberships-pro' ); ?></th>
112
  </tr>
113
  </thead>
114
  <tbody id="the-list">
@@ -132,7 +132,7 @@
132
  ?>
133
  <tr>
134
  <td></td>
135
- <td colspan="3"><p><?php _e('No Add Ons found.', 'paid-memberships-pro' ); ?></p></td>
136
  </tr>
137
  <?php
138
  }
87
 
88
  <p>
89
  <?php printf(__('Last checked on %s at %s.', 'paid-memberships-pro' ), date_i18n(get_option('date_format'), $addons_timestamp), date_i18n(get_option('time_format'), $addons_timestamp));?> &nbsp;
90
+ <a class="button" href="<?php echo esc_url( admin_url("admin.php?page=pmpro-addons&force-check=1&plugin_status=" . $status) );?>"><?php esc_html_e('Check Again', 'paid-memberships-pro' ); ?></a>
91
  </p>
92
 
93
  <ul class="subsubsub">
94
+ <li class="all"><a href="admin.php?page=pmpro-addons&plugin_status=all" <?php if(empty($status) || $status == "all") { ?>class="current"<?php } ?>><?php esc_html_e('All', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($all_visible_addons);?>)</span></a> |</li>
95
+ <li class="active"><a href="admin.php?page=pmpro-addons&plugin_status=active" <?php if($status == "active") { ?>class="current"<?php } ?>><?php esc_html_e('Active', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($active_addons);?>)</span></a> |</li>
96
+ <li class="inactive"><a href="admin.php?page=pmpro-addons&plugin_status=inactive" <?php if($status == "inactive") { ?>class="current"<?php } ?>><?php esc_html_e('Inactive', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($inactive_addons);?>)</span></a> |</li>
97
+ <li class="update"><a href="admin.php?page=pmpro-addons&plugin_status=update" <?php if($status == "update") { ?>class="current"<?php } ?>><?php esc_html_e('Update Available', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($update_available_addons);?>)</span></a> |</li>
98
+ <li class="uninstalled"><a href="admin.php?page=pmpro-addons&plugin_status=uninstalled" <?php if($status == "uninstalled") { ?>class="current"<?php } ?>><?php esc_html_e('Not Installed', 'paid-memberships-pro' ); ?> <span class="count">(<?php echo count($not_installed_addons);?>)</span></a></li>
99
  </ul>
100
 
101
  <table class="wp-list-table widefat plugins">
103
  <tr>
104
  <th scope="col" id="cb" class="manage-column column-cb check-column" style="">
105
  <?php /*
106
+ <label class="screen-reader-text" for="cb-select-all-1"><?php esc_html_e('Select All'); ?></label><input id="cb-select-all-1" type="checkbox">
107
  */ ?>
108
  </th>
109
+ <th scope="col" id="name" class="manage-column column-name" style=""><?php esc_html_e('Add On Name', 'paid-memberships-pro' ); ?></th>
110
+ <th scope="col" id="type" class="manage-column column-type" style=""><?php esc_html_e('Type', 'paid-memberships-pro' ); ?></th>
111
+ <th scope="col" id="description" class="manage-column column-description" style=""><?php esc_html_e('Description', 'paid-memberships-pro' ); ?></th>
112
  </tr>
113
  </thead>
114
  <tbody id="the-list">
132
  ?>
133
  <tr>
134
  <td></td>
135
+ <td colspan="3"><p><?php esc_html_e('No Add Ons found.', 'paid-memberships-pro' ); ?></p></td>
136
  </tr>
137
  <?php
138
  }
adminpages/admin_footer.php CHANGED
@@ -1,2 +1,21 @@
1
  <div class="clear"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  </div>
1
  <div class="clear"></div>
2
+ <?php
3
+ echo sprintf(
4
+ wp_kses(
5
+ /* translators: $1$s - Paid Memberships Pro plugin name; $2$s - WP.org review link. */
6
+ __( '<p>Please <a href="%1$s" target="_blank" rel="noopener noreferrer">rate us &#9733;&#9733;&#9733;&#9733;&#9733; on WordPress.org</a> to help others find %2$s. Thank you from the %3$s team!</p>', 'paid-memberships-pro' ),
7
+ [
8
+ 'a' => [
9
+ 'href' => [],
10
+ 'target' => [],
11
+ 'rel' => [],
12
+ ],
13
+ 'p' => [],
14
+ ]
15
+ ),
16
+ 'https://wordpress.org/support/plugin/paid-memberships-pro/reviews/?filter=5#new-post',
17
+ 'Paid Memberships Pro',
18
+ 'PMPro',
19
+ );
20
+ ?>
21
  </div>
adminpages/admin_header.php CHANGED
@@ -167,11 +167,11 @@
167
 
168
  <div class="wrap pmpro_admin">
169
  <div class="pmpro_banner">
170
- <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("https://www.paidmembershipspro.com/?utm_source=plugin&utm_medium=pmpro-admin-header&utm_campaign=homepage")?>"><img src="<?php echo PMPRO_URL?>/images/Paid-Memberships-Pro.png" width="350" height="75" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
171
  <div class="pmpro_meta">
172
  <span class="pmpro_version">v<?php echo PMPRO_VERSION?></span>
173
- <a target="_blank" href="<?php echo pmpro_https_filter("https://www.paidmembershipspro.com/documentation/?utm_source=plugin&utm_medium=pmpro-admin-header&utm_campaign=documentation")?>"><?php _e('Documentation', 'paid-memberships-pro' );?></a>
174
- <a target="_blank" href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-admin-header&utm_campaign=pricing&utm_content=get-support"><?php _e('Get Support', 'paid-memberships-pro' );?></a>
175
 
176
  <?php if ( pmpro_license_isValid( null, pmpro_license_get_premium_types() ) ) { ?>
177
  <?php printf(__( '<a class="pmpro_license_tag pmpro_license_tag-valid" href="%s">Valid License</a>', 'paid-memberships-pro' ), admin_url( 'admin.php?page=pmpro-license' ) ); ?>
@@ -219,62 +219,62 @@
219
  if( in_array( $view, $settings_tabs ) ) { ?>
220
  <nav class="nav-tab-wrapper">
221
  <?php if(current_user_can('pmpro_dashboard')) { ?>
222
- <a href="<?php echo admin_url('admin.php?page=pmpro-dashboard');?>" class="nav-tab<?php if($view == 'pmpro-dashboard') { ?> nav-tab-active<?php } ?>"><?php _e('Dashboard', 'paid-memberships-pro' );?></a>
223
  <?php } ?>
224
 
225
  <?php if(current_user_can('pmpro_memberslist')) { ?>
226
- <a href="<?php echo admin_url('admin.php?page=pmpro-memberslist');?>" class="nav-tab<?php if($view == 'pmpro-memberslist') { ?> nav-tab-active<?php } ?>"><?php _e('Members', 'paid-memberships-pro' );?></a>
227
  <?php } ?>
228
 
229
  <?php if(current_user_can('pmpro_orders')) { ?>
230
- <a href="<?php echo admin_url('admin.php?page=pmpro-orders');?>" class="nav-tab<?php if($view == 'pmpro-orders') { ?> nav-tab-active<?php } ?>"><?php _e('Orders', 'paid-memberships-pro' );?></a>
231
  <?php } ?>
232
 
233
  <?php if(current_user_can('pmpro_reports')) { ?>
234
- <a href="<?php echo admin_url('admin.php?page=pmpro-reports');?>" class="nav-tab<?php if($view == 'pmpro-reports') { ?> nav-tab-active<?php } ?>"><?php _e('Reports', 'paid-memberships-pro' );?></a>
235
  <?php } ?>
236
 
237
  <?php if(current_user_can('pmpro_membershiplevels')) { ?>
238
- <a href="<?php echo admin_url('admin.php?page=pmpro-membershiplevels');?>" class="nav-tab<?php if( in_array( $view, array( 'pmpro-membershiplevels', 'pmpro-discountcodes', 'pmpro-pagesettings', 'pmpro-paymentsettings', 'pmpro-emailsettings', 'pmpro-emailtemplates', 'pmpro-advancedsettings' ) ) ) { ?> nav-tab-active<?php } ?>"><?php _e('Settings', 'paid-memberships-pro' );?></a>
239
  <?php } ?>
240
 
241
  <?php if(current_user_can('pmpro_addons')) { ?>
242
- <a href="<?php echo admin_url('admin.php?page=pmpro-addons');?>" class="nav-tab<?php if($view == 'pmpro-addons') { ?> nav-tab-active<?php } ?>"><?php _e('Add Ons', 'paid-memberships-pro' );?></a>
243
  <?php } ?>
244
 
245
  <?php if(current_user_can('manage_options')) { ?>
246
- <a href="<?php echo admin_url('admin.php?page=pmpro-license');?>" class="nav-tab<?php if($view == 'pmpro-license') { ?> nav-tab-active<?php } ?>"><?php _e('License', 'paid-memberships-pro' );?></a>
247
  <?php } ?>
248
  </nav>
249
 
250
  <?php if( $view == 'pmpro-membershiplevels' || $view == 'pmpro-discountcodes' || $view == 'pmpro-pagesettings' || $view == 'pmpro-paymentsettings' || $view == 'pmpro-emailsettings' || $view == 'pmpro-emailtemplates' || $view == 'pmpro-advancedsettings' ) { ?>
251
  <ul class="subsubsub">
252
  <?php if(current_user_can('pmpro_membershiplevels')) { ?>
253
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-membershiplevels');?>" title="<?php _e('Membership Levels', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-membershiplevels') { ?>current<?php } ?>"><?php _e('Levels', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
254
  <?php } ?>
255
 
256
  <?php if(current_user_can('pmpro_discountcodes')) { ?>
257
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-discountcodes');?>" title="<?php _e('Discount Codes', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-discountcodes') { ?>current<?php } ?>"><?php _e('Discount Codes', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
258
  <?php } ?>
259
 
260
  <?php if(current_user_can('pmpro_pagesettings')) { ?>
261
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-pagesettings');?>" title="<?php _e('Page Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-pagesettings') { ?>current<?php } ?>"><?php _e('Pages', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
262
  <?php } ?>
263
 
264
  <?php if(current_user_can('pmpro_paymentsettings')) { ?>
265
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-paymentsettings');?>" title="<?php _e('Payment Gateway &amp; SSL Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-paymentsettings') { ?>current<?php } ?>"><?php _e('Payment Gateway &amp; SSL', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
266
  <?php } ?>
267
 
268
  <?php if(current_user_can('pmpro_emailsettings')) { ?>
269
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-emailsettings');?>" title="<?php _e('Email Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-emailsettings') { ?>current<?php } ?>"><?php _e('Email Settings', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
270
  <?php } ?>
271
 
272
  <?php if(current_user_can('pmpro_emailtemplates')) { ?>
273
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-emailtemplates');?>" title="<?php _e('Email Templates', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-emailtemplates') { ?>current<?php } ?>"><?php _e('Email Templates', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
274
  <?php } ?>
275
 
276
  <?php if(current_user_can('pmpro_advancedsettings')) { ?>
277
- <li><a href="<?php echo admin_url('admin.php?page=pmpro-advancedsettings');?>" title="<?php _e('Advanced Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-advancedsettings') { ?>current<?php } ?>"><?php _e('Advanced', 'paid-memberships-pro' );?></a></li>
278
  <?php } ?>
279
  </ul>
280
  <br class="clear" />
167
 
168
  <div class="wrap pmpro_admin">
169
  <div class="pmpro_banner">
170
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" rel="noopener noreferrer" href="https://www.paidmembershipspro.com/?utm_source=plugin&utm_medium=pmpro-admin-header&utm_campaign=homepage"><img src="<?php echo esc_url( PMPRO_URL . '/images/Paid-Memberships-Pro.png' ); ?>" width="350" height="75" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
171
  <div class="pmpro_meta">
172
  <span class="pmpro_version">v<?php echo PMPRO_VERSION?></span>
173
+ <a target="_blank" rel="noopener noreferrer" href="https://www.paidmembershipspro.com/documentation/?utm_source=plugin&utm_medium=pmpro-admin-header&utm_campaign=documentation"><?php esc_html_e('Documentation', 'paid-memberships-pro' ); ?></a>
174
+ <a target="_blank" href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-admin-header&utm_campaign=pricing&utm_content=get-support"><?php esc_html_e('Get Support', 'paid-memberships-pro' );?></a>
175
 
176
  <?php if ( pmpro_license_isValid( null, pmpro_license_get_premium_types() ) ) { ?>
177
  <?php printf(__( '<a class="pmpro_license_tag pmpro_license_tag-valid" href="%s">Valid License</a>', 'paid-memberships-pro' ), admin_url( 'admin.php?page=pmpro-license' ) ); ?>
219
  if( in_array( $view, $settings_tabs ) ) { ?>
220
  <nav class="nav-tab-wrapper">
221
  <?php if(current_user_can('pmpro_dashboard')) { ?>
222
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-dashboard' ) );?>" class="nav-tab<?php if($view == 'pmpro-dashboard') { ?> nav-tab-active<?php } ?>"><?php esc_html_e('Dashboard', 'paid-memberships-pro' );?></a>
223
  <?php } ?>
224
 
225
  <?php if(current_user_can('pmpro_memberslist')) { ?>
226
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-memberslist' ) );?>" class="nav-tab<?php if($view == 'pmpro-memberslist') { ?> nav-tab-active<?php } ?>"><?php esc_html_e('Members', 'paid-memberships-pro' );?></a>
227
  <?php } ?>
228
 
229
  <?php if(current_user_can('pmpro_orders')) { ?>
230
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-orders' ) );?>" class="nav-tab<?php if($view == 'pmpro-orders') { ?> nav-tab-active<?php } ?>"><?php esc_html_e('Orders', 'paid-memberships-pro' );?></a>
231
  <?php } ?>
232
 
233
  <?php if(current_user_can('pmpro_reports')) { ?>
234
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-reports' ) );?>" class="nav-tab<?php if($view == 'pmpro-reports') { ?> nav-tab-active<?php } ?>"><?php esc_html_e('Reports', 'paid-memberships-pro' );?></a>
235
  <?php } ?>
236
 
237
  <?php if(current_user_can('pmpro_membershiplevels')) { ?>
238
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-membershiplevels' ) );?>" class="nav-tab<?php if( in_array( $view, array( 'pmpro-membershiplevels', 'pmpro-discountcodes', 'pmpro-pagesettings', 'pmpro-paymentsettings', 'pmpro-emailsettings', 'pmpro-emailtemplates', 'pmpro-advancedsettings' ) ) ) { ?> nav-tab-active<?php } ?>"><?php esc_html_e('Settings', 'paid-memberships-pro' );?></a>
239
  <?php } ?>
240
 
241
  <?php if(current_user_can('pmpro_addons')) { ?>
242
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-addons' ) );?>" class="nav-tab<?php if($view == 'pmpro-addons') { ?> nav-tab-active<?php } ?>"><?php esc_html_e('Add Ons', 'paid-memberships-pro' );?></a>
243
  <?php } ?>
244
 
245
  <?php if(current_user_can('manage_options')) { ?>
246
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-license' ) );?>" class="nav-tab<?php if($view == 'pmpro-license') { ?> nav-tab-active<?php } ?>"><?php esc_html_e('License', 'paid-memberships-pro' );?></a>
247
  <?php } ?>
248
  </nav>
249
 
250
  <?php if( $view == 'pmpro-membershiplevels' || $view == 'pmpro-discountcodes' || $view == 'pmpro-pagesettings' || $view == 'pmpro-paymentsettings' || $view == 'pmpro-emailsettings' || $view == 'pmpro-emailtemplates' || $view == 'pmpro-advancedsettings' ) { ?>
251
  <ul class="subsubsub">
252
  <?php if(current_user_can('pmpro_membershiplevels')) { ?>
253
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-membershiplevels' ) );?>" title="<?php _e('Membership Levels', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-membershiplevels') { ?>current<?php } ?>"><?php esc_html_e('Levels', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
254
  <?php } ?>
255
 
256
  <?php if(current_user_can('pmpro_discountcodes')) { ?>
257
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-discountcodes' ) );?>" title="<?php _e('Discount Codes', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-discountcodes') { ?>current<?php } ?>"><?php esc_html_e('Discount Codes', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
258
  <?php } ?>
259
 
260
  <?php if(current_user_can('pmpro_pagesettings')) { ?>
261
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings' ) );?>" title="<?php _e('Page Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-pagesettings') { ?>current<?php } ?>"><?php esc_html_e('Pages', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
262
  <?php } ?>
263
 
264
  <?php if(current_user_can('pmpro_paymentsettings')) { ?>
265
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-paymentsettings' ) );?>" title="<?php _e('Payment Gateway &amp; SSL Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-paymentsettings') { ?>current<?php } ?>"><?php esc_html_e('Payment Gateway &amp; SSL', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
266
  <?php } ?>
267
 
268
  <?php if(current_user_can('pmpro_emailsettings')) { ?>
269
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-emailsettings' ) );?>" title="<?php _e('Email Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-emailsettings') { ?>current<?php } ?>"><?php esc_html_e('Email Settings', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
270
  <?php } ?>
271
 
272
  <?php if(current_user_can('pmpro_emailtemplates')) { ?>
273
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-emailtemplates' ) );?>" title="<?php _e('Email Templates', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-emailtemplates') { ?>current<?php } ?>"><?php esc_html_e('Email Templates', 'paid-memberships-pro' );?></a>&nbsp;|&nbsp;</li>
274
  <?php } ?>
275
 
276
  <?php if(current_user_can('pmpro_advancedsettings')) { ?>
277
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-advancedsettings' ) );?>" title="<?php _e('Advanced Settings', 'paid-memberships-pro' );?>" class="<?php if($view == 'pmpro-advancedsettings') { ?>current<?php } ?>"><?php esc_html_e('Advanced', 'paid-memberships-pro' );?></a></li>
278
  <?php } ?>
279
  </ul>
280
  <br class="clear" />
adminpages/advancedsettings.php CHANGED
@@ -12,29 +12,29 @@
12
  $msg = -1;
13
  $msgt = __("Are you sure you want to do that? Try again.", 'paid-memberships-pro' );
14
  unset($_REQUEST['savesettings']);
15
- }
16
-
17
  //get/set settings
18
  if(!empty($_REQUEST['savesettings']))
19
  {
20
  // Dashboard settings.
21
  pmpro_setOption( 'hide_toolbar' );
22
  pmpro_setOption( 'block_dashboard' );
23
-
24
  // Message settings.
25
  // These use wp_kses for better security handling.
26
  $nonmembertext = wp_kses(wp_unslash($_POST['nonmembertext']), $allowedposttags);
27
  update_option('pmpro_nonmembertext', $nonmembertext);
28
-
29
  $notloggedintext = wp_kses(wp_unslash($_POST['notloggedintext']), $allowedposttags);
30
  update_option('pmpro_notloggedintext', $notloggedintext);
31
-
32
  $rsstext = wp_kses(wp_unslash($_POST['rsstext']), $allowedposttags);
33
- update_option('pmpro_rsstext', $rsstext);
34
-
35
  // Content settings.
36
  pmpro_setOption("filterqueries");
37
- pmpro_setOption("showexcerpts");
38
 
39
  // Checkout settings.
40
  pmpro_setOption("tospage");
@@ -42,7 +42,7 @@
42
  pmpro_setOption("recaptcha");
43
  pmpro_setOption("recaptcha_version");
44
  pmpro_setOption("recaptcha_publickey");
45
- pmpro_setOption("recaptcha_privatekey");
46
 
47
  // Communication settings.
48
  pmpro_setOption("maxnotificationpriority");
@@ -50,9 +50,16 @@
50
 
51
  // Other settings.
52
  pmpro_setOption("hideads");
 
53
  pmpro_setOption("hideadslevels");
54
  pmpro_setOption("redirecttosubscription");
55
- pmpro_setOption("uninstall");
 
 
 
 
 
 
56
 
57
  /**
58
  * Filter to add custom settings to the advanced settings page.
@@ -63,7 +70,7 @@
63
  if(!empty($setting['field_name']))
64
  pmpro_setOption($setting['field_name']);
65
  }
66
-
67
  // Assume success.
68
  $msg = true;
69
  $msgt = __("Your advanced settings have been updated.", 'paid-memberships-pro' );
@@ -72,15 +79,15 @@
72
  // Dashboard settings.
73
  $hide_toolbar = pmpro_getOption( 'hide_toolbar' );
74
  $block_dashboard = pmpro_getOption( 'block_dashboard' );
75
-
76
  // Message settings.
77
  $nonmembertext = pmpro_getOption("nonmembertext");
78
  $notloggedintext = pmpro_getOption("notloggedintext");
79
  $rsstext = pmpro_getOption("rsstext");
80
-
81
  // Content settings.
82
  $filterqueries = pmpro_getOption('filterqueries');
83
- $showexcerpts = pmpro_getOption("showexcerpts");
84
 
85
  // Checkout settings.
86
  $tospage = pmpro_getOption("tospage");
@@ -96,6 +103,7 @@
96
 
97
  // Other settings.
98
  $hideads = pmpro_getOption("hideads");
 
99
  $hideadslevels = pmpro_getOption("hideadslevels");
100
  if( is_multisite() ) {
101
  $redirecttosubscription = pmpro_getOption("redirecttosubscription");
@@ -130,27 +138,26 @@
130
 
131
  <form action="" method="post" enctype="multipart/form-data">
132
  <?php wp_nonce_field('savesettings', 'pmpro_advancedsettings_nonce');?>
133
-
134
- <h1 class="wp-heading-inline"><?php esc_html_e( 'Advanced Settings', 'paid-memberships-pro' ); ?></h1>
135
  <hr class="wp-header-end">
 
136
  <div class="pmpro_admin_section pmpro_admin_section-restrict-dashboard">
137
  <h2 class="title"><?php esc_html_e( 'Restrict Dashboard Access', 'paid-memberships-pro' ); ?></h2>
138
  <table class="form-table">
139
  <tbody>
140
  <tr>
141
  <th scope="row" valign="top">
142
- <label for="block_dashboard"><?php _e('WordPress Dashboard', 'paid-memberships-pro' );?></label>
143
  </th>
144
  <td>
145
- <input id="block_dashboard" name="block_dashboard" type="checkbox" value="yes" <?php checked( $block_dashboard, 'yes' ); ?> /> <label for="block_dashboard"><?php _e('Block all users with the Subscriber role from accessing the Dashboard.', 'paid-memberships-pro' );?></label>
146
  </td>
147
  </tr>
148
  <tr>
149
  <th scope="row" valign="top">
150
- <label for="hide_toolbar"><?php _e('WordPress Toolbar', 'paid-memberships-pro' );?></label>
151
  </th>
152
  <td>
153
- <input id="hide_toolbar" name="hide_toolbar" type="checkbox" value="yes" <?php checked( $hide_toolbar, 'yes' ); ?> /> <label for="hide_toolbar"><?php _e('Hide the Toolbar from all users with the Subscriber role.', 'paid-memberships-pro' );?></label>
154
  </td>
155
  </tr>
156
  </tbody>
@@ -163,29 +170,29 @@
163
  <tbody>
164
  <tr>
165
  <th scope="row" valign="top">
166
- <label for="nonmembertext"><?php _e('Message for Logged-in Non-members', 'paid-memberships-pro' );?>:</label>
167
  </th>
168
  <td>
169
  <textarea name="nonmembertext" rows="3" cols="50" class="large-text"><?php echo stripslashes($nonmembertext)?></textarea>
170
- <p class="description"><?php _e('This message replaces the post content for non-members. Available variables', 'paid-memberships-pro' );?>: <code>!!levels!!</code> <code>!!referrer!!</code> <code>!!levels_page_url!!</code></p>
171
  </td>
172
  </tr>
173
  <tr>
174
  <th scope="row" valign="top">
175
- <label for="notloggedintext"><?php _e('Message for Logged-out Users', 'paid-memberships-pro' );?>:</label>
176
  </th>
177
  <td>
178
  <textarea name="notloggedintext" rows="3" cols="50" class="large-text"><?php echo stripslashes($notloggedintext)?></textarea>
179
- <p class="description"><?php _e('This message replaces the post content for logged-out visitors.', 'paid-memberships-pro' );?> <?php _e('Available variables', 'paid-memberships-pro' );?>: <code>!!levels!!</code> <code>!!referrer!!</code> <code>!!login_url!!</code> <code>!!levels_page_url!!</code></p>
180
  </td>
181
  </tr>
182
  <tr>
183
  <th scope="row" valign="top">
184
- <label for="rsstext"><?php _e('Message for RSS Feed', 'paid-memberships-pro' );?>:</label>
185
  </th>
186
  <td>
187
  <textarea name="rsstext" rows="3" cols="50" class="large-text"><?php echo stripslashes($rsstext)?></textarea>
188
- <p class="description"><?php _e('This message replaces the post content in RSS feeds.', 'paid-memberships-pro' );?> <?php _e('Available variables', 'paid-memberships-pro' );?>: <code>!!levels!!</code></p>
189
  </td>
190
  </tr>
191
  </tbody>
@@ -198,23 +205,23 @@
198
  <tbody>
199
  <tr>
200
  <th scope="row" valign="top">
201
- <label for="filterqueries"><?php _e("Filter searches and archives?", 'paid-memberships-pro' );?></label>
202
  </th>
203
  <td>
204
  <select id="filterqueries" name="filterqueries">
205
- <option value="0" <?php if(!$filterqueries) { ?>selected="selected"<?php } ?>><?php _e('No - Non-members will see restricted posts/pages in searches and archives.', 'paid-memberships-pro' );?></option>
206
- <option value="1" <?php if($filterqueries == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Only members will see restricted posts/pages in searches and archives.', 'paid-memberships-pro' );?></option>
207
  </select>
208
  </td>
209
  </tr>
210
  <tr>
211
  <th scope="row" valign="top">
212
- <label for="showexcerpts"><?php _e('Show Excerpts to Non-Members?', 'paid-memberships-pro' );?></label>
213
  </th>
214
  <td>
215
  <select id="showexcerpts" name="showexcerpts">
216
- <option value="0" <?php if(!$showexcerpts) { ?>selected="selected"<?php } ?>><?php _e('No - Hide excerpts.', 'paid-memberships-pro' );?></option>
217
- <option value="1" <?php if($showexcerpts == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Show excerpts.', 'paid-memberships-pro' );?></option>
218
  </select>
219
  </td>
220
  </tr>
@@ -228,40 +235,40 @@
228
  <tbody>
229
  <tr>
230
  <th scope="row" valign="top">
231
- <label for="tospage"><?php _e('Require Terms of Service on signups?', 'paid-memberships-pro' );?></label>
232
  </th>
233
  <td>
234
  <?php
235
  wp_dropdown_pages(array("name"=>"tospage", "show_option_none"=>"No", "selected"=>$tospage));
236
  ?>
237
  <br />
238
- <p class="description"><?php _e('If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above.', 'paid-memberships-pro' );?></p>
239
  </td>
240
  </tr>
241
  <tr>
242
  <th scope="row" valign="top">
243
- <label for="spamprotection"><?php _e('Enable Spam Protection?', 'paid-memberships-pro' );?>:</label>
244
  </th>
245
  <td>
246
  <select id="spamprotection" name="spamprotection">
247
- <option value="0" <?php if(!$spamprotection) { ?>selected="selected"<?php } ?>><?php _e('No', 'paid-memberships-pro' );?></option>
248
  <!-- For reference, removed the Yes - Free memberships only. option -->
249
- <option value="2" <?php if( $spamprotection > 0 ) { ?>selected="selected"<?php } ?>><?php _e('Yes - Enable Spam Protection', 'paid-memberships-pro' );?></option>
250
  </select>
251
  <p class="description"><?php printf( __( 'Block IPs from checkout if there are more than %d failures within %d minutes.', 'paid-memberships-pro' ), PMPRO_SPAM_ACTION_NUM_LIMIT, round(PMPRO_SPAM_ACTION_TIME_LIMIT/60,2) );?></p>
252
  </td>
253
  </tr>
254
  <tr>
255
  <th scope="row" valign="top">
256
- <label for="recaptcha"><?php _e('Use reCAPTCHA?', 'paid-memberships-pro' );?>:</label>
257
  </th>
258
  <td>
259
  <select id="recaptcha" name="recaptcha" onchange="pmpro_updateRecaptchaTRs();">
260
- <option value="0" <?php if(!$recaptcha) { ?>selected="selected"<?php } ?>><?php _e('No', 'paid-memberships-pro' );?></option>
261
  <!-- For reference, removed the Yes - Free memberships only. option -->
262
- <option value="2" <?php if( $recaptcha > 0 ) { ?>selected="selected"<?php } ?>><?php _e('Yes - All memberships.', 'paid-memberships-pro' );?></option>
263
  </select>
264
- <p class="description"><?php _e('A free reCAPTCHA key is required.', 'paid-memberships-pro' );?> <a href="https://www.google.com/recaptcha/admin/create"><?php _e('Click here to signup for reCAPTCHA', 'paid-memberships-pro' );?></a>.</p>
265
  </td>
266
  </tr>
267
  </tbody>
@@ -269,23 +276,23 @@
269
  <table class="form-table" id="recaptcha_settings" <?php if(!$recaptcha) { ?>style="display: none;"<?php } ?>>
270
  <tbody>
271
  <tr>
272
- <th scope="row" valign="top"><label for="recaptcha_version"><?php _e( 'reCAPTCHA Version', 'paid-memberships-pro' );?>:</label></th>
273
  <td>
274
  <select id="recaptcha_version" name="recaptcha_version">
275
- <option value="2_checkbox" <?php selected( '2_checkbox', $recaptcha_version ); ?>><?php _e( ' v2 - Checkbox', 'paid-memberships-pro' ); ?></option>
276
- <option value="3_invisible" <?php selected( '3_invisible', $recaptcha_version ); ?>><?php _e( 'v3 - Invisible', 'paid-memberships-pro' ); ?></option>
277
  </select>
278
- <p class="description"><?php _e( 'Changing your version will require new API keys.', 'paid-memberships-pro' ); ?></p>
279
  </td>
280
  </tr>
281
  <tr>
282
- <th scope="row"><label for="recaptcha_publickey"><?php _e('reCAPTCHA Site Key', 'paid-memberships-pro' );?>:</label></th>
283
  <td>
284
  <input type="text" id="recaptcha_publickey" name="recaptcha_publickey" value="<?php echo esc_attr($recaptcha_publickey);?>" class="regular-text code" />
285
  </td>
286
  </tr>
287
  <tr>
288
- <th scope="row"><label for="recaptcha_privatekey"><?php _e('reCAPTCHA Secret Key', 'paid-memberships-pro' );?>:</label></th>
289
  <td>
290
  <input type="text" id="recaptcha_privatekey" name="recaptcha_privatekey" value="<?php echo esc_attr($recaptcha_privatekey);?>" class="regular-text code" />
291
  </td>
@@ -298,7 +305,7 @@
298
  <h2 class="title"><?php esc_html_e( 'Communication Settings', 'paid-memberships-pro' ); ?></h2>
299
  <table class="form-table">
300
  <tr>
301
- <th><?php _e( 'Notifications', 'paid-memberships-pro' ); ?></th>
302
  <td>
303
  <select name="maxnotificationpriority">
304
  <option value="5" <?php selected( $maxnotificationpriority, 5 ); ?>>
@@ -309,12 +316,12 @@
309
  </option>
310
  </select>
311
  <br />
312
- <p class="description"><?php _e('Notifications are occasionally shown on the Paid Memberships Pro settings pages.', 'paid-memberships-pro' );?></p>
313
  </td>
314
  </tr>
315
  <tr>
316
  <th>
317
- <label for="activity_email_frequency"><?php _e('Activity Email Frequency', 'paid-memberships-pro' );?></label>
318
  </th>
319
  <td>
320
  <select name="activity_email_frequency">
@@ -332,7 +339,7 @@
332
  </option>
333
  </select>
334
  <br />
335
- <p class="description"><?php _e( 'Send periodic sales and revenue updates from this site to the administration email address.', 'paid-memberships-pro' );?></p>
336
  </td>
337
  </tr>
338
  </tbody>
@@ -345,29 +352,29 @@
345
  <tbody>
346
  <tr>
347
  <th scope="row" valign="top">
348
- <label for="hideads"><?php _e("Hide Ads From Members?", 'paid-memberships-pro' );?></label>
349
  </th>
350
  <td>
351
  <select id="hideads" name="hideads" onchange="pmpro_updateHideAdsTRs();">
352
- <option value="0" <?php if(!$hideads) { ?>selected="selected"<?php } ?>><?php _e('No', 'paid-memberships-pro' );?></option>
353
- <option value="1" <?php if($hideads == 1) { ?>selected="selected"<?php } ?>><?php _e('Hide Ads From All Members', 'paid-memberships-pro' );?></option>
354
- <option value="2" <?php if($hideads == 2) { ?>selected="selected"<?php } ?>><?php _e('Hide Ads From Certain Members', 'paid-memberships-pro' );?></option>
355
  </select>
356
  </td>
357
  </tr>
358
  <tr id="hideads_explanation" <?php if($hideads < 2) { ?>style="display: none;"<?php } ?>>
359
  <th scope="row" valign="top">&nbsp;</th>
360
  <td>
361
- <p><?php _e('To hide ads in your template code, use code like the following', 'paid-memberships-pro' );?>:</p>
362
  <pre lang="PHP">
363
  if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
364
  //insert ad code here
365
  }</pre>
366
  </td>
367
- </tr>
368
  <tr id="hideadslevels_tr" <?php if($hideads != 2) { ?>style="display: none;"<?php } ?>>
369
  <th scope="row" valign="top">
370
- <label for="hideadslevels"><?php _e('Choose Levels to Hide Ads From', 'paid-memberships-pro' );?>:</label>
371
  </th>
372
  <td>
373
  <?php
@@ -404,16 +411,16 @@ if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
404
  <?php if(is_multisite()) { ?>
405
  <tr>
406
  <th scope="row" valign="top">
407
- <label for="redirecttosubscription"><?php _e('Redirect all traffic from registration page to /susbcription/?', 'paid-memberships-pro' );?>: <em>(<?php _e('multisite only', 'paid-memberships-pro' );?>)</em></label>
408
  </th>
409
  <td>
410
  <select id="redirecttosubscription" name="redirecttosubscription">
411
- <option value="0" <?php if(!$redirecttosubscription) { ?>selected="selected"<?php } ?>><?php _e('No', 'paid-memberships-pro' );?></option>
412
- <option value="1" <?php if($redirecttosubscription == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'paid-memberships-pro' );?></option>
413
  </select>
414
  </td>
415
  </tr>
416
- <?php } ?>
417
  <?php
418
  // Filter to Add More Advanced Settings for Misc Plugin Options, etc.
419
  if (has_action('pmpro_custom_advanced_settings')) {
@@ -432,7 +439,7 @@ if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
432
  ?>
433
  <select id="<?php echo esc_attr( $field['field_name'] ); ?>"
434
  name="<?php echo esc_attr( $field['field_name'] ); ?>">
435
- <?php
436
  //For associative arrays, we use the array keys as values. For numerically indexed arrays, we use the array values.
437
  $is_associative = (bool)count(array_filter(array_keys($field['options']), 'is_string'));
438
  foreach ($field['options'] as $key => $option) {
@@ -442,7 +449,7 @@ if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
442
  <?php echo esc_textarea($option); ?>
443
  </option>
444
  <?php
445
- }
446
  ?>
447
  </select>
448
  <?php
@@ -483,16 +490,41 @@ if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
483
  </tr>
484
  <?php
485
  }
486
- }
487
  ?>
488
  <tr>
489
  <th scope="row" valign="top">
490
- <label for="uninstall"><?php _e('Uninstall PMPro on deletion?', 'paid-memberships-pro' );?></label>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
491
  </th>
492
  <td>
493
  <select id="uninstall" name="uninstall">
494
- <option value="0" <?php if ( ! $uninstall ) { ?>selected="selected"<?php } ?>><?php _e( 'No', 'paid-memberships-pro' );?></option>
495
- <option value="1" <?php if ( $uninstall == 1 ) { ?>selected="selected"<?php } ?>><?php _e( 'Yes - Delete all PMPro Data.', 'paid-memberships-pro' );?></option>
496
  </select>
497
  <p class="description"><?php esc_html_e( 'To delete all PMPro data from the database, set to Yes, deactivate PMPro, and then click to delete PMPro from the plugins page.', 'paid-memberships-pro' ); ?></p>
498
  </td>
@@ -537,9 +569,9 @@ if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
537
  }
538
  pmpro_updateRecaptchaTRs();
539
  </script>
540
- </div> <!-- end pmpro_admin_section-other-settings -->
541
  <p class="submit">
542
- <input name="savesettings" type="submit" class="button button-primary" value="<?php _e('Save Settings', 'paid-memberships-pro' );?>" />
543
  </p>
544
  </form>
545
 
12
  $msg = -1;
13
  $msgt = __("Are you sure you want to do that? Try again.", 'paid-memberships-pro' );
14
  unset($_REQUEST['savesettings']);
15
+ }
16
+
17
  //get/set settings
18
  if(!empty($_REQUEST['savesettings']))
19
  {
20
  // Dashboard settings.
21
  pmpro_setOption( 'hide_toolbar' );
22
  pmpro_setOption( 'block_dashboard' );
23
+
24
  // Message settings.
25
  // These use wp_kses for better security handling.
26
  $nonmembertext = wp_kses(wp_unslash($_POST['nonmembertext']), $allowedposttags);
27
  update_option('pmpro_nonmembertext', $nonmembertext);
28
+
29
  $notloggedintext = wp_kses(wp_unslash($_POST['notloggedintext']), $allowedposttags);
30
  update_option('pmpro_notloggedintext', $notloggedintext);
31
+
32
  $rsstext = wp_kses(wp_unslash($_POST['rsstext']), $allowedposttags);
33
+ update_option('pmpro_rsstext', $rsstext);
34
+
35
  // Content settings.
36
  pmpro_setOption("filterqueries");
37
+ pmpro_setOption("showexcerpts");
38
 
39
  // Checkout settings.
40
  pmpro_setOption("tospage");
42
  pmpro_setOption("recaptcha");
43
  pmpro_setOption("recaptcha_version");
44
  pmpro_setOption("recaptcha_publickey");
45
+ pmpro_setOption("recaptcha_privatekey");
46
 
47
  // Communication settings.
48
  pmpro_setOption("maxnotificationpriority");
50
 
51
  // Other settings.
52
  pmpro_setOption("hideads");
53
+ pmpro_setOption("wisdom_opt_out");
54
  pmpro_setOption("hideadslevels");
55
  pmpro_setOption("redirecttosubscription");
56
+ pmpro_setOption("uninstall");
57
+
58
+ // Set up Wisdom tracking cron if needed.
59
+ if ( (int)pmpro_getOption("wisdom_opt_out") === 0 ) {
60
+ $wisdom_integration = PMPro_Wisdom_Integration::instance();
61
+ $wisdom_integration->wisdom_tracker->schedule_tracking();
62
+ }
63
 
64
  /**
65
  * Filter to add custom settings to the advanced settings page.
70
  if(!empty($setting['field_name']))
71
  pmpro_setOption($setting['field_name']);
72
  }
73
+
74
  // Assume success.
75
  $msg = true;
76
  $msgt = __("Your advanced settings have been updated.", 'paid-memberships-pro' );
79
  // Dashboard settings.
80
  $hide_toolbar = pmpro_getOption( 'hide_toolbar' );
81
  $block_dashboard = pmpro_getOption( 'block_dashboard' );
82
+
83
  // Message settings.
84
  $nonmembertext = pmpro_getOption("nonmembertext");
85
  $notloggedintext = pmpro_getOption("notloggedintext");
86
  $rsstext = pmpro_getOption("rsstext");
87
+
88
  // Content settings.
89
  $filterqueries = pmpro_getOption('filterqueries');
90
+ $showexcerpts = pmpro_getOption("showexcerpts");
91
 
92
  // Checkout settings.
93
  $tospage = pmpro_getOption("tospage");
103
 
104
  // Other settings.
105
  $hideads = pmpro_getOption("hideads");
106
+ $wisdom_opt_out = (int)pmpro_getOption("wisdom_opt_out");
107
  $hideadslevels = pmpro_getOption("hideadslevels");
108
  if( is_multisite() ) {
109
  $redirecttosubscription = pmpro_getOption("redirecttosubscription");
138
 
139
  <form action="" method="post" enctype="multipart/form-data">
140
  <?php wp_nonce_field('savesettings', 'pmpro_advancedsettings_nonce');?>
 
 
141
  <hr class="wp-header-end">
142
+ <h1 class="wp-heading-inline"><?php esc_html_e( 'Advanced Settings', 'paid-memberships-pro' ); ?></h1>
143
  <div class="pmpro_admin_section pmpro_admin_section-restrict-dashboard">
144
  <h2 class="title"><?php esc_html_e( 'Restrict Dashboard Access', 'paid-memberships-pro' ); ?></h2>
145
  <table class="form-table">
146
  <tbody>
147
  <tr>
148
  <th scope="row" valign="top">
149
+ <label for="block_dashboard"><?php esc_html_e('WordPress Dashboard', 'paid-memberships-pro' );?></label>
150
  </th>
151
  <td>
152
+ <input id="block_dashboard" name="block_dashboard" type="checkbox" value="yes" <?php checked( $block_dashboard, 'yes' ); ?> /> <label for="block_dashboard"><?php esc_html_e('Block all users with the Subscriber role from accessing the Dashboard.', 'paid-memberships-pro' );?></label>
153
  </td>
154
  </tr>
155
  <tr>
156
  <th scope="row" valign="top">
157
+ <label for="hide_toolbar"><?php esc_html_e('WordPress Toolbar', 'paid-memberships-pro' );?></label>
158
  </th>
159
  <td>
160
+ <input id="hide_toolbar" name="hide_toolbar" type="checkbox" value="yes" <?php checked( $hide_toolbar, 'yes' ); ?> /> <label for="hide_toolbar"><?php esc_html_e('Hide the Toolbar from all users with the Subscriber role.', 'paid-memberships-pro' );?></label>
161
  </td>
162
  </tr>
163
  </tbody>
170
  <tbody>
171
  <tr>
172
  <th scope="row" valign="top">
173
+ <label for="nonmembertext"><?php esc_html_e('Message for Logged-in Non-members', 'paid-memberships-pro' );?>:</label>
174
  </th>
175
  <td>
176
  <textarea name="nonmembertext" rows="3" cols="50" class="large-text"><?php echo stripslashes($nonmembertext)?></textarea>
177
+ <p class="description"><?php esc_html_e('This message replaces the post content for non-members. Available variables', 'paid-memberships-pro' );?>: <code>!!levels!!</code> <code>!!referrer!!</code> <code>!!levels_page_url!!</code></p>
178
  </td>
179
  </tr>
180
  <tr>
181
  <th scope="row" valign="top">
182
+ <label for="notloggedintext"><?php esc_html_e('Message for Logged-out Users', 'paid-memberships-pro' );?>:</label>
183
  </th>
184
  <td>
185
  <textarea name="notloggedintext" rows="3" cols="50" class="large-text"><?php echo stripslashes($notloggedintext)?></textarea>
186
+ <p class="description"><?php esc_html_e('This message replaces the post content for logged-out visitors.', 'paid-memberships-pro' );?> <?php esc_html_e('Available variables', 'paid-memberships-pro' );?>: <code>!!levels!!</code> <code>!!referrer!!</code> <code>!!login_url!!</code> <code>!!levels_page_url!!</code></p>
187
  </td>
188
  </tr>
189
  <tr>
190
  <th scope="row" valign="top">
191
+ <label for="rsstext"><?php esc_html_e('Message for RSS Feed', 'paid-memberships-pro' );?>:</label>
192
  </th>
193
  <td>
194
  <textarea name="rsstext" rows="3" cols="50" class="large-text"><?php echo stripslashes($rsstext)?></textarea>
195
+ <p class="description"><?php esc_html_e('This message replaces the post content in RSS feeds.', 'paid-memberships-pro' );?> <?php esc_html_e('Available variables', 'paid-memberships-pro' );?>: <code>!!levels!!</code></p>
196
  </td>
197
  </tr>
198
  </tbody>
205
  <tbody>
206
  <tr>
207
  <th scope="row" valign="top">
208
+ <label for="filterqueries"><?php esc_html_e("Filter searches and archives?", 'paid-memberships-pro' );?></label>
209
  </th>
210
  <td>
211
  <select id="filterqueries" name="filterqueries">
212
+ <option value="0" <?php if(!$filterqueries) { ?>selected="selected"<?php } ?>><?php esc_html_e('No - Non-members will see restricted posts/pages in searches and archives.', 'paid-memberships-pro' );?></option>
213
+ <option value="1" <?php if($filterqueries == 1) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes - Only members will see restricted posts/pages in searches and archives.', 'paid-memberships-pro' );?></option>
214
  </select>
215
  </td>
216
  </tr>
217
  <tr>
218
  <th scope="row" valign="top">
219
+ <label for="showexcerpts"><?php esc_html_e('Show Excerpts to Non-Members?', 'paid-memberships-pro' );?></label>
220
  </th>
221
  <td>
222
  <select id="showexcerpts" name="showexcerpts">
223
+ <option value="0" <?php if(!$showexcerpts) { ?>selected="selected"<?php } ?>><?php esc_html_e('No - Hide excerpts.', 'paid-memberships-pro' );?></option>
224
+ <option value="1" <?php if($showexcerpts == 1) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes - Show excerpts.', 'paid-memberships-pro' );?></option>
225
  </select>
226
  </td>
227
  </tr>
235
  <tbody>
236
  <tr>
237
  <th scope="row" valign="top">
238
+ <label for="tospage"><?php esc_html_e('Require Terms of Service on signups?', 'paid-memberships-pro' );?></label>
239
  </th>
240
  <td>
241
  <?php
242
  wp_dropdown_pages(array("name"=>"tospage", "show_option_none"=>"No", "selected"=>$tospage));
243
  ?>
244
  <br />
245
+ <p class="description"><?php esc_html_e('If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above.', 'paid-memberships-pro' );?></p>
246
  </td>
247
  </tr>
248
  <tr>
249
  <th scope="row" valign="top">
250
+ <label for="spamprotection"><?php esc_html_e('Enable Spam Protection?', 'paid-memberships-pro' );?>:</label>
251
  </th>
252
  <td>
253
  <select id="spamprotection" name="spamprotection">
254
+ <option value="0" <?php if(!$spamprotection) { ?>selected="selected"<?php } ?>><?php esc_html_e('No', 'paid-memberships-pro' );?></option>
255
  <!-- For reference, removed the Yes - Free memberships only. option -->
256
+ <option value="2" <?php if( $spamprotection > 0 ) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes - Enable Spam Protection', 'paid-memberships-pro' );?></option>
257
  </select>
258
  <p class="description"><?php printf( __( 'Block IPs from checkout if there are more than %d failures within %d minutes.', 'paid-memberships-pro' ), PMPRO_SPAM_ACTION_NUM_LIMIT, round(PMPRO_SPAM_ACTION_TIME_LIMIT/60,2) );?></p>
259
  </td>
260
  </tr>
261
  <tr>
262
  <th scope="row" valign="top">
263
+ <label for="recaptcha"><?php esc_html_e('Use reCAPTCHA?', 'paid-memberships-pro' );?>:</label>
264
  </th>
265
  <td>
266
  <select id="recaptcha" name="recaptcha" onchange="pmpro_updateRecaptchaTRs();">
267
+ <option value="0" <?php if(!$recaptcha) { ?>selected="selected"<?php } ?>><?php esc_html_e('No', 'paid-memberships-pro' );?></option>
268
  <!-- For reference, removed the Yes - Free memberships only. option -->
269
+ <option value="2" <?php if( $recaptcha > 0 ) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes - All memberships.', 'paid-memberships-pro' );?></option>
270
  </select>
271
+ <p class="description"><?php esc_html_e('A free reCAPTCHA key is required.', 'paid-memberships-pro' );?> <a href="https://www.google.com/recaptcha/admin/create" target="_blank" rel="nofollow noopener"><?php esc_html_e('Click here to signup for reCAPTCHA', 'paid-memberships-pro' );?></a>.</p>
272
  </td>
273
  </tr>
274
  </tbody>
276
  <table class="form-table" id="recaptcha_settings" <?php if(!$recaptcha) { ?>style="display: none;"<?php } ?>>
277
  <tbody>
278
  <tr>
279
+ <th scope="row" valign="top"><label for="recaptcha_version"><?php esc_html_e( 'reCAPTCHA Version', 'paid-memberships-pro' );?>:</label></th>
280
  <td>
281
  <select id="recaptcha_version" name="recaptcha_version">
282
+ <option value="2_checkbox" <?php selected( '2_checkbox', $recaptcha_version ); ?>><?php esc_html_e( ' v2 - Checkbox', 'paid-memberships-pro' ); ?></option>
283
+ <option value="3_invisible" <?php selected( '3_invisible', $recaptcha_version ); ?>><?php esc_html_e( 'v3 - Invisible', 'paid-memberships-pro' ); ?></option>
284
  </select>
285
+ <p class="description"><?php esc_html_e( 'Changing your version will require new API keys.', 'paid-memberships-pro' ); ?></p>
286
  </td>
287
  </tr>
288
  <tr>
289
+ <th scope="row"><label for="recaptcha_publickey"><?php esc_html_e('reCAPTCHA Site Key', 'paid-memberships-pro' );?>:</label></th>
290
  <td>
291
  <input type="text" id="recaptcha_publickey" name="recaptcha_publickey" value="<?php echo esc_attr($recaptcha_publickey);?>" class="regular-text code" />
292
  </td>
293
  </tr>
294
  <tr>
295
+ <th scope="row"><label for="recaptcha_privatekey"><?php esc_html_e('reCAPTCHA Secret Key', 'paid-memberships-pro' );?>:</label></th>
296
  <td>
297
  <input type="text" id="recaptcha_privatekey" name="recaptcha_privatekey" value="<?php echo esc_attr($recaptcha_privatekey);?>" class="regular-text code" />
298
  </td>
305
  <h2 class="title"><?php esc_html_e( 'Communication Settings', 'paid-memberships-pro' ); ?></h2>
306
  <table class="form-table">
307
  <tr>
308
+ <th><?php esc_html_e( 'Notifications', 'paid-memberships-pro' ); ?></th>
309
  <td>
310
  <select name="maxnotificationpriority">
311
  <option value="5" <?php selected( $maxnotificationpriority, 5 ); ?>>
316
  </option>
317
  </select>
318
  <br />
319
+ <p class="description"><?php esc_html_e('Notifications are occasionally shown on the Paid Memberships Pro settings pages.', 'paid-memberships-pro' );?></p>
320
  </td>
321
  </tr>
322
  <tr>
323
  <th>
324
+ <label for="activity_email_frequency"><?php esc_html_e('Activity Email Frequency', 'paid-memberships-pro' );?></label>
325
  </th>
326
  <td>
327
  <select name="activity_email_frequency">
339
  </option>
340
  </select>
341
  <br />
342
+ <p class="description"><?php esc_html_e( 'Send periodic sales and revenue updates from this site to the administration email address.', 'paid-memberships-pro' );?></p>
343
  </td>
344
  </tr>
345
  </tbody>
352
  <tbody>
353
  <tr>
354
  <th scope="row" valign="top">
355
+ <label for="hideads"><?php esc_html_e("Hide Ads From Members?", 'paid-memberships-pro' );?></label>
356
  </th>
357
  <td>
358
  <select id="hideads" name="hideads" onchange="pmpro_updateHideAdsTRs();">
359
+ <option value="0" <?php if(!$hideads) { ?>selected="selected"<?php } ?>><?php esc_html_e('No', 'paid-memberships-pro' );?></option>
360
+ <option value="1" <?php if($hideads == 1) { ?>selected="selected"<?php } ?>><?php esc_html_e('Hide Ads From All Members', 'paid-memberships-pro' );?></option>
361
+ <option value="2" <?php if($hideads == 2) { ?>selected="selected"<?php } ?>><?php esc_html_e('Hide Ads From Certain Members', 'paid-memberships-pro' );?></option>
362
  </select>
363
  </td>
364
  </tr>
365
  <tr id="hideads_explanation" <?php if($hideads < 2) { ?>style="display: none;"<?php } ?>>
366
  <th scope="row" valign="top">&nbsp;</th>
367
  <td>
368
+ <p><?php esc_html_e('To hide ads in your template code, use code like the following', 'paid-memberships-pro' );?>:</p>
369
  <pre lang="PHP">
370
  if ( function_exists( 'pmpro_displayAds' ) && pmpro_displayAds() ) {
371
  //insert ad code here
372
  }</pre>
373
  </td>
374
+ </tr>
375
  <tr id="hideadslevels_tr" <?php if($hideads != 2) { ?>style="display: none;"<?php } ?>>
376
  <th scope="row" valign="top">
377
+ <label for="hideadslevels"><?php esc_html_e('Choose Levels to Hide Ads From', 'paid-memberships-pro' );?>:</label>
378
  </th>
379
  <td>
380
  <?php
411
  <?php if(is_multisite()) { ?>
412
  <tr>
413
  <th scope="row" valign="top">
414
+ <label for="redirecttosubscription"><?php esc_html_e('Redirect all traffic from registration page to /subscription/?', 'paid-memberships-pro' );?>: <em>(<?php esc_html_e('multisite only', 'paid-memberships-pro' );?>)</em></label>
415
  </th>
416
  <td>
417
  <select id="redirecttosubscription" name="redirecttosubscription">
418
+ <option value="0" <?php if(!$redirecttosubscription) { ?>selected="selected"<?php } ?>><?php esc_html_e('No', 'paid-memberships-pro' );?></option>
419
+ <option value="1" <?php if($redirecttosubscription == 1) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes', 'paid-memberships-pro' );?></option>
420
  </select>
421
  </td>
422
  </tr>
423
+ <?php } ?>
424
  <?php
425
  // Filter to Add More Advanced Settings for Misc Plugin Options, etc.
426
  if (has_action('pmpro_custom_advanced_settings')) {
439
  ?>
440
  <select id="<?php echo esc_attr( $field['field_name'] ); ?>"
441
  name="<?php echo esc_attr( $field['field_name'] ); ?>">
442
+ <?php
443
  //For associative arrays, we use the array keys as values. For numerically indexed arrays, we use the array values.
444
  $is_associative = (bool)count(array_filter(array_keys($field['options']), 'is_string'));
445
  foreach ($field['options'] as $key => $option) {
449
  <?php echo esc_textarea($option); ?>
450
  </option>
451
  <?php
452
+ }
453
  ?>
454
  </select>
455
  <?php
490
  </tr>
491
  <?php
492
  }
493
+ }
494
  ?>
495
  <tr>
496
  <th scope="row" valign="top">
497
+ <label for="wisdom_opt_out">
498
+ <?php esc_html_e( 'Enable Tracking', 'paid-memberships-pro' ); ?>
499
+ </label>
500
+ </th>
501
+ <td>
502
+ <p>
503
+ <label>
504
+ <input name="wisdom_opt_out" type="radio" value="0"<?php checked( 0, $wisdom_opt_out ); ?> />
505
+ <?php esc_html_e( 'Allow usage of Paid Memberships Pro to be tracked.', 'paid-memberships-pro' );?>
506
+ </label>
507
+ </p>
508
+ <p>
509
+ <label>
510
+ <input name="wisdom_opt_out" type="radio" value="1"<?php checked( 1, $wisdom_opt_out ); ?> />
511
+ <?php esc_html_e( 'Do not track usage of Paid Memberships Pro on my site.', 'paid-memberships-pro' );?>
512
+ </label>
513
+ </p>
514
+ <p class="description">
515
+ <?php esc_html_e( 'Sharing non-sensitive membership site data helps us analyze how our plugin is meeting your needs and identify opportunities to improve. Read about what usage data is tracked:', 'paid-memberships-pro' ); ?>
516
+ <a href="https://www.paidmembershipspro.com/privacy-policy/usage-tracking/" title="<?php esc_attr_e( 'PaidMembershipsPro.com Usage Tracking', 'paid-memberships-pro' ); ?>" target="_blank" rel="nofollow noopener"><?php esc_html_e( 'Paid Memberships Pro Usage Tracking', 'paid-memberships-pro' ); ?></a>.
517
+ </p>
518
+ </td>
519
+ </tr>
520
+ <tr>
521
+ <th scope="row" valign="top">
522
+ <label for="uninstall"><?php esc_html_e('Uninstall PMPro on deletion?', 'paid-memberships-pro' );?></label>
523
  </th>
524
  <td>
525
  <select id="uninstall" name="uninstall">
526
+ <option value="0" <?php if ( ! $uninstall ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'No', 'paid-memberships-pro' );?></option>
527
+ <option value="1" <?php if ( $uninstall == 1 ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Yes - Delete all PMPro Data.', 'paid-memberships-pro' );?></option>
528
  </select>
529
  <p class="description"><?php esc_html_e( 'To delete all PMPro data from the database, set to Yes, deactivate PMPro, and then click to delete PMPro from the plugins page.', 'paid-memberships-pro' ); ?></p>
530
  </td>
569
  }
570
  pmpro_updateRecaptchaTRs();
571
  </script>
572
+ </div> <!-- end pmpro_admin_section-other-settings -->
573
  <p class="submit">
574
+ <input name="savesettings" type="submit" class="button button-primary" value="<?php esc_attr_e('Save Settings', 'paid-memberships-pro' );?>" />
575
  </p>
576
  </form>
577
 
adminpages/dashboard.php CHANGED
@@ -105,14 +105,14 @@ function pmpro_dashboard_welcome_callback() { ?>
105
  <div class="pmpro-dashboard-welcome-columns">
106
  <div class="pmpro-dashboard-welcome-column">
107
  <?php global $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready; ?>
108
- <h3><?php echo esc_attr_e( 'Initial Setup', 'paid-memberships-pro' ); ?></h3>
109
  <ul>
110
  <?php if ( current_user_can( 'pmpro_membershiplevels' ) ) { ?>
111
  <li>
112
  <?php if ( empty( $pmpro_level_ready ) ) { ?>
113
- <a href="<?php echo admin_url( 'admin.php?page=pmpro-membershiplevels&edit=-1' );?>"><i class="dashicons dashicons-admin-users"></i> <?php echo esc_attr_e( 'Create a Membership Level', 'paid-memberships-pro' ); ?></a>
114
  <?php } else { ?>
115
- <a href="<?php echo admin_url( 'admin.php?page=pmpro-membershiplevels' );?>"><i class="dashicons dashicons-admin-users"></i> <?php echo esc_attr_e( 'View Membership Levels', 'paid-memberships-pro' ); ?></a>
116
  <?php } ?>
117
  </li>
118
  <?php } ?>
@@ -120,9 +120,9 @@ function pmpro_dashboard_welcome_callback() { ?>
120
  <?php if ( current_user_can( 'pmpro_pagesettings' ) ) { ?>
121
  <li>
122
  <?php if ( empty( $pmpro_pages_ready ) ) { ?>
123
- <a href="<?php echo admin_url( 'admin.php?page=pmpro-pagesettings' );?>"><i class="dashicons dashicons-welcome-add-page"></i> <?php echo esc_attr_e( 'Generate Membership Pages', 'paid-memberships-pro' ); ?></a>
124
  <?php } else { ?>
125
- <a href="<?php echo admin_url( 'admin.php?page=pmpro-pagesettings' );?>"><i class="dashicons dashicons-welcome-add-page"></i> <?php echo esc_attr_e( 'Manage Membership Pages', 'paid-memberships-pro' ); ?>
126
  <?php } ?>
127
  </li>
128
  <?php } ?>
@@ -130,39 +130,39 @@ function pmpro_dashboard_welcome_callback() { ?>
130
  <?php if ( current_user_can( 'pmpro_pagesettings' ) ) { ?>
131
  <li>
132
  <?php if ( empty( $pmpro_gateway_ready ) ) { ?>
133
- <a href="<?php echo admin_url( 'admin.php?page=pmpro-paymentsettings' );?>"><i class="dashicons dashicons-cart"></i> <?php echo esc_attr_e( 'Configure Payment Settings', 'paid-memberships-pro' ); ?></a>
134
  <?php } else { ?>
135
- <a href="<?php echo admin_url( 'admin.php?page=pmpro-paymentsettings' );?>"><i class="dashicons dashicons-cart"></i> <?php echo esc_attr_e( 'Configure Payment Settings', 'paid-memberships-pro' ); ?></a>
136
  <?php } ?>
137
  </li>
138
  <?php } ?>
139
  </ul>
140
- <h3><?php echo esc_attr_e( 'Other Settings', 'paid-memberships-pro' ); ?></h3>
141
  <ul>
142
  <?php if ( current_user_can( 'pmpro_emailsettings' ) ) { ?>
143
- <li><a href="<?php echo admin_url( 'admin.php?page=pmpro-emailsettings' );?>"><i class="dashicons dashicons-email"></i> <?php echo esc_attr_e( 'Confirm Email Settings', 'paid-memberships-pro' );?></a></li>
144
  <?php } ?>
145
 
146
  <?php if ( current_user_can( 'pmpro_emailtemplates' ) ) { ?>
147
- <li><a href="<?php echo admin_url( 'admin.php?page=pmpro-emailtemplates' );?>"><i class="dashicons dashicons-editor-spellcheck"></i> <?php echo esc_attr_e( 'Customize Email Templates', 'paid-memberships-pro' );?></a></li>
148
  <?php } ?>
149
 
150
  <?php if ( current_user_can( 'pmpro_advancedsettings' ) ) { ?>
151
- <li><a href="<?php echo admin_url( 'admin.php?page=pmpro-advancedsettings' );?>"><i class="dashicons dashicons-admin-settings"></i> <?php echo esc_attr_e( 'View Advanced Settings', 'paid-memberships-pro' ); ?></a></li>
152
  <?php } ?>
153
 
154
  <?php if ( current_user_can( 'pmpro_addons' ) ) { ?>
155
- <li><a href="<?php echo admin_url( 'admin.php?page=pmpro-addons' );?>"><i class="dashicons dashicons-admin-plugins"></i> <?php echo esc_attr_e( 'Explore Add Ons for Additional Features', 'paid-memberships-pro' ); ?></a></li>
156
  <?php } ?>
157
  </ul>
158
  <hr />
159
  <p class="text-center">
160
  <?php echo esc_html( __( 'For guidance as your begin these steps,', 'paid-memberships-pro' ) ); ?>
161
- <a href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/?utm_source=plugin&utm_medium=pmpro-dashboard&utm_campaign=documentation&utm_content=initial-plugin-setup" target="_blank"><?php echo esc_attr_e( 'view the Initial Setup Video and Docs.', 'paid-memberships-pro' ); ?></a>
162
  </p>
163
  </div> <!-- end pmpro-dashboard-welcome-column -->
164
  <div class="pmpro-dashboard-welcome-column">
165
- <h3><?php echo esc_attr_e( 'Support License', 'paid-memberships-pro' ); ?></h3>
166
  <?php
167
  // Get saved license.
168
  $key = get_option( 'pmpro_license_key', '' );
@@ -170,12 +170,12 @@ function pmpro_dashboard_welcome_callback() { ?>
170
  ?>
171
  <?php if ( ! pmpro_license_isValid() && empty( $key ) ) { ?>
172
  <p class="pmpro_message pmpro_error">
173
- <strong><?php echo esc_html_e( 'No support license key found.', 'paid-memberships-pro' ); ?></strong><br />
174
  <?php printf(__( '<a href="%s">Enter your key here &raquo;</a>', 'paid-memberships-pro' ), admin_url( 'admin.php?page=pmpro-license' ) );?>
175
  </p>
176
  <?php } elseif ( ! pmpro_license_isValid() ) { ?>
177
  <p class="pmpro_message pmpro_alert">
178
- <strong><?php echo esc_html_e( 'Your license is invalid or expired.', 'paid-memberships-pro' ); ?></strong><br />
179
  <?php printf(__( '<a href="%s">View your membership account</a> to verify your license key.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-dashboard%26utm_campaign%3Dmembership-account%26utm_content%3Dverify-license-key' );?>
180
  <?php } elseif ( pmpro_license_isValid() && ! pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
181
  <p class="pmpro_message pmpro_alert"><?php printf(__('Your <strong>%1$s</strong> key is active. %1$s accounts include access to documentation and free downloads.', 'paid-memberships-pro' ), ucwords( $pmpro_license_check['license'] ) );?></p>
@@ -185,7 +185,7 @@ function pmpro_dashboard_welcome_callback() { ?>
185
 
186
  <?php if ( ! pmpro_license_isValid() || pmpro_license_isValid() && ! pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
187
  <p><?php esc_html_e( 'An annual support license is recommended for websites running Paid Memberships Pro.', 'paid-memberships-pro' ); ?></p>
188
- <p><a href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-dashboard&utm_campaign=pricing&utm_content=upgrade" target="_blank" class="button button-primary button-hero"><?php esc_attr_e( 'View Plans and Pricing', 'paid-memberships-pro' ); ?></a>
189
  <?php } ?>
190
  <hr />
191
  <p><?php echo wp_kses_post( sprintf( __( 'Paid Memberships Pro and our Add Ons are distributed under the <a target="_blank" href="%s">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge.', 'paid-memberships-pro' ), 'http://www.gnu.org/licenses/gpl-2.0.html' ) ); ?></p>
@@ -222,16 +222,16 @@ function pmpro_dashboard_report_recent_members_callback() {
222
  <table class="wp-list-table widefat fixed striped">
223
  <thead>
224
  <tr>
225
- <th><?php _e( 'Username', 'paid-memberships-pro' );?></th>
226
- <th><?php _e( 'Level', 'paid-memberships-pro' );?></th>
227
- <th><?php _e( 'Joined', 'paid-memberships-pro' );?></th>
228
- <th><?php _e( 'Expires', 'paid-memberships-pro' ); ?></th>
229
  </tr>
230
  </thead>
231
  <tbody>
232
  <?php if ( empty( $theusers ) ) { ?>
233
  <tr>
234
- <td colspan="4"><p><?php _e( 'No members found.', 'paid-memberships-pro' ); ?></p></td>
235
  </tr>
236
  <?php } else {
237
  foreach ( $theusers as $auser ) {
@@ -249,7 +249,7 @@ function pmpro_dashboard_report_recent_members_callback() {
249
  ?>
250
  </strong>
251
  </td>
252
- <td><?php esc_attr_e( $auser->membership ); ?></td>
253
  <td><?php echo date_i18n( get_option( 'date_format' ), strtotime( get_date_from_gmt( $theuser->user_registered ), current_time( 'timestamp' ) ) ); ?></td>
254
  <td>
255
  <?php
@@ -268,7 +268,7 @@ function pmpro_dashboard_report_recent_members_callback() {
268
  </table>
269
  </span>
270
  <?php if ( ! empty( $theusers ) ) { ?>
271
- <p class="text-center"><a class="button button-primary" href="<?php echo admin_url( 'admin.php?page=pmpro-memberslist' ); ?>"><?php esc_attr_e( 'View All Members ', 'paid-memberships-pro' ); ?></a></p>
272
  <?php } ?>
273
  <?php
274
  }
@@ -289,19 +289,19 @@ function pmpro_dashboard_report_recent_orders_callback() {
289
  <table class="wp-list-table widefat fixed striped">
290
  <thead>
291
  <tr class="thead">
292
- <th><?php _e( 'Code', 'paid-memberships-pro' ); ?></th>
293
- <th><?php _e( 'User', 'paid-memberships-pro' ); ?></th>
294
- <th><?php _e( 'Level', 'paid-memberships-pro' ); ?></th>
295
- <th><?php _e( 'Total', 'paid-memberships-pro' ); ?></th>
296
- <th><?php _e( 'Status', 'paid-memberships-pro' ); ?></th>
297
- <th><?php _e( 'Date', 'paid-memberships-pro' ); ?></th>
298
  </tr>
299
  </thead>
300
  <tbody id="orders" class="orders-list">
301
  <?php
302
  if ( empty( $order_ids ) ) { ?>
303
  <tr>
304
- <td colspan="6"><p><?php _e( 'No orders found.', 'paid-memberships-pro' ); ?></p></td>
305
  </tr>
306
  <?php } else {
307
  foreach ( $order_ids as $order_id ) {
@@ -359,7 +359,7 @@ function pmpro_dashboard_report_recent_orders_callback() {
359
  </table>
360
  </span>
361
  <?php if ( ! empty( $order_ids ) ) { ?>
362
- <p class="text-center"><a class="button button-primary" href="<?php echo admin_url( 'admin.php?page=pmpro-orders' ); ?>"><?php esc_attr_e( 'View All Orders ', 'paid-memberships-pro' ); ?></a></p>
363
  <?php } ?>
364
  <?php
365
  }
@@ -390,7 +390,7 @@ function pmpro_dashboard_news_updates_callback() {
390
 
391
  <ul>
392
  <?php if ( $maxitems == 0 ) : ?>
393
- <li><?php _e( 'No news found.', 'paid-memberships-pro' ); ?></li>
394
  <?php else : ?>
395
  <?php // Loop through each feed item and display each item as a hyperlink. ?>
396
  <?php foreach ( $rss_items as $item ) : ?>
@@ -404,7 +404,7 @@ function pmpro_dashboard_news_updates_callback() {
404
  <?php endforeach; ?>
405
  <?php endif; ?>
406
  </ul>
407
- <p class="text-center"><a class="button button-primary" href="<?php echo esc_url( 'https://www.paidmembershipspro.com/blog/?utm_source=plugin&utm_medium=pmpro-dashboard&utm_campaign=blog&utm_content=news-updates-metabox' ); ?>"><?php esc_attr_e( 'View More', 'paid-memberships-pro' ); ?></a></p>
408
  <?php
409
  }
410
 
105
  <div class="pmpro-dashboard-welcome-columns">
106
  <div class="pmpro-dashboard-welcome-column">
107
  <?php global $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready; ?>
108
+ <h3><?php esc_html_e( 'Initial Setup', 'paid-memberships-pro' ); ?></h3>
109
  <ul>
110
  <?php if ( current_user_can( 'pmpro_membershiplevels' ) ) { ?>
111
  <li>
112
  <?php if ( empty( $pmpro_level_ready ) ) { ?>
113
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-membershiplevels&edit=-1' ) );?>"><i class="dashicons dashicons-admin-users"></i> <?php esc_html_e( 'Create a Membership Level', 'paid-memberships-pro' ); ?></a>
114
  <?php } else { ?>
115
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-membershiplevels' ) );?>"><i class="dashicons dashicons-admin-users"></i> <?php esc_html_e( 'View Membership Levels', 'paid-memberships-pro' ); ?></a>
116
  <?php } ?>
117
  </li>
118
  <?php } ?>
120
  <?php if ( current_user_can( 'pmpro_pagesettings' ) ) { ?>
121
  <li>
122
  <?php if ( empty( $pmpro_pages_ready ) ) { ?>
123
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings' ) );?>"><i class="dashicons dashicons-welcome-add-page"></i> <?php esc_html_e( 'Generate Membership Pages', 'paid-memberships-pro' ); ?></a>
124
  <?php } else { ?>
125
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings' ) );?>"><i class="dashicons dashicons-welcome-add-page"></i> <?php esc_html_e( 'Manage Membership Pages', 'paid-memberships-pro' ); ?>
126
  <?php } ?>
127
  </li>
128
  <?php } ?>
130
  <?php if ( current_user_can( 'pmpro_pagesettings' ) ) { ?>
131
  <li>
132
  <?php if ( empty( $pmpro_gateway_ready ) ) { ?>
133
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-paymentsettings' ) );?>"><i class="dashicons dashicons-cart"></i> <?php esc_html_e( 'Configure Payment Settings', 'paid-memberships-pro' ); ?></a>
134
  <?php } else { ?>
135
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-paymentsettings' ) );?>"><i class="dashicons dashicons-cart"></i> <?php esc_html_e( 'Configure Payment Settings', 'paid-memberships-pro' ); ?></a>
136
  <?php } ?>
137
  </li>
138
  <?php } ?>
139
  </ul>
140
+ <h3><?php esc_html_e( 'Other Settings', 'paid-memberships-pro' ); ?></h3>
141
  <ul>
142
  <?php if ( current_user_can( 'pmpro_emailsettings' ) ) { ?>
143
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-emailsettings' ) );?>"><i class="dashicons dashicons-email"></i> <?php esc_html_e( 'Confirm Email Settings', 'paid-memberships-pro' );?></a></li>
144
  <?php } ?>
145
 
146
  <?php if ( current_user_can( 'pmpro_emailtemplates' ) ) { ?>
147
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-emailtemplates' ) );?>"><i class="dashicons dashicons-editor-spellcheck"></i> <?php esc_html_e( 'Customize Email Templates', 'paid-memberships-pro' );?></a></li>
148
  <?php } ?>
149
 
150
  <?php if ( current_user_can( 'pmpro_advancedsettings' ) ) { ?>
151
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-advancedsettings' ) );?>"><i class="dashicons dashicons-admin-settings"></i> <?php esc_html_e( 'View Advanced Settings', 'paid-memberships-pro' ); ?></a></li>
152
  <?php } ?>
153
 
154
  <?php if ( current_user_can( 'pmpro_addons' ) ) { ?>
155
+ <li><a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-addons' ) );?>"><i class="dashicons dashicons-admin-plugins"></i> <?php esc_html_e( 'Explore Add Ons for Additional Features', 'paid-memberships-pro' ); ?></a></li>
156
  <?php } ?>
157
  </ul>
158
  <hr />
159
  <p class="text-center">
160
  <?php echo esc_html( __( 'For guidance as your begin these steps,', 'paid-memberships-pro' ) ); ?>
161
+ <a href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/?utm_source=plugin&utm_medium=pmpro-dashboard&utm_campaign=documentation&utm_content=initial-plugin-setup" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'view the Initial Setup Video and Docs.', 'paid-memberships-pro' ); ?></a>
162
  </p>
163
  </div> <!-- end pmpro-dashboard-welcome-column -->
164
  <div class="pmpro-dashboard-welcome-column">
165
+ <h3><?php esc_html_e( 'Support License', 'paid-memberships-pro' ); ?></h3>
166
  <?php
167
  // Get saved license.
168
  $key = get_option( 'pmpro_license_key', '' );
170
  ?>
171
  <?php if ( ! pmpro_license_isValid() && empty( $key ) ) { ?>
172
  <p class="pmpro_message pmpro_error">
173
+ <strong><?php esc_html_e( 'No support license key found.', 'paid-memberships-pro' ); ?></strong><br />
174
  <?php printf(__( '<a href="%s">Enter your key here &raquo;</a>', 'paid-memberships-pro' ), admin_url( 'admin.php?page=pmpro-license' ) );?>
175
  </p>
176
  <?php } elseif ( ! pmpro_license_isValid() ) { ?>
177
  <p class="pmpro_message pmpro_alert">
178
+ <strong><?php esc_html_e( 'Your license is invalid or expired.', 'paid-memberships-pro' ); ?></strong><br />
179
  <?php printf(__( '<a href="%s">View your membership account</a> to verify your license key.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-dashboard%26utm_campaign%3Dmembership-account%26utm_content%3Dverify-license-key' );?>
180
  <?php } elseif ( pmpro_license_isValid() && ! pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
181
  <p class="pmpro_message pmpro_alert"><?php printf(__('Your <strong>%1$s</strong> key is active. %1$s accounts include access to documentation and free downloads.', 'paid-memberships-pro' ), ucwords( $pmpro_license_check['license'] ) );?></p>
185
 
186
  <?php if ( ! pmpro_license_isValid() || pmpro_license_isValid() && ! pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
187
  <p><?php esc_html_e( 'An annual support license is recommended for websites running Paid Memberships Pro.', 'paid-memberships-pro' ); ?></p>
188
+ <p><a href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-dashboard&utm_campaign=pricing&utm_content=upgrade" target="_blank" rel="noopener noreferrer" class="button button-primary button-hero"><?php esc_html_e( 'View Plans and Pricing', 'paid-memberships-pro' ); ?></a>
189
  <?php } ?>
190
  <hr />
191
  <p><?php echo wp_kses_post( sprintf( __( 'Paid Memberships Pro and our Add Ons are distributed under the <a target="_blank" href="%s">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge.', 'paid-memberships-pro' ), 'http://www.gnu.org/licenses/gpl-2.0.html' ) ); ?></p>
222
  <table class="wp-list-table widefat fixed striped">
223
  <thead>
224
  <tr>
225
+ <th><?php esc_html_e( 'Username', 'paid-memberships-pro' );?></th>
226
+ <th><?php esc_html_e( 'Level', 'paid-memberships-pro' );?></th>
227
+ <th><?php esc_html_e( 'Joined', 'paid-memberships-pro' );?></th>
228
+ <th><?php esc_html_e( 'Expires', 'paid-memberships-pro' ); ?></th>
229
  </tr>
230
  </thead>
231
  <tbody>
232
  <?php if ( empty( $theusers ) ) { ?>
233
  <tr>
234
+ <td colspan="4"><p><?php esc_html_e( 'No members found.', 'paid-memberships-pro' ); ?></p></td>
235
  </tr>
236
  <?php } else {
237
  foreach ( $theusers as $auser ) {
249
  ?>
250
  </strong>
251
  </td>
252
+ <td><?php echo esc_html( $auser->membership ); ?></td>
253
  <td><?php echo date_i18n( get_option( 'date_format' ), strtotime( get_date_from_gmt( $theuser->user_registered ), current_time( 'timestamp' ) ) ); ?></td>
254
  <td>
255
  <?php
268
  </table>
269
  </span>
270
  <?php if ( ! empty( $theusers ) ) { ?>
271
+ <p class="text-center"><a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-memberslist' ) ); ?>"><?php esc_html_e( 'View All Members ', 'paid-memberships-pro' ); ?></a></p>
272
  <?php } ?>
273
  <?php
274
  }
289
  <table class="wp-list-table widefat fixed striped">
290
  <thead>
291
  <tr class="thead">
292
+ <th><?php esc_html_e( 'Code', 'paid-memberships-pro' ); ?></th>
293
+ <th><?php esc_html_e( 'User', 'paid-memberships-pro' ); ?></th>
294
+ <th><?php esc_html_e( 'Level', 'paid-memberships-pro' ); ?></th>
295
+ <th><?php esc_html_e( 'Total', 'paid-memberships-pro' ); ?></th>
296
+ <th><?php esc_html_e( 'Status', 'paid-memberships-pro' ); ?></th>
297
+ <th><?php esc_html_e( 'Date', 'paid-memberships-pro' ); ?></th>
298
  </tr>
299
  </thead>
300
  <tbody id="orders" class="orders-list">
301
  <?php
302
  if ( empty( $order_ids ) ) { ?>
303
  <tr>
304
+ <td colspan="6"><p><?php esc_html_e( 'No orders found.', 'paid-memberships-pro' ); ?></p></td>
305
  </tr>
306
  <?php } else {
307
  foreach ( $order_ids as $order_id ) {
359
  </table>
360
  </span>
361
  <?php if ( ! empty( $order_ids ) ) { ?>
362
+ <p class="text-center"><a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-orders' ) ); ?>"><?php esc_html_e( 'View All Orders ', 'paid-memberships-pro' ); ?></a></p>
363
  <?php } ?>
364
  <?php
365
  }
390
 
391
  <ul>
392
  <?php if ( $maxitems == 0 ) : ?>
393
+ <li><?php esc_html_e( 'No news found.', 'paid-memberships-pro' ); ?></li>
394
  <?php else : ?>
395
  <?php // Loop through each feed item and display each item as a hyperlink. ?>
396
  <?php foreach ( $rss_items as $item ) : ?>
404
  <?php endforeach; ?>
405
  <?php endif; ?>
406
  </ul>
407
+ <p class="text-center"><a class="button button-primary" href="https://www.paidmembershipspro.com/blog/?utm_source=plugin&utm_medium=pmpro-dashboard&utm_campaign=blog&utm_content=news-updates-metabox"><?php esc_html_e( 'View More', 'paid-memberships-pro' ); ?></a></p>
408
  <?php
409
  }
410
 
adminpages/discountcodes.php CHANGED
@@ -357,7 +357,7 @@
357
  }
358
 
359
  if( ! empty( $pmpro_msg ) && ! empty( $expiration_warning_flag ) ) {
360
- $pmpro_msg .= ' <strong>' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, <a target="_blank" href="%s">see our post here</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-discountcodes&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . '</strong>';
361
 
362
  if( $pmpro_msgt == 'success' ) {
363
  $pmpro_msgt = 'warning';
@@ -443,12 +443,12 @@
443
  <table class="form-table">
444
  <tbody>
445
  <tr>
446
- <th scope="row" valign="top"><label><?php _e('ID', 'paid-memberships-pro' );?>:</label></th>
447
  <td><p class="description"><?php if(!empty($code->id)) echo esc_html( $code->id ); else echo __("This will be generated when you save.", 'paid-memberships-pro' );?></p></td>
448
  </tr>
449
 
450
  <tr>
451
- <th scope="row" valign="top"><label for="code"><?php _e('Code', 'paid-memberships-pro' );?>:</label></th>
452
  <td><input name="code" type="text" size="20" value="<?php echo esc_attr( $code->code ); ?>" /></td>
453
  </tr>
454
 
@@ -486,7 +486,7 @@
486
  ?>
487
 
488
  <tr>
489
- <th scope="row" valign="top"><label for="starts"><?php _e('Start Date', 'paid-memberships-pro' );?>:</label></th>
490
  <td>
491
  <select name="starts_month">
492
  <?php
@@ -504,7 +504,7 @@
504
  </tr>
505
 
506
  <tr>
507
- <th scope="row" valign="top"><label for="expires"><?php _e('Expiration Date', 'paid-memberships-pro' );?>:</label></th>
508
  <td>
509
  <select name="expires_month">
510
  <?php
@@ -522,10 +522,10 @@
522
  </tr>
523
 
524
  <tr>
525
- <th scope="row" valign="top"><label for="uses"><?php _e('Uses', 'paid-memberships-pro' );?>:</label></th>
526
  <td>
527
  <input name="uses" type="text" size="10" value="<?php if ( ! empty( $code->uses ) ) echo esc_attr( $code->uses ); ?>" />
528
- <p class="description"><?php _e('Leave blank for unlimited uses.', 'paid-memberships-pro' );?></p>
529
  </td>
530
  </tr>
531
 
@@ -534,7 +534,7 @@
534
 
535
  <?php do_action("pmpro_discount_code_after_settings", $edit); ?>
536
 
537
- <h3><?php _e('Which Levels Will This Code Apply To?', 'paid-memberships-pro' ); ?></h3>
538
 
539
  <div class="pmpro_discount_levels">
540
  <?php
@@ -573,7 +573,7 @@
573
  <table class="form-table">
574
  <tbody>
575
  <tr>
576
- <th scope="row" valign="top"><label for="initial_payment"><?php _e('Initial Payment', 'paid-memberships-pro' );?>:</label></th>
577
  <td>
578
  <?php
579
  if(pmpro_getCurrencyPosition() == "left")
@@ -584,17 +584,17 @@
584
  if(pmpro_getCurrencyPosition() == "right")
585
  echo $pmpro_currency_symbol;
586
  ?>
587
- <p class="description"><?php _e('The initial amount collected at registration.', 'paid-memberships-pro' );?></p>
588
  </td>
589
  </tr>
590
 
591
  <tr>
592
- <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'paid-memberships-pro' );?>:</label></th>
593
- <td><input class="recurring_checkbox" id="recurring_<?php echo esc_attr( $level->id );?>" name="recurring[]" type="checkbox" value="<?php echo esc_attr( $level->id ); ?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).prop('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo esc_attr( $level->id ); ?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <label for="recurring_<?php echo esc_attr( $level->id ); ?>"><?php _e('Check if this level has a recurring subscription payment.', 'paid-memberships-pro' );?></label></td>
594
  </tr>
595
 
596
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
597
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Billing Amount', 'paid-memberships-pro' );?>:</label></th>
598
  <td>
599
  <?php
600
  if(pmpro_getCurrencyPosition() == "left")
@@ -617,32 +617,33 @@
617
  }
618
  ?>
619
  </select>
620
- <p class="description"><?php _e('The amount to be billed one cycle after the initial payment.', 'paid-memberships-pro' );?></p>
621
  <?php if($gateway == "braintree") { ?>
622
- <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently only supports billing periods of "Month" or "Year".', 'paid-memberships-pro' );?></strong>
623
  <?php } elseif($gateway == "stripe") { ?>
624
- <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration does not allow billing periods longer than 1 year.', 'paid-memberships-pro' );?></strong></p>
625
  <?php }?>
626
  </td>
627
  </tr>
628
 
629
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
630
- <th scope="row" valign="top"><label for="billing_limit"><?php _e('Billing Cycle Limit', 'paid-memberships-pro' );?>:</label></th>
631
  <td>
632
  <input name="billing_limit[]" type="text" size="20" value="<?php echo esc_attr( $level->billing_limit ); ?>" />
633
  <p class="description">
634
  <?php _e('The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.', 'paid-memberships-pro' );?>
635
  <?php if ( ( $gateway == "stripe" ) && ! function_exists( 'pmprosbl_plugin_row_meta' ) ) { ?>
636
- <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support billing limits. You can still set an expiration date below.', 'paid-memberships-pro' );?></strong>
637
  <?php if ( ! function_exists( 'pmprosd_pmpro_membership_level_after_other_settings' ) ) {
638
  $allowed_sbl_html = array (
639
  'a' => array (
640
  'href' => array(),
641
  'target' => array(),
642
  'title' => array(),
 
643
  ),
644
  );
645
- echo '<br />' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the <a href="%s" title="Paid Memberships Pro - Stripe Billing Limits Add On" target="_blank">Stripe Billing Limits Add On</a>.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . '</em></td></tr>';
646
  } ?>
647
  <?php } ?>
648
  </p>
@@ -650,17 +651,17 @@
650
  </tr>
651
 
652
  <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
653
- <th scope="row" valign="top"><label><?php _e('Custom Trial', 'paid-memberships-pro' );?>:</label></th>
654
  <td>
655
- <input id="custom_trial_<?php echo esc_attr( $level->id ); ?>" id="custom_trial_<?php echo esc_attr( $level->id ); ?>" name="custom_trial[]" type="checkbox" value="<?php echo esc_attr( $level->id ); ?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).prop('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> <label for="custom_trial_<?php echo esc_attr( $level->id );?>"><?php _e('Check to add a custom trial period.', 'paid-memberships-pro' );?></label>
656
  <?php if($gateway == "twocheckout") { ?>
657
- <p class="description"><strong <?php if(!empty($pmpro_twocheckout_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount.', 'paid-memberships-pro' );?></strong></p>
658
  <?php } ?>
659
  </td>
660
  </tr>
661
 
662
  <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
663
- <th scope="row" valign="top"><label for="trial_amount"><?php _e('Trial Billing Amount', 'paid-memberships-pro' );?>:</label></th>
664
  <td>
665
  <?php
666
  if(pmpro_getCurrencyPosition() == "left")
@@ -675,22 +676,22 @@
675
  <input name="trial_limit[]" type="text" size="10" value="<?php echo esc_attr( $level->trial_limit ); ?>" />
676
  <?php _e('subscription payments', 'paid-memberships-pro' );?>.
677
  <?php if($gateway == "stripe") { ?>
678
- <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
679
  <?php } elseif($gateway == "braintree") { ?>
680
- <p class="description"><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
681
  <?php } elseif($gateway == "payflowpro") { ?>
682
- <p class="description"><strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Payflow integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
683
  <?php } ?>
684
  </td>
685
  </tr>
686
 
687
  <tr>
688
- <th scope="row" valign="top"><label><?php _e('Membership Expiration', 'paid-memberships-pro' );?>:</label></th>
689
- <td><input id="expiration_<?php echo esc_attr( $level->id ); ?>" name="expiration[]" type="checkbox" value="<?php echo esc_attr( $level->id ); ?>" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).is(':checked')) { jQuery(this).parent().parent().siblings('.expiration_info').show(); } else { jQuery(this).parent().parent().siblings('.expiration_info').hide();}" /> <label for="expiration_<?php echo esc_attr( $level->id ); ?>"><?php _e('Check this to set when membership access expires.', 'paid-memberships-pro' );?></label></td>
690
  </tr>
691
 
692
  <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
693
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Expires In', 'paid-memberships-pro' );?>:</label></th>
694
  <td>
695
  <input id="expiration_number" name="expiration_number[]" type="text" size="10" value="<?php echo esc_attr( $level->expiration_number ); ?>" />
696
  <select id="expiration_period" name="expiration_period[]">
@@ -706,7 +707,7 @@
706
  ?>
707
 
708
  </select>
709
- <p class="description"><?php _e('Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires.', 'paid-memberships-pro' );?></p>
710
  </td>
711
  </tr>
712
  </tbody>
@@ -725,18 +726,16 @@
725
  </div>
726
 
727
  <p class="submit topborder">
728
- <input name="save" type="submit" class="button button-primary" value="Save Code" />
729
- <input name="cancel" type="button" class="button" value="Cancel" onclick="location.href='<?php echo admin_url( '/admin.php?page=pmpro-discountcodes')?>';" />
730
  </p>
731
  </form>
732
  </div>
733
 
734
  <?php } else { ?>
735
-
736
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Memberships Discount Codes', 'paid-memberships-pro' ); ?></h1>
737
  <a href="admin.php?page=pmpro-discountcodes&edit=-1" class="page-title-action"><?php esc_html_e( 'Add New Discount Code', 'paid-memberships-pro' ); ?></a>
738
- <hr class="wp-header-end">
739
-
740
  <?php
741
  $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(CONVERT_TZ(starts, '+00:00', @@global.time_zone)) as starts, UNIX_TIMESTAMP(CONVERT_TZ(expires, '+00:00', @@global.time_zone)) as expires FROM $wpdb->pmpro_discount_codes ";
742
  if( ! empty( $s ) ) {
@@ -753,10 +752,10 @@
753
 
754
  if( empty( $s ) && empty( $codes ) ) { ?>
755
  <div class="pmpro-new-install">
756
- <h2><?php echo esc_attr_e( 'No Discount Codes Found', 'paid-memberships-pro' ); ?></h2>
757
- <h4><?php _e( 'Discount codes allow you to override your membership level\'s default pricing.', 'paid-memberships-pro' ); ?></h4>
758
- <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-discountcodes&edit=-1' ) ) ; ?>" class="button-primary"><?php esc_attr_e( 'Create a Discount Code', 'paid-memberships-pro' );?></a>
759
- <a href="<?php echo esc_url( 'https://www.paidmembershipspro.com/documentation/discount-codes/?utm_source=plugin&utm_medium=pmpro-discountcodes&utm_campaign=documentation&utm_content=discount-codes' ); ?>" target="_blank" class="button"><?php echo esc_attr_e( 'Documentation: Discount Codes', 'paid-memberships-pro' ); ?></a>
760
  </div> <!-- end pmpro-new-install -->
761
  <?php } else { ?>
762
 
@@ -764,38 +763,40 @@
764
  <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
765
  <?php } ?>
766
 
767
- <?php if ( ! empty( $codes ) ) { ?>
768
- <p class="subsubsub"><?php printf( __( "%d discount codes found.", 'paid-memberships-pro' ), $totalrows ); ?></span></p>
769
- <?php } ?>
770
-
771
  <form id="posts-filter" method="get" action="">
772
  <p class="search-box">
773
- <label class="screen-reader-text" for="post-search-input"><?php _e('Search Discount Codes', 'paid-memberships-pro' );?>:</label>
774
  <input type="hidden" name="page" value="pmpro-discountcodes" />
775
  <input id="post-search-input" type="text" value="<?php echo esc_attr( wp_unslash( $s ) ); ?>" name="s" size="30" />
776
  <input class="button" type="submit" value="<?php esc_attr_e('Search', 'paid-memberships-pro' );?>" id="search-submit "/>
777
  </p>
778
  </form>
779
 
780
- <br class="clear" />
 
 
 
 
 
 
 
781
 
782
- <table class="widefat">
783
  <thead>
784
  <tr>
785
- <th><?php _e('ID', 'paid-memberships-pro' );?></th>
786
- <th><?php _e('Code', 'paid-memberships-pro' );?></th>
787
- <th><?php _e('Starts', 'paid-memberships-pro' );?></th>
788
- <th><?php _e('Expires', 'paid-memberships-pro' );?></th>
789
- <th><?php _e('Uses', 'paid-memberships-pro' );?></th>
790
- <th><?php _e('Levels', 'paid-memberships-pro' );?></th>
791
  <?php do_action("pmpro_discountcodes_extra_cols_header", $codes);?>
792
  </tr>
793
  </thead>
794
  <tbody>
795
  <?php if ( !empty( $s ) && empty( $codes ) ) { ?>
796
  <tr>
797
- <td colspan="6">
798
- <?php echo esc_attr_e( 'Code not found.', 'paid-memberships-pro' ); ?>
799
  </td>
800
  </tr>
801
  <?php } ?>
@@ -804,9 +805,8 @@
804
  $uses = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = %d", $code->id ) );
805
  ?>
806
  <tr<?php if ( ! pmpro_check_discount_code_for_gateway_compatibility( $code->id ) ) { ?> class="pmpro_error"<?php } ?>>
807
- <td><?php echo $code->id?></td>
808
- <td class="has-row-actions">
809
- <a title="<?php echo esc_attr( sprintf( __( 'Edit Code: %s', 'paid-memberships-pro' ), $code->code ) ); ?>" href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $code->id ), admin_url('admin.php' ) ) ); ?>"><?php echo $code->code?></a>
810
  <div class="row-actions">
811
  <?php
812
  $delete_text = esc_html(
@@ -830,6 +830,11 @@
830
  );
831
 
832
  $actions = [
 
 
 
 
 
833
  'edit' => sprintf(
834
  '<a title="%1$s" href="%2$s">%3$s</a>',
835
  esc_attr__( 'Edit', 'paid-memberships-pro' ),
@@ -911,13 +916,13 @@
911
  ?>
912
  </div>
913
  </td>
914
- <td>
915
  <?php echo date_i18n(get_option('date_format'), $code->starts)?>
916
  </td>
917
- <td>
918
  <?php echo date_i18n(get_option('date_format'), $code->expires)?>
919
  </td>
920
- <td>
921
  <?php
922
  if($code->uses > 0)
923
  echo "<strong>" . (int)$uses . "</strong>/" . $code->uses;
@@ -925,7 +930,7 @@
925
  echo "<strong>" . (int)$uses . "</strong>/unlimited";
926
  ?>
927
  </td>
928
- <td>
929
  <?php
930
  $sqlQuery = $wpdb->prepare("
931
  SELECT l.id, l.name
@@ -960,11 +965,17 @@
960
  ?>
961
  </tbody>
962
  </table>
963
-
964
- <?php
965
- $pagination_url = admin_url( "/admin.php?page=pmpro-discountcodes&s=" . $s );
966
- echo pmpro_getPaginationString( $pn, $totalrows, $limit, 1, $pagination_url, "&limit=$limit&pn=" );
967
- ?>
 
 
 
 
 
 
968
 
969
  <?php } ?>
970
 
357
  }
358
 
359
  if( ! empty( $pmpro_msg ) && ! empty( $expiration_warning_flag ) ) {
360
+ $pmpro_msg .= ' <strong>' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, <a target="_blank" rel="nofollow noopener" href="%s">see our post here</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-discountcodes&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . '</strong>';
361
 
362
  if( $pmpro_msgt == 'success' ) {
363
  $pmpro_msgt = 'warning';
443
  <table class="form-table">
444
  <tbody>
445
  <tr>
446
+ <th scope="row" valign="top"><label><?php esc_html_e('ID', 'paid-memberships-pro' );?>:</label></th>
447
  <td><p class="description"><?php if(!empty($code->id)) echo esc_html( $code->id ); else echo __("This will be generated when you save.", 'paid-memberships-pro' );?></p></td>
448
  </tr>
449
 
450
  <tr>
451
+ <th scope="row" valign="top"><label for="code"><?php esc_html_e('Code', 'paid-memberships-pro' );?>:</label></th>
452
  <td><input name="code" type="text" size="20" value="<?php echo esc_attr( $code->code ); ?>" /></td>
453
  </tr>
454
 
486
  ?>
487
 
488
  <tr>
489
+ <th scope="row" valign="top"><label for="starts"><?php esc_html_e('Start Date', 'paid-memberships-pro' );?>:</label></th>
490
  <td>
491
  <select name="starts_month">
492
  <?php
504
  </tr>
505
 
506
  <tr>
507
+ <th scope="row" valign="top"><label for="expires"><?php esc_html_e('Expiration Date', 'paid-memberships-pro' );?>:</label></th>
508
  <td>
509
  <select name="expires_month">
510
  <?php
522
  </tr>
523
 
524
  <tr>
525
+ <th scope="row" valign="top"><label for="uses"><?php esc_html_e('Uses', 'paid-memberships-pro' );?>:</label></th>
526
  <td>
527
  <input name="uses" type="text" size="10" value="<?php if ( ! empty( $code->uses ) ) echo esc_attr( $code->uses ); ?>" />
528
+ <p class="description"><?php esc_html_e('Leave blank for unlimited uses.', 'paid-memberships-pro' );?></p>
529
  </td>
530
  </tr>
531
 
534
 
535
  <?php do_action("pmpro_discount_code_after_settings", $edit); ?>
536
 
537
+ <h3><?php esc_html_e('Which Levels Will This Code Apply To?', 'paid-memberships-pro' ); ?></h3>
538
 
539
  <div class="pmpro_discount_levels">
540
  <?php
573
  <table class="form-table">
574
  <tbody>
575
  <tr>
576
+ <th scope="row" valign="top"><label for="initial_payment"><?php esc_html_e('Initial Payment', 'paid-memberships-pro' );?>:</label></th>
577
  <td>
578
  <?php
579
  if(pmpro_getCurrencyPosition() == "left")
584
  if(pmpro_getCurrencyPosition() == "right")
585
  echo $pmpro_currency_symbol;
586
  ?>
587
+ <p class="description"><?php esc_html_e('The initial amount collected at registration.', 'paid-memberships-pro' );?></p>
588
  </td>
589
  </tr>
590
 
591
  <tr>
592
+ <th scope="row" valign="top"><label><?php esc_html_e('Recurring Subscription', 'paid-memberships-pro' );?>:</label></th>
593
+ <td><input class="recurring_checkbox" id="recurring_<?php echo esc_attr( $level->id );?>" name="recurring[]" type="checkbox" value="<?php echo esc_attr( $level->id ); ?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).prop('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo esc_attr( $level->id ); ?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <label for="recurring_<?php echo esc_attr( $level->id ); ?>"><?php esc_html_e('Check if this level has a recurring subscription payment.', 'paid-memberships-pro' );?></label></td>
594
  </tr>
595
 
596
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
597
+ <th scope="row" valign="top"><label for="billing_amount"><?php esc_html_e('Billing Amount', 'paid-memberships-pro' );?>:</label></th>
598
  <td>
599
  <?php
600
  if(pmpro_getCurrencyPosition() == "left")
617
  }
618
  ?>
619
  </select>
620
+ <p class="description"><?php esc_html_e('The amount to be billed one cycle after the initial payment.', 'paid-memberships-pro' );?></p>
621
  <?php if($gateway == "braintree") { ?>
622
+ <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Braintree integration currently only supports billing periods of "Month" or "Year".', 'paid-memberships-pro' );?></strong>
623
  <?php } elseif($gateway == "stripe") { ?>
624
+ <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Stripe integration does not allow billing periods longer than 1 year.', 'paid-memberships-pro' );?></strong></p>
625
  <?php }?>
626
  </td>
627
  </tr>
628
 
629
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
630
+ <th scope="row" valign="top"><label for="billing_limit"><?php esc_html_e('Billing Cycle Limit', 'paid-memberships-pro' );?>:</label></th>
631
  <td>
632
  <input name="billing_limit[]" type="text" size="20" value="<?php echo esc_attr( $level->billing_limit ); ?>" />
633
  <p class="description">
634
  <?php _e('The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.', 'paid-memberships-pro' );?>
635
  <?php if ( ( $gateway == "stripe" ) && ! function_exists( 'pmprosbl_plugin_row_meta' ) ) { ?>
636
+ <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Stripe integration currently does not support billing limits. You can still set an expiration date below.', 'paid-memberships-pro' );?></strong>
637
  <?php if ( ! function_exists( 'pmprosd_pmpro_membership_level_after_other_settings' ) ) {
638
  $allowed_sbl_html = array (
639
  'a' => array (
640
  'href' => array(),
641
  'target' => array(),
642
  'title' => array(),
643
+ 'rel' => array(),
644
  ),
645
  );
646
+ echo '<br />' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the <a href="%s" title="Paid Memberships Pro - Stripe Billing Limits Add On" target="_blank" rel="nofollow nopopener">Stripe Billing Limits Add On</a>.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . '</em></td></tr>';
647
  } ?>
648
  <?php } ?>
649
  </p>
651
  </tr>
652
 
653
  <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
654
+ <th scope="row" valign="top"><label><?php esc_html_e('Custom Trial', 'paid-memberships-pro' );?>:</label></th>
655
  <td>
656
+ <input id="custom_trial_<?php echo esc_attr( $level->id ); ?>" id="custom_trial_<?php echo esc_attr( $level->id ); ?>" name="custom_trial[]" type="checkbox" value="<?php echo esc_attr( $level->id ); ?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).prop('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> <label for="custom_trial_<?php echo esc_attr( $level->id );?>"><?php esc_html_e('Check to add a custom trial period.', 'paid-memberships-pro' );?></label>
657
  <?php if($gateway == "twocheckout") { ?>
658
+ <p class="description"><strong <?php if(!empty($pmpro_twocheckout_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount.', 'paid-memberships-pro' );?></strong></p>
659
  <?php } ?>
660
  </td>
661
  </tr>
662
 
663
  <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
664
+ <th scope="row" valign="top"><label for="trial_amount"><?php esc_html_e('Trial Billing Amount', 'paid-memberships-pro' );?>:</label></th>
665
  <td>
666
  <?php
667
  if(pmpro_getCurrencyPosition() == "left")
676
  <input name="trial_limit[]" type="text" size="10" value="<?php echo esc_attr( $level->trial_limit ); ?>" />
677
  <?php _e('subscription payments', 'paid-memberships-pro' );?>.
678
  <?php if($gateway == "stripe") { ?>
679
+ <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Stripe integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
680
  <?php } elseif($gateway == "braintree") { ?>
681
+ <p class="description"><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Braintree integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
682
  <?php } elseif($gateway == "payflowpro") { ?>
683
+ <p class="description"><strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Payflow integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
684
  <?php } ?>
685
  </td>
686
  </tr>
687
 
688
  <tr>
689
+ <th scope="row" valign="top"><label><?php esc_html_e('Membership Expiration', 'paid-memberships-pro' );?>:</label></th>
690
+ <td><input id="expiration_<?php echo esc_attr( $level->id ); ?>" name="expiration[]" type="checkbox" value="<?php echo esc_attr( $level->id ); ?>" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).is(':checked')) { jQuery(this).parent().parent().siblings('.expiration_info').show(); } else { jQuery(this).parent().parent().siblings('.expiration_info').hide();}" /> <label for="expiration_<?php echo esc_attr( $level->id ); ?>"><?php esc_html_e('Check this to set when membership access expires.', 'paid-memberships-pro' );?></label></td>
691
  </tr>
692
 
693
  <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
694
+ <th scope="row" valign="top"><label for="billing_amount"><?php esc_html_e('Expires In', 'paid-memberships-pro' );?>:</label></th>
695
  <td>
696
  <input id="expiration_number" name="expiration_number[]" type="text" size="10" value="<?php echo esc_attr( $level->expiration_number ); ?>" />
697
  <select id="expiration_period" name="expiration_period[]">
707
  ?>
708
 
709
  </select>
710
+ <p class="description"><?php esc_html_e('Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires.', 'paid-memberships-pro' );?></p>
711
  </td>
712
  </tr>
713
  </tbody>
726
  </div>
727
 
728
  <p class="submit topborder">
729
+ <input name="save" type="submit" class="button button-primary" value="<?php esc_attr_e( 'Save Code', 'paid-memberships-pro' ) ?>" />
730
+ <input name="cancel" type="button" class="button" value="<?php esc_attr_e( 'Cancel', 'paid-memberships-pro' ) ?>" onclick="location.href='<?php echo esc_url( admin_url( '/admin.php?page=pmpro-discountcodes') ); ?>';" />
731
  </p>
732
  </form>
733
  </div>
734
 
735
  <?php } else { ?>
736
+ <hr class="wp-header-end">
737
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Memberships Discount Codes', 'paid-memberships-pro' ); ?></h1>
738
  <a href="admin.php?page=pmpro-discountcodes&edit=-1" class="page-title-action"><?php esc_html_e( 'Add New Discount Code', 'paid-memberships-pro' ); ?></a>
 
 
739
  <?php
740
  $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(CONVERT_TZ(starts, '+00:00', @@global.time_zone)) as starts, UNIX_TIMESTAMP(CONVERT_TZ(expires, '+00:00', @@global.time_zone)) as expires FROM $wpdb->pmpro_discount_codes ";
741
  if( ! empty( $s ) ) {
752
 
753
  if( empty( $s ) && empty( $codes ) ) { ?>
754
  <div class="pmpro-new-install">
755
+ <h2><?php esc_html_e( 'No Discount Codes Found', 'paid-memberships-pro' ); ?></h2>
756
+ <h4><?php esc_html_e( 'Discount codes allow you to override your membership level\'s default pricing.', 'paid-memberships-pro' ); ?></h4>
757
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-discountcodes&edit=-1' ) ) ; ?>" class="button-primary"><?php esc_html_e( 'Create a Discount Code', 'paid-memberships-pro' );?></a>
758
+ <a href="<?php echo esc_url( 'https://www.paidmembershipspro.com/documentation/discount-codes/?utm_source=plugin&utm_medium=pmpro-discountcodes&utm_campaign=documentation&utm_content=discount-codes' ); ?>" target="_blank" rel="nofollow noopener" class="button"><?php esc_html_e( 'Documentation: Discount Codes', 'paid-memberships-pro' ); ?></a>
759
  </div> <!-- end pmpro-new-install -->
760
  <?php } else { ?>
761
 
763
  <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
764
  <?php } ?>
765
 
 
 
 
 
766
  <form id="posts-filter" method="get" action="">
767
  <p class="search-box">
768
+ <label class="screen-reader-text" for="post-search-input"><?php esc_html_e('Search Discount Codes', 'paid-memberships-pro' );?>:</label>
769
  <input type="hidden" name="page" value="pmpro-discountcodes" />
770
  <input id="post-search-input" type="text" value="<?php echo esc_attr( wp_unslash( $s ) ); ?>" name="s" size="30" />
771
  <input class="button" type="submit" value="<?php esc_attr_e('Search', 'paid-memberships-pro' );?>" id="search-submit "/>
772
  </p>
773
  </form>
774
 
775
+ <div class="tablenav top">
776
+ <?php if ( ! empty( $codes ) ) { ?>
777
+ <div class="tablenav-pages one-page">
778
+ <span class="displaying-num"><?php printf( __( "%d discount codes found.", 'paid-memberships-pro' ), $totalrows ); ?></span>
779
+ </div>
780
+ <?php } ?>
781
+ <br class="clear" />
782
+ </div> <!-- end tablenav -->
783
 
784
+ <table class="wp-list-table widefat fixed striped">
785
  <thead>
786
  <tr>
787
+ <th class="column-code"><?php esc_html_e('Code', 'paid-memberships-pro' );?></th>
788
+ <th class="column-starts"><?php esc_html_e('Starts', 'paid-memberships-pro' );?></th>
789
+ <th class="column-expires"><?php esc_html_e('Expires', 'paid-memberships-pro' );?></th>
790
+ <th class="column-uses"><?php esc_html_e('Uses', 'paid-memberships-pro' );?></th>
791
+ <th class="column-levels"><?php esc_html_e('Levels', 'paid-memberships-pro' );?></th>
 
792
  <?php do_action("pmpro_discountcodes_extra_cols_header", $codes);?>
793
  </tr>
794
  </thead>
795
  <tbody>
796
  <?php if ( !empty( $s ) && empty( $codes ) ) { ?>
797
  <tr>
798
+ <td colspan="5">
799
+ <?php esc_html_e( 'Code not found.', 'paid-memberships-pro' ); ?>
800
  </td>
801
  </tr>
802
  <?php } ?>
805
  $uses = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = %d", $code->id ) );
806
  ?>
807
  <tr<?php if ( ! pmpro_check_discount_code_for_gateway_compatibility( $code->id ) ) { ?> class="pmpro_error"<?php } ?>>
808
+ <td class="column-code has-row-actions">
809
+ <strong><a title="<?php echo esc_attr( sprintf( __( 'Edit Code: %s', 'paid-memberships-pro' ), $code->code ) ); ?>" href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $code->id ), admin_url('admin.php' ) ) ); ?>"><?php echo $code->code?></a></strong>
 
810
  <div class="row-actions">
811
  <?php
812
  $delete_text = esc_html(
830
  );
831
 
832
  $actions = [
833
+ 'id' => sprintf(
834
+ // translators: %s is the Order ID.
835
+ __( 'ID: %s', 'paid-memberships-pro' ),
836
+ esc_attr( $code->id ),
837
+ ),
838
  'edit' => sprintf(
839
  '<a title="%1$s" href="%2$s">%3$s</a>',
840
  esc_attr__( 'Edit', 'paid-memberships-pro' ),
916
  ?>
917
  </div>
918
  </td>
919
+ <td class="column-starts">
920
  <?php echo date_i18n(get_option('date_format'), $code->starts)?>
921
  </td>
922
+ <td class="column-expires">
923
  <?php echo date_i18n(get_option('date_format'), $code->expires)?>
924
  </td>
925
+ <td class="column-uses">
926
  <?php
927
  if($code->uses > 0)
928
  echo "<strong>" . (int)$uses . "</strong>/" . $code->uses;
930
  echo "<strong>" . (int)$uses . "</strong>/unlimited";
931
  ?>
932
  </td>
933
+ <td class="column-levels">
934
  <?php
935
  $sqlQuery = $wpdb->prepare("
936
  SELECT l.id, l.name
965
  ?>
966
  </tbody>
967
  </table>
968
+ <div class="tablenav bottom">
969
+ <div class="tablenav-pages">
970
+ <?php if ( ! empty( $codes ) ) { ?>
971
+ <span class="displaying-num"><?php printf( __( "%d discount codes found.", 'paid-memberships-pro' ), $totalrows ); ?></span>
972
+ <?php } ?>
973
+ <?php
974
+ $pagination_url = admin_url( "/admin.php?page=pmpro-discountcodes&s=" . $s );
975
+ echo pmpro_getPaginationString( $pn, $totalrows, $limit, 1, $pagination_url, "&limit=$limit&pn=" );
976
+ ?>
977
+ </div>
978
+ </div>
979
 
980
  <?php } ?>
981
 
adminpages/emailsettings.php CHANGED
@@ -81,17 +81,16 @@
81
 
82
  <form action="" method="post" enctype="multipart/form-data">
83
  <?php wp_nonce_field('savesettings', 'pmpro_emailsettings_nonce');?>
84
-
85
- <h1 class="wp-heading-inline"><?php esc_html_e( 'Email Settings', 'paid-memberships-pro' ); ?></h1>
86
  <hr class="wp-header-end">
87
- <h2><?php _e( 'Send Emails From', 'paid-memberships-pro' ); ?></h2>
88
- <p><?php _e('By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below.', 'paid-memberships-pro' );?></p>
 
89
 
90
  <table class="form-table">
91
  <tbody>
92
  <tr>
93
  <th scope="row" valign="top">
94
- <label for="from_email"><?php _e('From Email', 'paid-memberships-pro' );?>:</label>
95
  </th>
96
  <td>
97
  <input type="text" name="from_email" value="<?php echo esc_attr($from_email);?>" class="regular-text" />
@@ -99,7 +98,7 @@
99
  </tr>
100
  <tr>
101
  <th scope="row" valign="top">
102
- <label for="from_name"><?php _e('From Name', 'paid-memberships-pro' );?>:</label>
103
  </th>
104
  <td>
105
  <input type="text" name="from_name" value="<?php echo esc_attr($from_name);?>" class="regular-text" />
@@ -107,7 +106,7 @@
107
  </tr>
108
  <tr>
109
  <th scope="row" valign="top">
110
- <label for="only_filter_pmpro_emails"><?php _e('Only Filter PMPro Emails?', 'paid-memberships-pro' );?>:</label>
111
  </th>
112
  <td>
113
  <input type="checkbox" id="only_filter_pmpro_emails" name="only_filter_pmpro_emails" value="1" <?php if(!empty($only_filter_pmpro_emails)) { ?>checked="checked"<?php } ?> />
@@ -119,7 +118,7 @@
119
  <p class="submit"><input name="savesettings" type="submit" class="button-primary" value="<?php esc_attr_e( 'Save All Settings', 'paid-memberships-pro' ); ?>" /></p>
120
  <hr />
121
  <div class="pmpro_admin_section pmpro_admin_section-email-deliverability">
122
- <h2><?php _e( 'Email Deliverability', 'paid-memberships-pro' ); ?></h2>
123
 
124
  <p><?php
125
  $allowed_email_troubleshooting_html = array (
@@ -127,10 +126,11 @@
127
  'href' => array(),
128
  'target' => array(),
129
  'title' => array(),
 
130
  ),
131
  'em' => array(),
132
  );
133
- echo sprintf( wp_kses( __( 'If you are having issues with email delivery from your server, <a href="%s" title="Paid Memberships Pro - Subscription Delays Add On" target="_blank">please read our email troubleshooting guide</a>. As an alternative, Paid Memberships Pro offers built-in integration for SendWP. <em>Optional: SendWP is a third-party service for transactional email in WordPress. <a href="%s" title="Documentation on SendWP and Paid Memberships Pro" target="_blank">Click here to learn more about SendWP and Paid Memberships Pro</a></em>.', 'paid-memberships-pro' ), $allowed_email_troubleshooting_html ), 'https://www.paidmembershipspro.com/troubleshooting-email-issues-sending-sent-spam-delivery-delays/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=blog&utm_content=email-troubleshooting', 'https://www.paidmembershipspro.com/documentation/member-communications/email-delivery-sendwp/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=documentation&utm_content=sendwp' );
134
  ?></p>
135
 
136
  <?php
@@ -146,7 +146,7 @@
146
  $sendwp_email_forwarding = function_exists( 'sendwp_forwarding_enabled' ) && sendwp_forwarding_enabled() ? true : false;
147
 
148
  // Messages for connected or not.
149
- $connected = __( 'Your site is connected to SendWP.', 'paid-memberships-pro' ) . " <a href='https://app.sendwp.com/dashboard/' target='_blank' rel='nofollow'>" . __( 'View Your SendWP Account', 'paid-memberships-pro' ) . "</a>";
150
  $disconnected = ' ' . sprintf( __( 'Please enable email sending inside %s.', 'paid-memberships-pro' ), '<a href="' . admin_url('/tools.php?page=sendwp') . '">SendWP Settings</a>' );
151
  ?>
152
  <p class="description" id="pmpro-sendwp-description"><?php echo $sendwp_email_forwarding ? $connected : $disconnected; ?></p>
@@ -159,12 +159,12 @@
159
  <tbody>
160
  <tr>
161
  <th scope="row" valign="top">
162
- <label for="email_member_notification"><?php _e('Send members emails', 'paid-memberships-pro' );?>:</label>
163
  </th>
164
  <td>
165
  <input type="checkbox" id="email_member_notification" name="email_member_notification" value="1" <?php if(!empty($email_member_notification)) { ?>checked="checked"<?php } ?> />
166
- <label for="email_member_notification"><?php _e('Default WP notification email.', 'paid-memberships-pro' );?></label>
167
- <p class="description"><?php _e( 'Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout.', 'paid-memberships-pro' ); ?></p>
168
  </td>
169
  </tr>
170
  </tbody>
@@ -175,4 +175,4 @@
175
  </form>
176
 
177
  <?php
178
- require_once(dirname(__FILE__) . "/admin_footer.php");
81
 
82
  <form action="" method="post" enctype="multipart/form-data">
83
  <?php wp_nonce_field('savesettings', 'pmpro_emailsettings_nonce');?>
 
 
84
  <hr class="wp-header-end">
85
+ <h1 class="wp-heading-inline"><?php esc_html_e( 'Email Settings', 'paid-memberships-pro' ); ?></h1>
86
+ <h2><?php esc_html_e( 'Send Emails From', 'paid-memberships-pro' ); ?></h2>
87
+ <p><?php echo wp_kses_post( __( 'By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below.', 'paid-memberships-pro' ) );?></p>
88
 
89
  <table class="form-table">
90
  <tbody>
91
  <tr>
92
  <th scope="row" valign="top">
93
+ <label for="from_email"><?php esc_html_e('From Email', 'paid-memberships-pro' );?>:</label>
94
  </th>
95
  <td>
96
  <input type="text" name="from_email" value="<?php echo esc_attr($from_email);?>" class="regular-text" />
98
  </tr>
99
  <tr>
100
  <th scope="row" valign="top">
101
+ <label for="from_name"><?php esc_html_e('From Name', 'paid-memberships-pro' );?>:</label>
102
  </th>
103
  <td>
104
  <input type="text" name="from_name" value="<?php echo esc_attr($from_name);?>" class="regular-text" />
106
  </tr>
107
  <tr>
108
  <th scope="row" valign="top">
109
+ <label for="only_filter_pmpro_emails"><?php esc_html_e('Only Filter PMPro Emails?', 'paid-memberships-pro' );?>:</label>
110
  </th>
111
  <td>
112
  <input type="checkbox" id="only_filter_pmpro_emails" name="only_filter_pmpro_emails" value="1" <?php if(!empty($only_filter_pmpro_emails)) { ?>checked="checked"<?php } ?> />
118
  <p class="submit"><input name="savesettings" type="submit" class="button-primary" value="<?php esc_attr_e( 'Save All Settings', 'paid-memberships-pro' ); ?>" /></p>
119
  <hr />
120
  <div class="pmpro_admin_section pmpro_admin_section-email-deliverability">
121
+ <h2><?php esc_html_e( 'Email Deliverability', 'paid-memberships-pro' ); ?></h2>
122
 
123
  <p><?php
124
  $allowed_email_troubleshooting_html = array (
126
  'href' => array(),
127
  'target' => array(),
128
  'title' => array(),
129
+ 'rel' => array(),
130
  ),
131
  'em' => array(),
132
  );
133
+ echo sprintf( wp_kses( __( 'If you are having issues with email delivery from your server, <a href="%s" title="Paid Memberships Pro - Subscription Delays Add On" target="_blank" rel="nofollow noopener">please read our email troubleshooting guide</a>. As an alternative, Paid Memberships Pro offers built-in integration for SendWP. <em>Optional: SendWP is a third-party service for transactional email in WordPress. <a href="%s" title="Documentation on SendWP and Paid Memberships Pro" target="_blank" rel="nofollow noopener">Click here to learn more about SendWP and Paid Memberships Pro</a></em>.', 'paid-memberships-pro' ), $allowed_email_troubleshooting_html ), 'https://www.paidmembershipspro.com/troubleshooting-email-issues-sending-sent-spam-delivery-delays/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=blog&utm_content=email-troubleshooting', 'https://www.paidmembershipspro.com/documentation/member-communications/email-delivery-sendwp/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=documentation&utm_content=sendwp' );
134
  ?></p>
135
 
136
  <?php
146
  $sendwp_email_forwarding = function_exists( 'sendwp_forwarding_enabled' ) && sendwp_forwarding_enabled() ? true : false;
147
 
148
  // Messages for connected or not.
149
+ $connected = __( 'Your site is connected to SendWP.', 'paid-memberships-pro' ) . " <a href='https://app.sendwp.com/dashboard/' target='_blank' rel='nofollow noopener'>" . __( 'View Your SendWP Account', 'paid-memberships-pro' ) . "</a>";
150
  $disconnected = ' ' . sprintf( __( 'Please enable email sending inside %s.', 'paid-memberships-pro' ), '<a href="' . admin_url('/tools.php?page=sendwp') . '">SendWP Settings</a>' );
151
  ?>
152
  <p class="description" id="pmpro-sendwp-description"><?php echo $sendwp_email_forwarding ? $connected : $disconnected; ?></p>
159
  <tbody>
160
  <tr>
161
  <th scope="row" valign="top">
162
+ <label for="email_member_notification"><?php esc_html_e('Send members emails', 'paid-memberships-pro' );?>:</label>
163
  </th>
164
  <td>
165
  <input type="checkbox" id="email_member_notification" name="email_member_notification" value="1" <?php if(!empty($email_member_notification)) { ?>checked="checked"<?php } ?> />
166
+ <label for="email_member_notification"><?php esc_html_e('Default WP notification email.', 'paid-memberships-pro' );?></label>
167
+ <p class="description"><?php esc_html_e( 'Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout.', 'paid-memberships-pro' ); ?></p>
168
  </td>
169
  </tr>
170
  </tbody>
175
  </form>
176
 
177
  <?php
178
+ require_once(dirname(__FILE__) . "/admin_footer.php");
adminpages/emailtemplates.php CHANGED
@@ -16,10 +16,8 @@
16
  ?>
17
  <form action="" method="post" enctype="multipart/form-data">
18
  <?php wp_nonce_field('savesettings', 'pmpro_emailsettings_nonce');?>
19
-
20
- <h1 class="wp-heading-inline"><?php esc_html_e( 'Email Templates', 'paid-memberships-pro' ); ?></h1>
21
  <hr class="wp-header-end">
22
-
23
  <p><?php esc_html_e( 'Select an email template from the dropdown below to customize the subject and body of emails sent through your membership site. You can also disable a specific email or send a test version through this admin page.', 'paid-memberships-pro' ); ?> <a href="https://www.paidmembershipspro.com/documentation/member-communications/list-of-pmpro-email-templates/" target="_blank"><?php esc_html_e( 'Click here for a description of each email sent to your members and admins at different stages of the member experience.', 'paid-memberships-pro'); ?></a></p>
24
 
25
  <div class="pmpro_admin_section pmpro_admin_section-email-templates-content">
@@ -111,90 +109,79 @@
111
  <hr />
112
 
113
  <div class="pmpro-email-templates-variable-reference">
114
- <h1><?php esc_html_e( 'Variable Reference', 'paid-memberships-pro' ); ?></h1>
115
 
116
  <p><?php esc_html_e( 'Use the placeholder variables below to customize your member and admin emails with specific user or membership data.', 'paid-memberships-pro' ); ?></p>
117
- <table class="form-table">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  <tbody>
119
- <tr>
120
- <th scope="row"><?php esc_html_e('General Settings / Membership Info', 'paid-memberships-pro'); ?></th>
121
- <td>
122
- <table class="widefat striped">
123
- <tbody>
124
- <?php
125
- $email_variables = [
126
- '!!name!!' => __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ),
127
- '!!user_login!!' => __( 'Username', 'paid-memberships-pro' ),
128
- '!!sitename!!' => __( 'Site Title', 'paid-memberships-pro' ),
129
- '!!siteemail!!' => __( 'Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)', 'paid-memberships-pro' ),
130
- '!!membership_id!!' => __( 'Membership Level ID', 'paid-memberships-pro' ),
131
- '!!membership_level_name!!' => __( 'Membership Level Name', 'paid-memberships-pro' ),
132
- '!!membership_change!!' => __( 'Membership Level Change', 'paid-memberships-pro' ),
133
- '!!membership_expiration!!' => __( 'Membership Level Expiration', 'paid-memberships-pro' ),
134
- '!!startdate!!' => __( 'Membership Start Date', 'paid-memberships-pro' ),
135
- '!!enddate!!' => __( 'Membership End Date', 'paid-memberships-pro' ),
136
- '!!display_name!!' => __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ),
137
- '!!user_email!!' => __( 'User Email', 'paid-memberships-pro' ),
138
- '!!login_url!!' => __( 'Login URL', 'paid-memberships-pro' ),
139
- '!!levels_url!!' => __( 'Membership Levels Page URL', 'paid-memberships-pro' ),
140
- ];
141
-
142
- foreach ( $email_variables as $email_variable => $description ) {
143
- ?>
144
- <tr>
145
- <td><?php echo esc_html( $email_variable ); ?></td>
146
- <td><?php echo esc_html( $description ); ?></td>
147
- </tr>
148
- <?php
149
- }
150
- ?>
151
- </tbody>
152
- </table>
153
- </td>
154
- </tr>
155
- <tr>
156
- <th scope="row"><?php esc_html_e( 'Billing Information', 'paid-memberships-pro' ); ?></th>
157
- <td>
158
- <table class="widefat striped">
159
- <tbody>
160
- <?php
161
- $email_variables = [
162
- '!!billing_address!!' => __( 'Billing Info Complete Address', 'paid-memberships-pro' ),
163
- '!!billing_name!!' => __( 'Billing Info Name', 'paid-memberships-pro' ),
164
- '!!billing_street!!' => __( 'Billing Info Street Address', 'paid-memberships-pro' ),
165
- '!!billing_city!!' => __( 'Billing Info City', 'paid-memberships-pro' ),
166
- '!!billing_state!!' => __( 'Billing Info State', 'paid-memberships-pro' ),
167
- '!!billing_zip!!' => __( 'Billing Info ZIP Code', 'paid-memberships-pro' ),
168
- '!!billing_country!!' => __( 'Billing Info Country', 'paid-memberships-pro' ),
169
- '!!billing_phone!!' => __( 'Billing Info Phone #', 'paid-memberships-pro' ),
170
- '!!cardtype!!' => __( 'Credit Card Type', 'paid-memberships-pro' ),
171
- '!!accountnumber!!' => __( 'Credit Card Number (last 4 digits)', 'paid-memberships-pro' ),
172
- '!!expirationmonth!!' => __( 'Credit Card Expiration Month (mm format)', 'paid-memberships-pro' ),
173
- '!!expirationyear!!' => __( 'Credit Card Expiration Year (yyyy format)', 'paid-memberships-pro' ),
174
- '!!membership_cost!!' => __( 'Membership Level Cost Text', 'paid-memberships-pro' ),
175
- '!!instructions!!' => __( 'Payment Instructions (used in Checkout - Email Template)', 'paid-memberships-pro' ),
176
- '!!invoice_id!!' => __( 'Invoice ID', 'paid-memberships-pro' ),
177
- '!!invoice_total!!' => __( 'Invoice Total', 'paid-memberships-pro' ),
178
- '!!invoice_date!!' => __( 'Invoice Date', 'paid-memberships-pro' ),
179
- '!!invoice_url!!' => __( 'Invoice Page URL', 'paid-memberships-pro' ),
180
- '!!discount_code!!' => __( 'Discount Code Applied', 'paid-memberships-pro' ),
181
- '!!membership_level_confirmation_message!!' => __( 'Custom Level Confirmation Message', 'paid-memberships-pro' ),
182
-
183
- ];
184
-
185
- foreach ( $email_variables as $email_variable => $description ) {
186
- ?>
187
- <tr>
188
- <td><?php echo esc_html( $email_variable ); ?></td>
189
- <td><?php echo esc_html( $description ); ?></td>
190
- </tr>
191
- <?php
192
- }
193
- ?>
194
- </tbody>
195
- </table>
196
- </td>
197
- </tr>
198
  </tbody>
199
  </table>
200
  </div> <!-- end pmpro-email-templates-variable-reference -->
16
  ?>
17
  <form action="" method="post" enctype="multipart/form-data">
18
  <?php wp_nonce_field('savesettings', 'pmpro_emailsettings_nonce');?>
 
 
19
  <hr class="wp-header-end">
20
+ <h1 class="wp-heading-inline"><?php esc_html_e( 'Email Templates', 'paid-memberships-pro' ); ?></h1>
21
  <p><?php esc_html_e( 'Select an email template from the dropdown below to customize the subject and body of emails sent through your membership site. You can also disable a specific email or send a test version through this admin page.', 'paid-memberships-pro' ); ?> <a href="https://www.paidmembershipspro.com/documentation/member-communications/list-of-pmpro-email-templates/" target="_blank"><?php esc_html_e( 'Click here for a description of each email sent to your members and admins at different stages of the member experience.', 'paid-memberships-pro'); ?></a></p>
22
 
23
  <div class="pmpro_admin_section pmpro_admin_section-email-templates-content">
109
  <hr />
110
 
111
  <div class="pmpro-email-templates-variable-reference">
112
+ <h2><?php esc_html_e( 'Variable Reference', 'paid-memberships-pro' ); ?></h2>
113
 
114
  <p><?php esc_html_e( 'Use the placeholder variables below to customize your member and admin emails with specific user or membership data.', 'paid-memberships-pro' ); ?></p>
115
+
116
+ <h3><?php esc_html_e('General Settings / Membership Info', 'paid-memberships-pro'); ?></h3>
117
+ <table class="widefat fixed striped">
118
+ <tbody>
119
+ <?php
120
+ $email_variables = [
121
+ '!!name!!' => __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ),
122
+ '!!user_login!!' => __( 'Username', 'paid-memberships-pro' ),
123
+ '!!sitename!!' => __( 'Site Title', 'paid-memberships-pro' ),
124
+ '!!siteemail!!' => __( 'Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)', 'paid-memberships-pro' ),
125
+ '!!membership_id!!' => __( 'Membership Level ID', 'paid-memberships-pro' ),
126
+ '!!membership_level_name!!' => __( 'Membership Level Name', 'paid-memberships-pro' ),
127
+ '!!membership_change!!' => __( 'Membership Level Change', 'paid-memberships-pro' ),
128
+ '!!membership_expiration!!' => __( 'Membership Level Expiration', 'paid-memberships-pro' ),
129
+ '!!startdate!!' => __( 'Membership Start Date', 'paid-memberships-pro' ),
130
+ '!!enddate!!' => __( 'Membership End Date', 'paid-memberships-pro' ),
131
+ '!!display_name!!' => __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ),
132
+ '!!user_email!!' => __( 'User Email', 'paid-memberships-pro' ),
133
+ '!!login_url!!' => __( 'Login URL', 'paid-memberships-pro' ),
134
+ '!!levels_url!!' => __( 'Membership Levels Page URL', 'paid-memberships-pro' ),
135
+ ];
136
+
137
+ foreach ( $email_variables as $email_variable => $description ) {
138
+ ?>
139
+ <tr>
140
+ <th><code><?php echo esc_html( $email_variable ); ?></code></th>
141
+ <td><?php echo esc_html( $description ); ?></td>
142
+ </tr>
143
+ <?php
144
+ }
145
+ ?>
146
+ </tbody>
147
+ </table>
148
+
149
+ <h3><?php esc_html_e( 'Billing Information', 'paid-memberships-pro' ); ?></h3>
150
+ <table class="widefat fixed striped">
151
  <tbody>
152
+ <?php
153
+ $email_variables = [
154
+ '!!billing_address!!' => __( 'Billing Info Complete Address', 'paid-memberships-pro' ),
155
+ '!!billing_name!!' => __( 'Billing Info Name', 'paid-memberships-pro' ),
156
+ '!!billing_street!!' => __( 'Billing Info Street Address', 'paid-memberships-pro' ),
157
+ '!!billing_city!!' => __( 'Billing Info City', 'paid-memberships-pro' ),
158
+ '!!billing_state!!' => __( 'Billing Info State', 'paid-memberships-pro' ),
159
+ '!!billing_zip!!' => __( 'Billing Info ZIP Code', 'paid-memberships-pro' ),
160
+ '!!billing_country!!' => __( 'Billing Info Country', 'paid-memberships-pro' ),
161
+ '!!billing_phone!!' => __( 'Billing Info Phone #', 'paid-memberships-pro' ),
162
+ '!!cardtype!!' => __( 'Credit Card Type', 'paid-memberships-pro' ),
163
+ '!!accountnumber!!' => __( 'Credit Card Number (last 4 digits)', 'paid-memberships-pro' ),
164
+ '!!expirationmonth!!' => __( 'Credit Card Expiration Month (mm format)', 'paid-memberships-pro' ),
165
+ '!!expirationyear!!' => __( 'Credit Card Expiration Year (yyyy format)', 'paid-memberships-pro' ),
166
+ '!!membership_cost!!' => __( 'Membership Level Cost Text', 'paid-memberships-pro' ),
167
+ '!!instructions!!' => __( 'Payment Instructions (used in Checkout - Email Template)', 'paid-memberships-pro' ),
168
+ '!!invoice_id!!' => __( 'Invoice ID', 'paid-memberships-pro' ),
169
+ '!!invoice_total!!' => __( 'Invoice Total', 'paid-memberships-pro' ),
170
+ '!!invoice_date!!' => __( 'Invoice Date', 'paid-memberships-pro' ),
171
+ '!!invoice_url!!' => __( 'Invoice Page URL', 'paid-memberships-pro' ),
172
+ '!!discount_code!!' => __( 'Discount Code Applied', 'paid-memberships-pro' ),
173
+ '!!membership_level_confirmation_message!!' => __( 'Custom Level Confirmation Message', 'paid-memberships-pro' ),
174
+ ];
175
+
176
+ foreach ( $email_variables as $email_variable => $description ) {
177
+ ?>
178
+ <tr>
179
+ <th><code><?php echo esc_html( $email_variable ); ?></code></th>
180
+ <td><?php echo esc_html( $description ); ?></td>
181
+ </tr>
182
+ <?php
183
+ }
184
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  </tbody>
186
  </table>
187
  </div> <!-- end pmpro-email-templates-variable-reference -->
adminpages/functions.php CHANGED
@@ -391,11 +391,11 @@ function pmpro_add_email_order_modal() {
391
  $order = new MemberOrder( $_REQUEST['order'] );
392
  if ( ! empty( $user ) && ! empty( $order ) && $email->sendBillableInvoiceEmail( $user, $order ) ) { ?>
393
  <div class="notice notice-success is-dismissible">
394
- <p><?php _e( 'Invoice emailed successfully.', 'paid-memberships-pro' ); ?></p>
395
  </div>
396
  <?php } else { ?>
397
  <div class="notice notice-error is-dismissible">
398
- <p><?php _e( 'Error emailing invoice.', 'paid-memberships-pro' ); ?></p>
399
  </div>
400
  <?php }
401
  }
@@ -422,12 +422,12 @@ function pmpro_add_email_order_modal() {
422
  </script>
423
  <?php add_thickbox(); ?>
424
  <div id="email_invoice" style="display:none;">
425
- <h3><?php _e( 'Email Invoice', 'paid-memberships-pro' ); ?></h3>
426
  <form method="post" action="">
427
  <input type="hidden" name="order" value=""/>
428
  <?php _e( 'Send an invoice for this order to: ', 'paid-memberships-pro' ); ?>
429
  <input type="text" value="" name="email"/>
430
- <button class="button button-primary alignright"><?php _e( 'Send Email', 'paid-memberships-pro' ); ?></button>
431
  </form>
432
  </div>
433
  <?php
391
  $order = new MemberOrder( $_REQUEST['order'] );
392
  if ( ! empty( $user ) && ! empty( $order ) && $email->sendBillableInvoiceEmail( $user, $order ) ) { ?>
393
  <div class="notice notice-success is-dismissible">
394
+ <p><?php esc_html_e( 'Invoice emailed successfully.', 'paid-memberships-pro' ); ?></p>
395
  </div>
396
  <?php } else { ?>
397
  <div class="notice notice-error is-dismissible">
398
+ <p><?php esc_html_e( 'Error emailing invoice.', 'paid-memberships-pro' ); ?></p>
399
  </div>
400
  <?php }
401
  }
422
  </script>
423
  <?php add_thickbox(); ?>
424
  <div id="email_invoice" style="display:none;">
425
+ <h3><?php esc_html_e( 'Email Invoice', 'paid-memberships-pro' ); ?></h3>
426
  <form method="post" action="">
427
  <input type="hidden" name="order" value=""/>
428
  <?php _e( 'Send an invoice for this order to: ', 'paid-memberships-pro' ); ?>
429
  <input type="text" value="" name="email"/>
430
+ <button class="button button-primary alignright"><?php esc_html_e( 'Send Email', 'paid-memberships-pro' ); ?></button>
431
  </form>
432
  </div>
433
  <?php
adminpages/license.php CHANGED
@@ -25,24 +25,36 @@ if ( empty( $pmpro_license_check ) ) {
25
  $pmpro_license_check = get_option( 'pmpro_license_check', array( 'license' => false, 'enddate' => 0 ) );
26
  }
27
 
 
 
 
 
 
 
 
 
 
 
 
28
  // HTML for license settings page.
29
  if ( defined( 'PMPRO_DIR' ) ) {
30
  require_once( PMPRO_DIR . '/adminpages/admin_header.php' );
31
  } ?>
 
32
  <div class="about-wrap">
33
- <h2><?php _e('Paid Memberships Pro Support License', 'paid-memberships-pro' );?></h2>
34
 
35
  <div class="about-text">
36
  <?php if ( is_wp_error( $pmpro_license_check ) ) { ?>
37
- <p class="pmpro_message pmpro_error"><strong><?php echo esc_html( sprintf( __( 'There was an issue validating your license key: %s', 'paid-memberships-pro' ), $pmpro_license_check->get_error_message() ) );?></strong> <?php _e('Visit the PMPro <a href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dkey-not-valid" target="_blank">Membership Account</a> page to confirm that your account is active and to find your license key.', 'paid-memberships-pro' );?></p>
38
  <?php } elseif( ! pmpro_license_isValid() && empty( $key ) ) { ?>
39
- <p class="pmpro_message pmpro_error"><strong><?php _e('Enter your support license key.</strong> Your license key can be found in your membership email receipt or in your <a href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dno-key" target="_blank">Membership Account</a>.', 'paid-memberships-pro' );?></p>
40
  <?php } elseif( ! pmpro_license_isValid() ) { ?>
41
- <p class="pmpro_message pmpro_error"><strong><?php _e('Your license is invalid or expired.', 'paid-memberships-pro' );?></strong> <?php _e('Visit the PMPro <a href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dkey-not-valid" target="_blank">Membership Account</a> page to confirm that your account is active and to find your license key.', 'paid-memberships-pro' );?></p>
42
  <?php } elseif ( pmpro_license_isValid() && ! pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
43
- <p class="pmpro_message pmpro_alert"><?php printf(__('Your <strong>%1$s</strong> key is active. %1$s accounts include access to documentation and free downloads.', 'paid-memberships-pro' ), ucwords( $pmpro_license_check['license'] ) );?></p>
44
  <?php } else { ?>
45
- <p class="pmpro_message pmpro_success"><?php printf(__('<strong>Thank you!</strong> A valid <strong>%s</strong> license key has been used to activate your support license on this site.', 'paid-memberships-pro' ), ucwords( $pmpro_license_check['license'] ) );?></p>
46
  <?php } ?>
47
 
48
  <form action="" method="post">
@@ -61,13 +73,13 @@ if ( defined( 'PMPRO_DIR' ) ) {
61
 
62
  <p>
63
  <?php if ( ! pmpro_license_isValid() ) { ?>
64
- <a class="button button-primary button-hero" href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-license&utm_campaign=pricing&utm_content=view-plans-pricing" target="_blank"><?php echo esc_html( 'View Plans and Pricing', 'paid-memberships-pro' ); ?></a>
65
  <?php } else { ?>
66
- <a class="button button-primary button-hero" href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dview-account" target="_blank"><?php echo esc_html( 'Manage My Account', 'paid-memberships-pro' ); ?></a>
67
  <?php if ( pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
68
- <a class="button button-hero" href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fnew-topic%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dsupport%26utm_content%3Dnew-support-ticket" target="_blank"><?php echo esc_html( 'Open Support Ticket', 'paid-memberships-pro' ); ?></a>
69
  <?php } else { ?>
70
- <a class="button button-hero" href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fpricing%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dpricing%26utm_content%3Dupgrade-for-support" target="_blank"><?php echo esc_html( 'Upgrade For Support', 'paid-memberships-pro' ); ?></a>
71
  <?php }
72
  } ?>
73
  </p>
@@ -76,17 +88,7 @@ if ( defined( 'PMPRO_DIR' ) ) {
76
 
77
  <div class="clearfix"></div>
78
 
79
- <img class="pmpro_icon alignright" src="<?php echo PMPRO_URL?>/images/Paid-Memberships-Pro_icon.png" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" />
80
- <?php
81
- $allowed_pmpro_license_strings_html = array (
82
- 'a' => array (
83
- 'href' => array(),
84
- 'target' => array(),
85
- 'title' => array(),
86
- ),
87
- 'strong' => array(),
88
- 'em' => array(), );
89
- ?>
90
 
91
  <?php
92
  echo '<p>' . sprintf( wp_kses( __( 'Paid Memberships Pro and our Add Ons are distributed under the <a href="%s" title="GPLv2 license" target="_blank">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge.', 'paid-memberships-pro' ), $allowed_pmpro_license_strings_html ), 'https://www.paidmembershipspro.com/features/paid-memberships-pro-is-100-gpl/?utm_source=plugin&utm_medium=pmpro-license&utm_campaign=documentation&utm_content=gpl' ) . '</p>';
@@ -100,7 +102,7 @@ if ( defined( 'PMPRO_DIR' ) ) {
100
  echo '<p>' . wp_kses( __( '<strong>Need help?</strong> Your license allows you to open new tickets in our private support area. Purchases are backed by a 30 day, no questions asked refund policy.', 'paid-memberships-pro' ), $allowed_pmpro_license_strings_html ) . '</p>';
101
  ?>
102
 
103
- <p><a href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-license&utm_campaign=pricing&utm_content=view-license-options" target="_blank"><?php echo esc_html( 'View Support License Options &raquo;', 'paid-memberships-pro' ); ?></a></p>
104
 
105
  </div> <!-- end about-text -->
106
  </div> <!-- end about-wrap -->
25
  $pmpro_license_check = get_option( 'pmpro_license_check', array( 'license' => false, 'enddate' => 0 ) );
26
  }
27
 
28
+ // Allowed strings for kses checks below.
29
+ $allowed_pmpro_license_strings_html = array (
30
+ 'a' => array (
31
+ 'href' => array(),
32
+ 'target' => array(),
33
+ 'title' => array(),
34
+ ),
35
+ 'strong' => array(),
36
+ 'em' => array(),
37
+ );
38
+
39
  // HTML for license settings page.
40
  if ( defined( 'PMPRO_DIR' ) ) {
41
  require_once( PMPRO_DIR . '/adminpages/admin_header.php' );
42
  } ?>
43
+ <hr class="wp-header-end">
44
  <div class="about-wrap">
45
+ <h2><?php esc_html_e('Paid Memberships Pro Support License', 'paid-memberships-pro' );?></h2>
46
 
47
  <div class="about-text">
48
  <?php if ( is_wp_error( $pmpro_license_check ) ) { ?>
49
+ <p class="pmpro_message pmpro_error"><strong><?php echo esc_html( sprintf( __( 'There was an issue validating your license key: %s', 'paid-memberships-pro' ), $pmpro_license_check->get_error_message() ) );?></strong> <?php echo wp_kses( sprintf( __('Visit the PMPro <a href="%s" target="_blank">Membership Account</a> page to confirm that your account is active and to find your license key.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dkey-not-valid' ), $allowed_pmpro_license_strings_html );?></p>
50
  <?php } elseif( ! pmpro_license_isValid() && empty( $key ) ) { ?>
51
+ <p class="pmpro_message pmpro_error"><?php echo wp_kses( sprintf( __( '<strong>Enter your support license key</strong>. Your license key can be found in your membership email receipt or in your <a href="%s" target="_blank">Membership Account</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dno-key' ), $allowed_pmpro_license_strings_html );?></p>
52
  <?php } elseif( ! pmpro_license_isValid() ) { ?>
53
+ <p class="pmpro_message pmpro_error"><strong><?php esc_html_e('Your license is invalid or expired.', 'paid-memberships-pro' );?></strong> <?php echo wp_kses( sprintf( __( 'Visit the PMPro <a href="%s" target="_blank">Membership Account</a> page to confirm that your account is active and to find your license key.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dkey-not-valid' ), $allowed_pmpro_license_strings_html );?></p>
54
  <?php } elseif ( pmpro_license_isValid() && ! pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
55
+ <p class="pmpro_message pmpro_alert"><?php echo wp_kses( sprintf( __( 'Your <strong>%1$s</strong> key is active. %1$s accounts include access to documentation and free downloads.', 'paid-memberships-pro' ), ucwords( $pmpro_license_check['license'] ) ), $allowed_pmpro_license_strings_html );?></p>
56
  <?php } else { ?>
57
+ <p class="pmpro_message pmpro_success"><?php echo wp_kses( sprintf( __('<strong>Thank you!</strong> A valid <strong>%s</strong> license key has been used to activate your support license on this site.', 'paid-memberships-pro' ), ucwords( $pmpro_license_check['license'] ) ), $allowed_pmpro_license_strings_html );?></p>
58
  <?php } ?>
59
 
60
  <form action="" method="post">
73
 
74
  <p>
75
  <?php if ( ! pmpro_license_isValid() ) { ?>
76
+ <a class="button button-primary button-hero" href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-license&utm_campaign=pricing&utm_content=view-plans-pricing" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'View Plans and Pricing', 'paid-memberships-pro' ); ?></a>
77
  <?php } else { ?>
78
+ <a class="button button-primary button-hero" href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fmembership-account%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dmembership-account%26utm_content%3Dview-account" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Manage My Account', 'paid-memberships-pro' ); ?></a>
79
  <?php if ( pmpro_license_isValid( $key, pmpro_license_get_premium_types() ) ) { ?>
80
+ <a class="button button-hero" href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fnew-topic%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dsupport%26utm_content%3Dnew-support-ticket" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Open Support Ticket', 'paid-memberships-pro' ); ?></a>
81
  <?php } else { ?>
82
+ <a class="button button-hero" href="https://www.paidmembershipspro.com/login/?redirect_to=%2Fpricing%2F%3Futm_source%3Dplugin%26utm_medium%3Dpmpro-license%26utm_campaign%3Dpricing%26utm_content%3Dupgrade-for-support" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Upgrade For Support', 'paid-memberships-pro' ); ?></a>
83
  <?php }
84
  } ?>
85
  </p>
88
 
89
  <div class="clearfix"></div>
90
 
91
+ <img class="pmpro_icon alignright" src="<?php echo PMPRO_URL?>/images/Paid-Memberships-Pro_icon.png" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" />
 
 
 
 
 
 
 
 
 
 
92
 
93
  <?php
94
  echo '<p>' . sprintf( wp_kses( __( 'Paid Memberships Pro and our Add Ons are distributed under the <a href="%s" title="GPLv2 license" target="_blank">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge.', 'paid-memberships-pro' ), $allowed_pmpro_license_strings_html ), 'https://www.paidmembershipspro.com/features/paid-memberships-pro-is-100-gpl/?utm_source=plugin&utm_medium=pmpro-license&utm_campaign=documentation&utm_content=gpl' ) . '</p>';
102
  echo '<p>' . wp_kses( __( '<strong>Need help?</strong> Your license allows you to open new tickets in our private support area. Purchases are backed by a 30 day, no questions asked refund policy.', 'paid-memberships-pro' ), $allowed_pmpro_license_strings_html ) . '</p>';
103
  ?>
104
 
105
+ <p><a href="https://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=pmpro-license&utm_campaign=pricing&utm_content=view-license-options" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'View Support License Options &raquo;', 'paid-memberships-pro' ); ?></a></p>
106
 
107
  </div> <!-- end about-text -->
108
  </div> <!-- end about-wrap -->
adminpages/membershiplevels.php CHANGED
@@ -166,7 +166,7 @@
166
  }
167
 
168
  if( ! empty( $msgt ) && $ml_recurring && $ml_expiration ) {
169
- $msgt .= ' <strong class="red">' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, <a target="_blank" href="%s">see our post here</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . '</strong>';
170
 
171
  // turn success to errors
172
  if( $msg > 0 ) {
@@ -259,7 +259,7 @@
259
  <?php
260
  if($edit) {
261
  ?>
262
-
263
  <h1 class="wp-heading-inline">
264
  <?php
265
  if($edit > 0)
@@ -268,8 +268,6 @@
268
  echo __("Add New Membership Level", 'paid-memberships-pro' );
269
  ?>
270
  </h1>
271
- <hr class="wp-header-end">
272
-
273
  <div>
274
  <?php
275
  // get the level...
@@ -344,19 +342,19 @@
344
  <table class="form-table">
345
  <tbody>
346
  <tr>
347
- <th scope="row" valign="top"><label><?php _e('ID', 'paid-memberships-pro' );?>:</label></th>
348
  <td>
349
- <?php echo $level->id?>
350
  </td>
351
  </tr>
352
 
353
  <tr>
354
- <th scope="row" valign="top"><label for="name"><?php _e('Name', 'paid-memberships-pro' );?>:</label></th>
355
  <td><input name="name" type="text" value="<?php echo esc_attr($level->name);?>" class="regular-text" /></td>
356
  </tr>
357
 
358
  <tr>
359
- <th scope="row" valign="top"><label for="description"><?php _e('Description', 'paid-memberships-pro' );?>:</label></th>
360
  <td>
361
  <div id="poststuff" class="pmpro_description">
362
  <?php
@@ -374,7 +372,7 @@
374
  </tr>
375
 
376
  <tr>
377
- <th scope="row" valign="top"><label for="confirmation"><?php _e('Confirmation Message', 'paid-memberships-pro' );?>:</label></th>
378
  <td>
379
  <div class="pmpro_confirmation">
380
  <?php
@@ -388,17 +386,17 @@
388
  }
389
  ?>
390
  </div>
391
- <input id="confirmation_in_email" name="confirmation_in_email" type="checkbox" value="yes" <?php checked( $confirmation_in_email, 1); ?> /> <label for="confirmation_in_email"><?php _e('Check to include this message in the membership confirmation email.', 'paid-memberships-pro' );?></label>
392
  </td>
393
  </tr>
394
  </tbody>
395
  </table>
396
  <hr />
397
- <h2 class="title"><?php _e('Billing Details', 'paid-memberships-pro' );?></h2>
398
  <table class="form-table">
399
  <tbody>
400
  <tr>
401
- <th scope="row" valign="top"><label for="initial_payment"><?php _e('Initial Payment', 'paid-memberships-pro' );?>:</label></th>
402
  <td>
403
  <?php
404
  if(pmpro_getCurrencyPosition() == "left")
@@ -409,17 +407,17 @@
409
  if(pmpro_getCurrencyPosition() == "right")
410
  echo $pmpro_currency_symbol;
411
  ?>
412
- <p class="description"><?php _e('The initial amount collected at registration.', 'paid-memberships-pro' );?></p>
413
  </td>
414
  </tr>
415
 
416
  <tr>
417
- <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'paid-memberships-pro' );?>:</label></th>
418
- <td><input id="recurring" name="recurring" type="checkbox" value="yes" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#recurring').is(':checked')) { jQuery('.recurring_info').show(); if(jQuery('#custom_trial').is(':checked')) {jQuery('.trial_info').show();} else {jQuery('.trial_info').hide();} } else { jQuery('.recurring_info').hide();}" /> <label for="recurring"><?php _e('Check if this level has a recurring subscription payment.', 'paid-memberships-pro' );?></label></td>
419
  </tr>
420
 
421
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
422
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Billing Amount', 'paid-memberships-pro' );?>:</label></th>
423
  <td>
424
  <?php
425
  if(pmpro_getCurrencyPosition() == "left")
@@ -445,39 +443,40 @@
445
  <p class="description">
446
  <?php _e('The amount to be billed one cycle after the initial payment.', 'paid-memberships-pro' );?>
447
  <?php if($gateway == "braintree") { ?>
448
- <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently only supports billing periods of "Month" or "Year".', 'paid-memberships-pro' );?></strong>
449
  <?php } elseif($gateway == "stripe") { ?>
450
- <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration does not allow billing periods longer than 1 year.', 'paid-memberships-pro' );?></strong></p>
451
  <?php }?>
452
  </p>
453
  <?php if($gateway == "braintree" && $edit < 0) { ?>
454
- <p class="pmpro_message"><strong><?php _e('Note', 'paid-memberships-pro' );?>:</strong> <?php _e('After saving this level, make note of the ID and create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to <em>pmpro_#</em>, where # is the level ID.', 'paid-memberships-pro' );?></p>
455
  <?php } elseif($gateway == "braintree") {
456
  $has_bt_plan = PMProGateway_braintree::checkLevelForPlan( $level->id );
457
  ?>
458
  <p class="pmpro_message <?php if ( ! $has_bt_plan ) {?>pmpro_error<?php } ?>">
459
- <strong><?php _e('Note', 'paid-memberships-pro' );?>:</strong> <?php printf( __('You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to %s.', 'paid-memberships-pro' ), PMProGateway_braintree::get_plan_id( $level->id ) ); ?></p>
460
  <?php } ?>
461
  </td>
462
  </tr>
463
 
464
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
465
- <th scope="row" valign="top"><label for="billing_limit"><?php _e('Billing Cycle Limit', 'paid-memberships-pro' );?>:</label></th>
466
  <td>
467
- <input name="billing_limit" type="text" value="<?php echo $level->billing_limit?>" class="small-text" />
468
  <p class="description">
469
  <?php _e('The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.', 'paid-memberships-pro' );?>
470
  <?php if ( ( $gateway == "stripe" ) && ! function_exists( 'pmprosbl_plugin_row_meta' ) ) { ?>
471
- <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support billing limits. You can still set an expiration date below.', 'paid-memberships-pro' );?></strong>
472
  <?php if ( ! function_exists( 'pmprosd_pmpro_membership_level_after_other_settings' ) ) {
473
  $allowed_sbl_html = array (
474
  'a' => array (
475
  'href' => array(),
476
  'target' => array(),
477
  'title' => array(),
 
478
  ),
479
  );
480
- echo '<br />' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the <a href="%s" title="Paid Memberships Pro - Stripe Billing Limits Add On" target="_blank">Stripe Billing Limits Add On</a>.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . '</em></td></tr>';
481
  } ?>
482
  <?php } ?>
483
  </p>
@@ -485,12 +484,12 @@
485
  </tr>
486
 
487
  <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
488
- <th scope="row" valign="top"><label><?php _e('Custom Trial', 'paid-memberships-pro' );?>:</label></th>
489
  <td>
490
- <input id="custom_trial" name="custom_trial" type="checkbox" value="yes" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="jQuery('.trial_info').toggle();" /> <label for="custom_trial"><?php _e('Check to add a custom trial period.', 'paid-memberships-pro' );?></label>
491
 
492
  <?php if($gateway == "twocheckout") { ?>
493
- <p class="description"><strong <?php if(!empty($pmpro_twocheckout_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount.', 'paid-memberships-pro' );?></strong></p>
494
  <?php } ?>
495
  </td>
496
  </tr>
@@ -501,13 +500,14 @@
501
  'href' => array(),
502
  'target' => array(),
503
  'title' => array(),
 
504
  ),
505
  );
506
- echo '<tr><th>&nbsp;</th><td><p class="description">' . sprintf( wp_kses( __( 'Optional: Allow more customizable trial periods and renewal dates using the <a href="%s" title="Paid Memberships Pro - Subscription Delays Add On" target="_blank">Subscription Delays Add On</a>.', 'paid-memberships-pro' ), $allowed_sd_html ), 'https://www.paidmembershipspro.com/add-ons/subscription-delays/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=subscription-delays' ) . '</p></td></tr>';
507
  } ?>
508
 
509
  <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
510
- <th scope="row" valign="top"><label for="trial_amount"><?php _e('Trial Billing Amount', 'paid-memberships-pro' );?>:</label></th>
511
  <td>
512
  <?php
513
  if(pmpro_getCurrencyPosition() == "left")
@@ -522,11 +522,11 @@
522
  <input name="trial_limit" type="text" value="<?php echo esc_attr($level->trial_limit);?>" class="small-text" />
523
  <?php _e('subscription payments', 'paid-memberships-pro' );?>.
524
  <?php if($gateway == "stripe") { ?>
525
- <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
526
  <?php } elseif($gateway == "braintree") { ?>
527
- <p class="description"><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
528
  <?php } elseif($gateway == "payflowpro") { ?>
529
- <p class="description"><strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Payflow integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
530
  <?php } ?>
531
  </td>
532
  </tr>
@@ -551,13 +551,13 @@
551
  <table class="form-table">
552
  <tbody>
553
  <tr>
554
- <th scope="row" valign="top"><label><?php _e('Disable New Signups', 'paid-memberships-pro' );?>:</label></th>
555
- <td><input id="disable_signups" name="disable_signups" type="checkbox" value="yes" <?php if($level->id && !$level->allow_signups) { ?>checked="checked"<?php } ?> /> <label for="disable_signups"><?php _e('Check to hide this level from the membership levels page and disable registration.', 'paid-memberships-pro' );?></label></td>
556
  </tr>
557
 
558
  <tr>
559
- <th scope="row" valign="top"><label><?php _e('Membership Expiration', 'paid-memberships-pro' );?>:</label></th>
560
- <td><input id="expiration" name="expiration" type="checkbox" value="yes" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#expiration').is(':checked')) { jQuery('.expiration_info').show(); } else { jQuery('.expiration_info').hide();}" /> <label for="expiration"><?php _e('Check this to set when membership access expires.', 'paid-memberships-pro' );?></label></a></td>
561
  </tr>
562
 
563
  <?php if ( ! function_exists( 'pmprosed_pmpro_membership_level_after_other_settings' ) ) {
@@ -566,13 +566,14 @@
566
  'href' => array(),
567
  'target' => array(),
568
  'title' => array(),
 
569
  ),
570
  );
571
- echo '<tr><th>&nbsp;</th><td><p class="description">' . sprintf( wp_kses( __( 'Optional: Allow more customizable expiration dates using the <a href="%s" title="Paid Memberships Pro - Set Expiration Date Add On" target="_blank">Set Expiration Date Add On</a>.', 'paid-memberships-pro' ), $allowed_sed_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-expiration-date/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=pmpro-expiration-date' ) . '</p></td></tr>';
572
  } ?>
573
 
574
  <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
575
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Expires In', 'paid-memberships-pro' );?>:</label></th>
576
  <td>
577
  <input id="expiration_number" name="expiration_number" type="text" value="<?php echo esc_attr($level->expiration_number);?>" class="small-text" />
578
  <select id="expiration_period" name="expiration_period">
@@ -583,10 +584,10 @@
583
  }
584
  ?>
585
  </select>
586
- <p class="description"><?php _e('Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires.', 'paid-memberships-pro' );?></p>
587
 
588
  <div id="pmpro_expiration_warning" style="display: none;" class="notice error inline">
589
- <p><?php printf( __( 'WARNING: This level is set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a certain number of payments. For more information, <a target="_blank" href="%s">see our post here</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ); ?></p>
590
  </div>
591
  <script>
592
  jQuery(document).ready(function() {
@@ -651,7 +652,7 @@
651
  <table class="form-table">
652
  <tbody>
653
  <tr class="membership_categories">
654
- <th scope="row" valign="top"><label><?php _e('Categories', 'paid-memberships-pro' );?>:</label></th>
655
  <td>
656
  <?php pmpro_listCategories(0, $level->categories); ?>
657
  </td>
@@ -671,8 +672,8 @@
671
  ?>
672
 
673
  <p class="submit topborder">
674
- <input name="save" type="submit" class="button button-primary" value="<?php _e('Save Level', 'paid-memberships-pro' ); ?>" />
675
- <input name="cancel" type="button" class="button" value="<?php _e('Cancel', 'paid-memberships-pro' ); ?>" onclick="location.href='<?php echo add_query_arg( 'page', 'pmpro-membershiplevels' , admin_url( '/admin.php') ); ?>';" />
676
  </p>
677
  </form>
678
  </div>
@@ -772,29 +773,26 @@
772
  <?php
773
  }
774
  ?>
775
-
776
  <?php if( empty( $s ) && count( $reordered_levels ) === 0 ) { ?>
777
  <div class="pmpro-new-install">
778
- <h2><?php echo esc_attr_e( 'No Membership Levels Found', 'paid-memberships-pro' ); ?></h2>
779
- <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-membershiplevels&edit=-1' ) ); ?>" class="button-primary"><?php echo esc_attr_e( 'Create a Membership Level', 'paid-memberships-pro' ); ?></a>
780
- <a href="<?php echo esc_url( 'https://www.paidmembershipspro.com/documentation/initial-plugin-setup/step-1-add-new-membership-level/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=documentation&utm_content=step-1-add-new-membership-level' ); ?>" target="_blank" class="button"><?php echo esc_attr_e( 'Video: Membership Levels', 'paid-memberships-pro' ); ?></a>
781
  </div> <!-- end pmpro-new-install -->
782
  <?php } else { ?>
783
-
784
  <form id="posts-filter" method="get" action="">
785
  <p class="search-box">
786
- <label class="screen-reader-text" for="post-search-input"><?php _e('Search Levels', 'paid-memberships-pro' );?>:</label>
787
  <input type="hidden" name="page" value="pmpro-membershiplevels" />
788
  <input id="post-search-input" type="text" value="<?php echo esc_attr($s); ?>" name="s" size="30" />
789
- <input class="button" type="submit" value="<?php _e('Search Levels', 'paid-memberships-pro' );?>" id="search-submit" />
790
  </p>
791
  </form>
792
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Membership Levels', 'paid-memberships-pro' ); ?></h1>
793
- <a href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => -1 ), admin_url( 'admin.php' ) ); ?>" class="page-title-action"><?php esc_html_e( 'Add New Level', 'paid-memberships-pro' ); ?></a>
794
- <hr class="wp-header-end">
795
-
796
  <?php if(empty($_REQUEST['s']) && count($reordered_levels) > 1) { ?>
797
- <p><?php _e('Drag and drop membership levels to reorder them on the Levels page.', 'paid-memberships-pro' ); ?></p>
798
  <?php } ?>
799
 
800
  <?php
@@ -804,11 +802,11 @@
804
  <table class="widefat membership-levels">
805
  <thead>
806
  <tr>
807
- <th><?php _e('ID', 'paid-memberships-pro' );?></th>
808
- <th><?php _e('Name', 'paid-memberships-pro' );?></th>
809
- <th><?php _e('Billing Details', 'paid-memberships-pro' );?></th>
810
- <th><?php _e('Expiration', 'paid-memberships-pro' );?></th>
811
- <th><?php _e('Allow Signups', 'paid-memberships-pro' );?></th>
812
  <?php do_action( 'pmpro_membership_levels_table_extra_cols_header', $reordered_levels ); ?>
813
  </tr>
814
  </thead>
@@ -816,7 +814,7 @@
816
  <?php if ( !empty( $s ) && empty( $reordered_levels ) ) { ?>
817
  <tr class="alternate">
818
  <td colspan="5">
819
- <?php echo esc_attr_e( 'No Membership Levels Found', 'paid-memberships-pro' ); ?>
820
  </td>
821
  </tr>
822
  <?php } ?>
@@ -828,7 +826,7 @@
828
  <tr class="<?php if($count++ % 2 == 1) { ?>alternate<?php } ?> <?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibility($level) || !pmpro_checkLevelForBraintreeCompatibility($level) || !pmpro_checkLevelForPayflowCompatibility($level) || !pmpro_checkLevelForTwoCheckoutCompatibility($level)) { ?>pmpro_error<?php } ?>">
829
  <td><?php echo $level->id?></td>
830
  <td class="level_name has-row-actions">
831
- <span class="level-name"><a href="<?php echo add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => $level->id ), admin_url( 'admin.php' ) ); ?>"><?php esc_attr_e( $level->name ); ?></a></span>
832
  <div class="row-actions">
833
  <?php
834
  $delete_text = esc_html(
@@ -933,7 +931,7 @@
933
  <td><?php
934
  if($level->allow_signups) {
935
  if ( ! empty( $pmpro_pages['checkout'] ) ) {
936
- ?><a target="_blank" href="<?php echo add_query_arg( 'level', $level->id, pmpro_url("checkout") );?>"><?php _e('Yes', 'paid-memberships-pro' );?></a><?php
937
  } else {
938
  _e('Yes', 'paid-memberships-pro' );
939
  }
166
  }
167
 
168
  if( ! empty( $msgt ) && $ml_recurring && $ml_expiration ) {
169
+ $msgt .= ' <strong class="red">' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, <a target="_blank" rel="nofollow noopener" href="%s">see our post here</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . '</strong>';
170
 
171
  // turn success to errors
172
  if( $msg > 0 ) {
259
  <?php
260
  if($edit) {
261
  ?>
262
+ <hr class="wp-header-end">
263
  <h1 class="wp-heading-inline">
264
  <?php
265
  if($edit > 0)
268
  echo __("Add New Membership Level", 'paid-memberships-pro' );
269
  ?>
270
  </h1>
 
 
271
  <div>
272
  <?php
273
  // get the level...
342
  <table class="form-table">
343
  <tbody>
344
  <tr>
345
+ <th scope="row" valign="top"><label><?php esc_html_e('ID', 'paid-memberships-pro' );?>:</label></th>
346
  <td>
347
+ <?php echo esc_html( $level->id ); ?>
348
  </td>
349
  </tr>
350
 
351
  <tr>
352
+ <th scope="row" valign="top"><label for="name"><?php esc_html_e('Name', 'paid-memberships-pro' );?>:</label></th>
353
  <td><input name="name" type="text" value="<?php echo esc_attr($level->name);?>" class="regular-text" /></td>
354
  </tr>
355
 
356
  <tr>
357
+ <th scope="row" valign="top"><label for="description"><?php esc_html_e('Description', 'paid-memberships-pro' );?>:</label></th>
358
  <td>
359
  <div id="poststuff" class="pmpro_description">
360
  <?php
372
  </tr>
373
 
374
  <tr>
375
+ <th scope="row" valign="top"><label for="confirmation"><?php esc_html_e('Confirmation Message', 'paid-memberships-pro' );?>:</label></th>
376
  <td>
377
  <div class="pmpro_confirmation">
378
  <?php
386
  }
387
  ?>
388
  </div>
389
+ <input id="confirmation_in_email" name="confirmation_in_email" type="checkbox" value="yes" <?php checked( $confirmation_in_email, 1); ?> /> <label for="confirmation_in_email"><?php esc_html_e('Check to include this message in the membership confirmation email.', 'paid-memberships-pro' );?></label>
390
  </td>
391
  </tr>
392
  </tbody>
393
  </table>
394
  <hr />
395
+ <h2 class="title"><?php esc_html_e('Billing Details', 'paid-memberships-pro' );?></h2>
396
  <table class="form-table">
397
  <tbody>
398
  <tr>
399
+ <th scope="row" valign="top"><label for="initial_payment"><?php esc_html_e('Initial Payment', 'paid-memberships-pro' );?>:</label></th>
400
  <td>
401
  <?php
402
  if(pmpro_getCurrencyPosition() == "left")
407
  if(pmpro_getCurrencyPosition() == "right")
408
  echo $pmpro_currency_symbol;
409
  ?>
410
+ <p class="description"><?php esc_html_e('The initial amount collected at registration.', 'paid-memberships-pro' );?></p>
411
  </td>
412
  </tr>
413
 
414
  <tr>
415
+ <th scope="row" valign="top"><label><?php esc_html_e('Recurring Subscription', 'paid-memberships-pro' );?>:</label></th>
416
+ <td><input id="recurring" name="recurring" type="checkbox" value="yes" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#recurring').is(':checked')) { jQuery('.recurring_info').show(); if(jQuery('#custom_trial').is(':checked')) {jQuery('.trial_info').show();} else {jQuery('.trial_info').hide();} } else { jQuery('.recurring_info').hide();}" /> <label for="recurring"><?php esc_html_e('Check if this level has a recurring subscription payment.', 'paid-memberships-pro' );?></label></td>
417
  </tr>
418
 
419
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
420
+ <th scope="row" valign="top"><label for="billing_amount"><?php esc_html_e('Billing Amount', 'paid-memberships-pro' );?>:</label></th>
421
  <td>
422
  <?php
423
  if(pmpro_getCurrencyPosition() == "left")
443
  <p class="description">
444
  <?php _e('The amount to be billed one cycle after the initial payment.', 'paid-memberships-pro' );?>
445
  <?php if($gateway == "braintree") { ?>
446
+ <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Braintree integration currently only supports billing periods of "Month" or "Year".', 'paid-memberships-pro' );?></strong>
447
  <?php } elseif($gateway == "stripe") { ?>
448
+ <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Stripe integration does not allow billing periods longer than 1 year.', 'paid-memberships-pro' );?></strong></p>
449
  <?php }?>
450
  </p>
451
  <?php if($gateway == "braintree" && $edit < 0) { ?>
452
+ <p class="pmpro_message"><strong><?php esc_html_e('Note', 'paid-memberships-pro' );?>:</strong> <?php echo wp_kses_post( __( 'After saving this level, make note of the ID and create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to <em>pmpro_#</em>, where # is the level ID.', 'paid-memberships-pro' ) );?></p>
453
  <?php } elseif($gateway == "braintree") {
454
  $has_bt_plan = PMProGateway_braintree::checkLevelForPlan( $level->id );
455
  ?>
456
  <p class="pmpro_message <?php if ( ! $has_bt_plan ) {?>pmpro_error<?php } ?>">
457
+ <strong><?php esc_html_e('Note', 'paid-memberships-pro' );?>:</strong> <?php echo esc_html( sprintf( __('You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to %s.', 'paid-memberships-pro' ), PMProGateway_braintree::get_plan_id( $level->id ) ) ); ?></p>
458
  <?php } ?>
459
  </td>
460
  </tr>
461
 
462
  <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
463
+ <th scope="row" valign="top"><label for="billing_limit"><?php esc_html_e('Billing Cycle Limit', 'paid-memberships-pro' );?>:</label></th>
464
  <td>
465
+ <input name="billing_limit" type="text" value="<?php echo esc_attr( $level->billing_limit ) ?>" class="small-text" />
466
  <p class="description">
467
  <?php _e('The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite.', 'paid-memberships-pro' );?>
468
  <?php if ( ( $gateway == "stripe" ) && ! function_exists( 'pmprosbl_plugin_row_meta' ) ) { ?>
469
+ <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Stripe integration currently does not support billing limits. You can still set an expiration date below.', 'paid-memberships-pro' );?></strong>
470
  <?php if ( ! function_exists( 'pmprosd_pmpro_membership_level_after_other_settings' ) ) {
471
  $allowed_sbl_html = array (
472
  'a' => array (
473
  'href' => array(),
474
  'target' => array(),
475
  'title' => array(),
476
+ 'rel' => array(),
477
  ),
478
  );
479
+ echo '<br />' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the <a href="%s" title="Paid Memberships Pro - Stripe Billing Limits Add On" target="_blank" rel="nofollow noopener">Stripe Billing Limits Add On</a>.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . '</em></td></tr>';
480
  } ?>
481
  <?php } ?>
482
  </p>
484
  </tr>
485
 
486
  <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
487
+ <th scope="row" valign="top"><label><?php esc_html_e('Custom Trial', 'paid-memberships-pro' );?>:</label></th>
488
  <td>
489
+ <input id="custom_trial" name="custom_trial" type="checkbox" value="yes" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="jQuery('.trial_info').toggle();" /> <label for="custom_trial"><?php esc_html_e('Check to add a custom trial period.', 'paid-memberships-pro' );?></label>
490
 
491
  <?php if($gateway == "twocheckout") { ?>
492
+ <p class="description"><strong <?php if(!empty($pmpro_twocheckout_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount.', 'paid-memberships-pro' );?></strong></p>
493
  <?php } ?>
494
  </td>
495
  </tr>
500
  'href' => array(),
501
  'target' => array(),
502
  'title' => array(),
503
+ 'rel' => array(),
504
  ),
505
  );
506
+ echo '<tr><th>&nbsp;</th><td><p class="description">' . sprintf( wp_kses( __( 'Optional: Allow more customizable trial periods and renewal dates using the <a href="%s" title="Paid Memberships Pro - Subscription Delays Add On" target="_blank" rel="nofollow noopener">Subscription Delays Add On</a>.', 'paid-memberships-pro' ), $allowed_sd_html ), 'https://www.paidmembershipspro.com/add-ons/subscription-delays/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=subscription-delays' ) . '</p></td></tr>';
507
  } ?>
508
 
509
  <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
510
+ <th scope="row" valign="top"><label for="trial_amount"><?php esc_html_e('Trial Billing Amount', 'paid-memberships-pro' );?>:</label></th>
511
  <td>
512
  <?php
513
  if(pmpro_getCurrencyPosition() == "left")
522
  <input name="trial_limit" type="text" value="<?php echo esc_attr($level->trial_limit);?>" class="small-text" />
523
  <?php _e('subscription payments', 'paid-memberships-pro' );?>.
524
  <?php if($gateway == "stripe") { ?>
525
+ <p class="description"><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Stripe integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
526
  <?php } elseif($gateway == "braintree") { ?>
527
+ <p class="description"><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Braintree integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
528
  <?php } elseif($gateway == "payflowpro") { ?>
529
+ <p class="description"><strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php esc_html_e('Payflow integration currently does not support trial amounts greater than $0.', 'paid-memberships-pro' );?></strong></p>
530
  <?php } ?>
531
  </td>
532
  </tr>
551
  <table class="form-table">
552
  <tbody>
553
  <tr>
554
+ <th scope="row" valign="top"><label><?php esc_html_e('Disable New Signups', 'paid-memberships-pro' );?>:</label></th>
555
+ <td><input id="disable_signups" name="disable_signups" type="checkbox" value="yes" <?php if($level->id && !$level->allow_signups) { ?>checked="checked"<?php } ?> /> <label for="disable_signups"><?php esc_html_e('Check to hide this level from the membership levels page and disable registration.', 'paid-memberships-pro' );?></label></td>
556
  </tr>
557
 
558
  <tr>
559
+ <th scope="row" valign="top"><label><?php esc_html_e('Membership Expiration', 'paid-memberships-pro' );?>:</label></th>
560
+ <td><input id="expiration" name="expiration" type="checkbox" value="yes" <?php if(pmpro_isLevelExpiring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery('#expiration').is(':checked')) { jQuery('.expiration_info').show(); } else { jQuery('.expiration_info').hide();}" /> <label for="expiration"><?php esc_html_e('Check this to set when membership access expires.', 'paid-memberships-pro' );?></label></a></td>
561
  </tr>
562
 
563
  <?php if ( ! function_exists( 'pmprosed_pmpro_membership_level_after_other_settings' ) ) {
566
  'href' => array(),
567
  'target' => array(),
568
  'title' => array(),
569
+ 'rel' => array(),
570
  ),
571
  );
572
+ echo '<tr><th>&nbsp;</th><td><p class="description">' . sprintf( wp_kses( __( 'Optional: Allow more customizable expiration dates using the <a href="%s" title="Paid Memberships Pro - Set Expiration Date Add On" target="_blank" rel="nofollow noopener">Set Expiration Date Add On</a>.', 'paid-memberships-pro' ), $allowed_sed_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-expiration-date/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=pmpro-expiration-date' ) . '</p></td></tr>';
573
  } ?>
574
 
575
  <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
576
+ <th scope="row" valign="top"><label for="billing_amount"><?php esc_html_e('Expires In', 'paid-memberships-pro' );?>:</label></th>
577
  <td>
578
  <input id="expiration_number" name="expiration_number" type="text" value="<?php echo esc_attr($level->expiration_number);?>" class="small-text" />
579
  <select id="expiration_period" name="expiration_period">
584
  }
585
  ?>
586
  </select>
587
+ <p class="description"><?php esc_html_e('Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires.', 'paid-memberships-pro' );?></p>
588
 
589
  <div id="pmpro_expiration_warning" style="display: none;" class="notice error inline">
590
+ <p><?php printf( __( 'WARNING: This level is set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a certain number of payments. For more information, <a target="_blank" rel="nofollow noopener" href="%s">see our post here</a>.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ); ?></p>
591
  </div>
592
  <script>
593
  jQuery(document).ready(function() {
652
  <table class="form-table">
653
  <tbody>
654
  <tr class="membership_categories">
655
+ <th scope="row" valign="top"><label><?php esc_html_e('Categories', 'paid-memberships-pro' );?>:</label></th>
656
  <td>
657
  <?php pmpro_listCategories(0, $level->categories); ?>
658
  </td>
672
  ?>
673
 
674
  <p class="submit topborder">
675
+ <input name="save" type="submit" class="button button-primary" value="<?php esc_attr_e('Save Level', 'paid-memberships-pro' ); ?>" />
676
+ <input name="cancel" type="button" class="button" value="<?php esc_attr_e('Cancel', 'paid-memberships-pro' ); ?>" onclick="location.href='<?php echo esc_url( add_query_arg( 'page', 'pmpro-membershiplevels' , admin_url( '/admin.php') ) ); ?>';" />
677
  </p>
678
  </form>
679
  </div>
773
  <?php
774
  }
775
  ?>
776
+ <hr class="wp-header-end">
777
  <?php if( empty( $s ) && count( $reordered_levels ) === 0 ) { ?>
778
  <div class="pmpro-new-install">
779
+ <h2><?php esc_html_e( 'No Membership Levels Found', 'paid-memberships-pro' ); ?></h2>
780
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-membershiplevels&edit=-1' ) ); ?>" class="button-primary"><?php esc_html_e( 'Create a Membership Level', 'paid-memberships-pro' ); ?></a>
781
+ <a href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/step-1-add-new-membership-level/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=documentation&utm_content=step-1-add-new-membership-level" target="_blank" rel="noopener noreferrer" class="button"><?php esc_html_e( 'Video: Membership Levels', 'paid-memberships-pro' ); ?></a>
782
  </div> <!-- end pmpro-new-install -->
783
  <?php } else { ?>
 
784
  <form id="posts-filter" method="get" action="">
785
  <p class="search-box">
786
+ <label class="screen-reader-text" for="post-search-input"><?php esc_html_e('Search Levels', 'paid-memberships-pro' );?>:</label>
787
  <input type="hidden" name="page" value="pmpro-membershiplevels" />
788
  <input id="post-search-input" type="text" value="<?php echo esc_attr($s); ?>" name="s" size="30" />
789
+ <input class="button" type="submit" value="<?php esc_attr_e('Search Levels', 'paid-memberships-pro' );?>" id="search-submit" />
790
  </p>
791
  </form>
792
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Membership Levels', 'paid-memberships-pro' ); ?></h1>
793
+ <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => -1 ), admin_url( 'admin.php' ) ) ); ?>" class="page-title-action"><?php esc_html_e( 'Add New Level', 'paid-memberships-pro' ); ?></a>
 
 
794
  <?php if(empty($_REQUEST['s']) && count($reordered_levels) > 1) { ?>
795
+ <p><?php esc_html_e('Drag and drop membership levels to reorder them on the Levels page.', 'paid-memberships-pro' ); ?></p>
796
  <?php } ?>
797
 
798
  <?php
802
  <table class="widefat membership-levels">
803
  <thead>
804
  <tr>
805
+ <th><?php esc_html_e('ID', 'paid-memberships-pro' );?></th>
806
+ <th><?php esc_html_e('Name', 'paid-memberships-pro' );?></th>
807
+ <th><?php esc_html_e('Billing Details', 'paid-memberships-pro' );?></th>
808
+ <th><?php esc_html_e('Expiration', 'paid-memberships-pro' );?></th>
809
+ <th><?php esc_html_e('Allow Signups', 'paid-memberships-pro' );?></th>
810
  <?php do_action( 'pmpro_membership_levels_table_extra_cols_header', $reordered_levels ); ?>
811
  </tr>
812
  </thead>
814
  <?php if ( !empty( $s ) && empty( $reordered_levels ) ) { ?>
815
  <tr class="alternate">
816
  <td colspan="5">
817
+ <?php esc_html_e( 'No Membership Levels Found', 'paid-memberships-pro' ); ?>
818
  </td>
819
  </tr>
820
  <?php } ?>
826
  <tr class="<?php if($count++ % 2 == 1) { ?>alternate<?php } ?> <?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibility($level) || !pmpro_checkLevelForBraintreeCompatibility($level) || !pmpro_checkLevelForPayflowCompatibility($level) || !pmpro_checkLevelForTwoCheckoutCompatibility($level)) { ?>pmpro_error<?php } ?>">
827
  <td><?php echo $level->id?></td>
828
  <td class="level_name has-row-actions">
829
+ <span class="level-name"><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-membershiplevels', 'edit' => $level->id ), admin_url( 'admin.php' ) ) ); ?>"><?php echo esc_html( $level->name ); ?></a></span>
830
  <div class="row-actions">
831
  <?php
832
  $delete_text = esc_html(
931
  <td><?php
932
  if($level->allow_signups) {
933
  if ( ! empty( $pmpro_pages['checkout'] ) ) {
934
+ ?><a target="_blank" href="<?php echo esc_url( add_query_arg( 'level', $level->id, pmpro_url("checkout") ) );?>"><?php esc_html_e('Yes', 'paid-memberships-pro' );?></a><?php
935
  } else {
936
  _e('Yes', 'paid-memberships-pro' );
937
  }
adminpages/memberslist-csv.php CHANGED
@@ -163,9 +163,15 @@
163
  $search = " AND $key_column LIKE '%" . esc_sql( $s ) . "%' ";
164
  } elseif ( $search_key === 'discount' || $search_key === 'discount_code' || $search_key === 'dc' ) {
165
  $user_ids = $wpdb->get_col( "SELECT dcu.user_id FROM $wpdb->pmpro_discount_codes_uses dcu LEFT JOIN $wpdb->pmpro_discount_codes dc ON dcu.code_id = dc.id WHERE dc.code = '" . esc_sql( $s ) . "'" );
 
 
 
166
  $search = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
167
  } else {
168
  $user_ids = $wpdb->get_col( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '" . esc_sql( $search_key ) . "' AND meta_value lIKE '%" . esc_sql( $s ) . "%'" );
 
 
 
169
  $search = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
170
  }
171
  } else {
163
  $search = " AND $key_column LIKE '%" . esc_sql( $s ) . "%' ";
164
  } elseif ( $search_key === 'discount' || $search_key === 'discount_code' || $search_key === 'dc' ) {
165
  $user_ids = $wpdb->get_col( "SELECT dcu.user_id FROM $wpdb->pmpro_discount_codes_uses dcu LEFT JOIN $wpdb->pmpro_discount_codes dc ON dcu.code_id = dc.id WHERE dc.code = '" . esc_sql( $s ) . "'" );
166
+ if ( empty( $user_ids ) ) {
167
+ $user_ids = array(0); // Avoid warning, but ensure 0 results.
168
+ }
169
  $search = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
170
  } else {
171
  $user_ids = $wpdb->get_col( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '" . esc_sql( $search_key ) . "' AND meta_value lIKE '%" . esc_sql( $s ) . "%'" );
172
+ if ( empty( $user_ids ) ) {
173
+ $user_ids = array(0); // Avoid warning, but ensure 0 results.
174
+ }
175
  $search = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
176
  }
177
  } else {
adminpages/memberslist.php CHANGED
@@ -17,10 +17,9 @@ if ( isset( $_REQUEST['l'] ) ) {
17
 
18
  // Render the List Table.
19
  ?>
 
20
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Members List', 'paid-memberships-pro' ); ?></h1>
21
  <a target="_blank" href="<?php echo esc_url( $csv_export_link ); ?>" class="page-title-action"><?php esc_html_e( 'Export to CSV', 'paid-memberships-pro' ); ?></a>
22
- <hr class="wp-header-end">
23
-
24
  <?php do_action( 'pmpro_memberslist_before_table' ); ?>
25
  <form id="member-list-form" method="get">
26
  <input type="hidden" name="page" value="pmpro-memberslist" />
17
 
18
  // Render the List Table.
19
  ?>
20
+ <hr class="wp-header-end">
21
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Members List', 'paid-memberships-pro' ); ?></h1>
22
  <a target="_blank" href="<?php echo esc_url( $csv_export_link ); ?>" class="page-title-action"><?php esc_html_e( 'Export to CSV', 'paid-memberships-pro' ); ?></a>
 
 
23
  <?php do_action( 'pmpro_memberslist_before_table' ); ?>
24
  <form id="member-list-form" method="get">
25
  <input type="hidden" name="page" value="pmpro-memberslist" />
adminpages/orders.php CHANGED
@@ -162,9 +162,10 @@ if ( ! empty( $_REQUEST['delete'] ) ) {
162
  $nonceokay = false;
163
  }
164
 
165
- $dorder = new MemberOrder( intval( $_REQUEST['delete'] ) );
 
166
  if ( $nonceokay && $dorder->deleteMe() ) {
167
- $pmpro_msg = __( 'Order deleted successfully.', 'paid-memberships-pro' );
168
  $pmpro_msgt = 'success';
169
  } else {
170
  $pmpro_msg = __( 'Error deleting order.', 'paid-memberships-pro' );
@@ -172,6 +173,31 @@ if ( ! empty( $_REQUEST['delete'] ) ) {
172
  }
173
  }
174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  $thisyear = date( 'Y', $now );
176
 
177
  // this array stores fields that should be read only
@@ -289,7 +315,8 @@ if ( ! empty( $_REQUEST['save'] ) ) {
289
  $day = intval( $_POST['ts_day'] );
290
  $hour = intval( $_POST['ts_hour'] );
291
  $minute = intval( $_POST['ts_minute'] );
292
- $order->timestamp = $date = get_gmt_from_date( $year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':00' , 'U' );;
 
293
  }
294
 
295
  // affiliate stuff
@@ -385,14 +412,47 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
385
 
386
  <?php if ( ! empty( $order ) ) { ?>
387
 
388
- <?php if ( ! empty( $order->id ) ) { ?>
389
- <h1 class="wp-heading-inline"><?php esc_html_e( 'Order', 'paid-memberships-pro' ); ?> #<?php echo esc_html( $order->id ); ?>: <?php echo esc_html( $order->code ); ?></h1>
390
- <a title="<?php esc_attr_e( 'Print', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( add_query_arg( array( 'action' => 'pmpro_orders_print_view', 'order' => $order->id ), admin_url( 'admin-ajax.php' ) ) ); ?>" class="page-title-action" target="_blank" ><?php esc_html_e( 'Print', 'paid-memberships-pro' ); ?></a>
391
- <a title="<?php esc_attr_e( 'Email', 'paid-memberships-pro' ); ?>" href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link page-title-action" data-order="<?php echo esc_html( $order->id ); ?>"><?php esc_html_e( 'Email', 'paid-memberships-pro' ); ?></a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
392
  <?php } else { ?>
393
  <h1 class="wp-heading-inline"><?php esc_html_e( 'New Order', 'paid-memberships-pro' ); ?></h1>
394
  <?php } ?>
395
- <hr class="wp-header-end">
396
 
397
  <?php if ( ! empty( $pmpro_msg ) ) { ?>
398
  <div id="message" class="
@@ -412,42 +472,77 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
412
  <table class="form-table">
413
  <tbody>
414
  <tr>
415
- <th scope="row" valign="top"><label>ID:</label></th>
416
- <td>
417
- <?php
418
- if ( ! empty( $order->id ) ) {
419
- echo esc_html( $order->id );
420
- } else {
421
- echo '<p class="description">' . __( 'This will be generated when you save.', 'paid-memberships-pro' ) . '</p>';
422
- }
423
- ?>
424
- </td>
425
- </tr>
426
-
427
- <tr>
428
- <th scope="row" valign="top"><label for="code"><?php _e( 'Code', 'paid-memberships-pro' ); ?>:</label></th>
429
  <td>
430
  <?php
431
  if ( in_array( 'code', $read_only_fields ) ) {
432
  echo esc_html( $order->code );
433
  } else { ?>
434
- <input id="code" name="code" type="text" value="<?php echo esc_attr( $order->code ); ?>" class="regular-text" />
435
  <?php
436
  }
437
  ?>
 
438
  <?php if ( $order_id < 0 ) { ?>
439
  <p class="description"><?php esc_html_e( 'Randomly generated for you.', 'paid-memberships-pro' ); ?></p>
440
  <?php } ?>
441
  </td>
442
  </tr>
443
  <tr>
444
- <th scope="row" valign="top"><label for="user_id"><?php _e( 'User ID', 'paid-memberships-pro' ); ?>:</label></th>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  <td>
446
  <?php
447
  if ( in_array( 'user_id', $read_only_fields ) && $order_id > 0 ) {
448
  echo esc_html( $order->user_id );
449
  } else { ?>
450
- <input id="user_id" name="user_id" type="text" value="<?php echo esc_attr( $order->user_id ); ?>" class="regular-text" />
451
  <?php
452
  }
453
  ?>
@@ -460,12 +555,23 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
460
  if ( in_array( 'membership_id', $read_only_fields ) && $order_id > 0 ) {
461
  echo esc_html( $order->membership_id );
462
  } else { ?>
463
- <input id="membership_id" name="membership_id" type="text" value="<?php echo esc_attr( $order->membership_id ); ?>" class="regular-text" />
464
  <?php
465
  }
466
  ?>
467
  </td>
468
  </tr>
 
 
 
 
 
 
 
 
 
 
 
469
  <tr>
470
  <th scope="row" valign="top"><label for="billing_name"><?php esc_html_e( 'Billing Name', 'paid-memberships-pro' ); ?>:</label>
471
  </th>
@@ -555,6 +661,22 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
555
  <?php } ?>
556
  </td>
557
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
558
  <?php
559
  if ( $order_id > 0 ) {
560
  $order->getDiscountCode();
@@ -594,7 +716,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
594
  </tr>
595
  <?php } ?>
596
  <tr>
597
- <th scope="row" valign="top"><label for="subtotal"><?php _e( 'Sub Total', 'paid-memberships-pro' ); ?>:</label></th>
598
  <td>
599
  <?php
600
  if ( in_array( 'subtotal', $read_only_fields ) && $order_id > 0 ) {
@@ -711,23 +833,15 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
711
  </tr>
712
 
713
  <?php
714
- } else {
715
- ?>
716
- <tr>
717
- <th scope="row" valign="top"><label
718
- for="expirationmonth"><?php esc_html_e( 'Expiration Month', 'paid-memberships-pro' ); ?>:</label></th>
719
- <td>
720
- <input id="expirationmonth" name="expirationmonth" type="text" size="10"
721
- value="<?php echo esc_attr( $order->expirationmonth ); ?>"/>
722
- <span class="description">MM</span>
723
- </td>
724
- </tr>
725
  <tr>
726
- <th scope="row" valign="top"><label for="expirationyear"><?php esc_html_e( 'Expiration Year', 'paid-memberships-pro' ); ?>:</label></th>
727
  <td>
 
 
728
  <input id="expirationyear" name="expirationyear" type="text" size="10"
729
  value="<?php echo esc_attr( $order->expirationyear ); ?>"/>
730
- <span class="description">YYYY</span>
731
  </td>
732
  </tr>
733
  <?php } ?>
@@ -736,7 +850,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
736
  <td>
737
  <?php
738
  if ( in_array( 'status', $read_only_fields ) && $order_id > 0 ) {
739
- echo esc_html( $order->status );
740
  } else { ?>
741
  <?php
742
  $statuses = pmpro_getOrderStatuses();
@@ -752,7 +866,12 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
752
  ?>
753
  </td>
754
  </tr>
755
-
 
 
 
 
 
756
  <tr>
757
  <th scope="row" valign="top"><label for="gateway"><?php esc_html_e( 'Gateway', 'paid-memberships-pro' ); ?>:</label></th>
758
  <td>
@@ -794,7 +913,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
794
 
795
  <tr>
796
  <th scope="row" valign="top"><label
797
- for="payment_transaction_id"><?php _e( 'Payment Transaction ID', 'paid-memberships-pro' ); ?>:</label></th>
798
  <td>
799
  <?php
800
  if ( in_array( 'payment_transaction_id', $read_only_fields ) && $order_id > 0 ) {
@@ -814,56 +933,21 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
814
  <?php
815
  if ( in_array( 'subscription_transaction_id', $read_only_fields ) && $order_id > 0 ) {
816
  echo $order->subscription_transaction_id;
817
- } else {
818
- ?>
819
- <input id="subscription_transaction_id" name="subscription_transaction_id" type="text" size="50"
820
- value="<?php echo esc_attr( $order->subscription_transaction_id ); ?>"/>
 
821
  <?php } ?>
822
  <p class="description"><?php esc_html_e( 'Generated by the gateway. Useful to cross reference subscriptions.', 'paid-memberships-pro' ); ?></p>
823
  </td>
824
  </tr>
825
-
826
- <tr>
827
- <th scope="row" valign="top"><label for="ts_month"><?php esc_html_e( 'Date', 'paid-memberships-pro' ); ?>:</label></th>
828
- <td>
829
- <?php
830
- if ( in_array( 'timestamp', $read_only_fields ) && $order_id > 0 ) {
831
- echo esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $order->getTimestamp() ) );
832
- } else {
833
- // set up date vars
834
- if ( ! empty( $order->timestamp ) ) {
835
- $timestamp = $order->getTimestamp();
836
- } else {
837
- $timestamp = current_time( 'timestamp' );
838
- }
839
-
840
- $year = date( 'Y', $timestamp );
841
- $month = date( 'n', $timestamp );
842
- $day = date( 'j', $timestamp );
843
- $hour = date( 'H', $timestamp );
844
- $minute = date( 'i', $timestamp );
845
- $second = date( 's', $timestamp );
846
- ?>
847
- <select id="ts_month" name="ts_month">
848
- <?php
849
- for ( $i = 1; $i < 13; $i ++ ) {
850
- ?>
851
- <option value="<?php echo esc_attr( $i ); ?>" <?php selected( $i, $month ); ?>>
852
- <?php echo esc_html( date_i18n( 'F', mktime( 0, 0, 0, $i, 2 ) ) ); ?>
853
- </option>
854
- <?php
855
- }
856
- ?>
857
- </select>
858
- <input name="ts_day" type="text" size="2" value="<?php echo esc_attr( $day ); ?>"/>
859
- <input name="ts_year" type="text" size="4" value="<?php echo esc_attr( $year ); ?>"/>
860
- <?php esc_html_e( 'at', 'paid-memberships-pro' ); ?>
861
- <input name="ts_hour" type="text" size="2" value="<?php echo esc_attr( $hour ); ?>"/> :
862
- <input name="ts_minute" type="text" size="2" value="<?php echo esc_attr( $minute ); ?>"/>
863
- <?php } ?>
864
- </td>
865
- </tr>
866
-
867
  <?php
868
  $affiliates = apply_filters( 'pmpro_orders_show_affiliate_ids', false );
869
  if ( ! empty( $affiliates ) ) {
@@ -968,7 +1052,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
968
  <form id="posts-filter" method="get" action="">
969
 
970
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Orders', 'paid-memberships-pro' ); ?></h1>
971
- <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-orders', 'order' => -1 ), admin_url( 'admin.php' ) ) ); ?>" class="page-title-action"><?php esc_html_e( 'Add New Order', 'paid-memberships-pro' ); ?></a>
972
 
973
  <?php
974
  // build the export URL
@@ -989,7 +1073,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
989
  );
990
  $export_url = add_query_arg( $url_params, $export_url );
991
  ?>
992
- <a target="_blank" href="<?php echo esc_url( $export_url ); ?>" class="page-title-action"><?php esc_html_e( 'Export to CSV', 'paid-memberships-pro' ); ?></a>
993
 
994
  <hr class="wp-header-end">
995
 
@@ -1006,114 +1090,117 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1006
  "><p><?php echo $pmpro_msg; ?></p></div>
1007
  <?php } ?>
1008
 
 
 
 
 
 
 
1009
 
1010
- <ul class="subsubsub">
1011
- <li>
1012
- <?php esc_html_e( 'Show', 'paid-memberships-pro' ); ?>
1013
- <select id="filter" name="filter">
1014
- <option value="all" <?php selected( $filter, 'all' ); ?>><?php esc_html_e( 'All', 'paid-memberships-pro' ); ?></option>
1015
- <option
1016
- value="within-a-date-range" <?php selected( $filter, 'within-a-date-range' ); ?>><?php esc_html_e( 'Within a Date Range', 'paid-memberships-pro' ); ?></option>
1017
- <option
1018
- value="predefined-date-range" <?php selected( $filter, 'predefined-date-range' ); ?>><?php esc_html_e( 'Predefined Date Range', 'paid-memberships-pro' ); ?></option>
1019
- <option
1020
- value="within-a-level" <?php selected( $filter, 'within-a-level' ); ?>><?php esc_html_e( 'Within a Level', 'paid-memberships-pro' ); ?></option>
1021
- <option
1022
- value="with-discount-code" <?php selected( $filter, 'with-discount-code' ); ?>><?php esc_html_e( 'With a Discount Code', 'paid-memberships-pro' ); ?></option>
1023
- <option
1024
- value="within-a-status" <?php selected( $filter, 'within-a-status' ); ?>><?php esc_html_e( 'Within a Status', 'paid-memberships-pro' ); ?></option>
1025
- <option
1026
- value="only-paid" <?php selected( $filter, 'only-paid' ); ?>><?php esc_html_e( 'Only Paid Orders', 'paid-memberships-pro' ); ?></option>
1027
- <option
1028
- value="only-free" <?php selected( $filter, 'only-free' ); ?>><?php esc_html_e( 'Only Free Orders', 'paid-memberships-pro' ); ?></option>
1029
-
1030
- <?php $custom_filters = apply_filters( 'pmpro_admin_orders_filters', array() ); ?>
1031
- <?php foreach( $custom_filters as $value => $name ) { ?>
1032
- <option value="<?php echo esc_attr( $value ); ?>" <?php selected( $filter, $value ); ?>><?php esc_html_e( $name ); ?></option>
1033
- <?php } ?>
1034
- </select>
1035
 
1036
- <span id="from"><?php esc_html_e( 'From', 'paid-memberships-pro' ); ?></span>
1037
 
1038
- <select id="start-month" name="start-month">
1039
- <?php for ( $i = 1; $i < 13; $i ++ ) { ?>
1040
- <option
1041
- value="<?php echo esc_attr( $i ); ?>" <?php selected( $start_month, $i ); ?>><?php echo esc_html( date_i18n( 'F', mktime( 0, 0, 0, $i, 2 ) ) ); ?></option>
1042
- <?php } ?>
1043
- </select>
1044
 
1045
- <input id='start-day' name="start-day" type="text" size="2"
1046
- value="<?php echo esc_attr( $start_day ); ?>"/>
1047
- <input id='start-year' name="start-year" type="text" size="4"
1048
- value="<?php echo esc_attr( $start_year ); ?>"/>
1049
 
1050
 
1051
- <span id="to"><?php esc_html_e( 'To', 'paid-memberships-pro' ); ?></span>
1052
 
1053
- <select id="end-month" name="end-month">
1054
- <?php for ( $i = 1; $i < 13; $i ++ ) { ?>
1055
- <option
1056
- value="<?php echo esc_attr( $i ); ?>" <?php selected( $end_month, $i ); ?>><?php echo esc_html( date_i18n( 'F', mktime( 0, 0, 0, $i, 2 ) ) ); ?></option>
1057
- <?php } ?>
1058
- </select>
1059
 
1060
 
1061
- <input id='end-day' name="end-day" type="text" size="2" value="<?php echo esc_attr( $end_day ); ?>"/>
1062
- <input id='end-year' name="end-year" type="text" size="4" value="<?php echo esc_attr( $end_year ); ?>"/>
1063
 
1064
- <span id="filterby"><?php esc_html_e( 'filter by ', 'paid-memberships-pro' ); ?></span>
1065
 
1066
- <select id="predefined-date" name="predefined-date">
1067
 
1068
- <option
1069
- value="<?php echo 'This Month'; ?>" <?php selected( $predefined_date, 'This Month' ); ?>><?php esc_html_e( 'This Month', 'paid-memberships-pro' ); ?></option>
1070
- <option
1071
- value="<?php echo 'Last Month'; ?>" <?php selected( $predefined_date, 'Last Month' ); ?>><?php esc_html_e( 'Last Month', 'paid-memberships-pro' ); ?></option>
1072
- <option
1073
- value="<?php echo 'This Year'; ?>" <?php selected( $predefined_date, 'This Year' ); ?>><?php esc_html_e( 'This Year', 'paid-memberships-pro' ); ?></option>
1074
- <option
1075
- value="<?php echo 'Last Year'; ?>" <?php selected( $predefined_date, 'Last Year' ); ?>><?php esc_html_e( 'Last Year', 'paid-memberships-pro' ); ?></option>
1076
 
1077
- </select>
1078
 
1079
- <?php
1080
- // Note: only orders belonging to current levels can be filtered. There is no option for orders belonging to deleted levels
1081
- $levels = pmpro_sort_levels_by_order( pmpro_getAllLevels( true, true ) );
1082
- ?>
1083
- <select id="l" name="l">
1084
- <?php foreach ( $levels as $level ) { ?>
1085
- <option
1086
- value="<?php echo esc_attr( $level->id ); ?>" <?php selected( $l, $level->id ); ?>><?php echo esc_html( $level->name ); ?></option>
1087
- <?php } ?>
1088
 
1089
- </select>
1090
 
1091
- <?php
1092
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->pmpro_discount_codes ";
1093
- $sqlQuery .= "ORDER BY id DESC ";
1094
- $codes = $wpdb->get_results($sqlQuery, OBJECT);
1095
- if ( ! empty( $codes ) ) { ?>
1096
- <select id="discount-code" name="discount-code">
1097
- <?php foreach ( $codes as $code ) { ?>
1098
- <option
1099
- value="<?php echo esc_attr( $code->id ); ?>" <?php selected( $discount_code, $code->id ); ?>><?php echo esc_html( $code->code ); ?></option>
1100
- <?php } ?>
1101
- </select>
1102
  <?php } ?>
 
 
1103
 
1104
- <?php
1105
- $statuses = pmpro_getOrderStatuses();
1106
- ?>
1107
- <select id="status" name="status">
1108
- <?php foreach ( $statuses as $the_status ) { ?>
1109
- <option
1110
- value="<?php echo esc_attr( $the_status ); ?>" <?php selected( $the_status, $status ); ?>><?php echo esc_html( $the_status ); ?></option>
1111
- <?php } ?>
1112
- </select>
1113
 
1114
- <input id="submit" class="button" type="submit" value="<?php esc_attr_e( 'Filter', 'paid-memberships-pro' ); ?>"/>
1115
- </li>
1116
- </ul>
1117
 
1118
  <script>
1119
  //update month/year when period dropdown is changed
@@ -1244,13 +1331,6 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1244
 
1245
  </script>
1246
 
1247
- <p class="search-box">
1248
- <label class="hidden" for="post-search-input"><?php esc_html_e( 'Search Orders', 'paid-memberships-pro' ); ?>:</label>
1249
- <input type="hidden" name="page" value="pmpro-orders"/>
1250
- <input id="post-search-input" type="text" value="<?php echo esc_attr( wp_unslash( $s ) ); ?>" name="s"/>
1251
- <input class="button" type="submit" value="<?php esc_attr_e( 'Search Orders', 'paid-memberships-pro' ); ?>"/>
1252
- </p>
1253
-
1254
  <?php
1255
  if ( $s ) {
1256
  $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS o.id FROM $wpdb->pmpro_membership_orders o LEFT JOIN $wpdb->users u ON o.user_id = u.ID LEFT JOIN $wpdb->pmpro_membership_levels l ON o.membership_id = l.id ";
@@ -1321,44 +1401,54 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1321
 
1322
  if ( $order_ids ) {
1323
  ?>
1324
- <p class="clear"><?php printf( __( '%d orders found.', 'paid-memberships-pro' ), $totalrows ); ?></span></p>
 
 
1325
  <?php
1326
  }
 
 
 
 
 
 
 
 
 
 
1327
  ?>
1328
- <table class="widefat">
 
 
 
1329
  <thead>
1330
  <tr class="thead">
1331
- <th><?php esc_html_e( 'ID', 'paid-memberships-pro' ); ?></th>
1332
- <th><?php esc_html_e( 'Code', 'paid-memberships-pro' ); ?></th>
1333
- <th><?php esc_html_e( 'User', 'paid-memberships-pro' ); ?></th>
1334
  <?php do_action( 'pmpro_orders_extra_cols_header', $order_ids ); ?>
1335
- <th><?php esc_html_e( 'Level', 'paid-memberships-pro' ); ?></th>
1336
- <th><?php esc_html_e( 'Total', 'paid-memberships-pro' ); ?></th>
1337
- <th><?php esc_html_e( 'Payment', 'paid-memberships-pro' ); ?></th>
1338
- <th><?php esc_html_e( 'Gateway', 'paid-memberships-pro' ); ?></th>
1339
- <th><?php esc_html_e( 'Transaction IDs', 'paid-memberships-pro' ); ?></th>
1340
- <th><?php esc_html_e( 'Status', 'paid-memberships-pro' ); ?></th>
1341
- <th><?php esc_html_e( 'Date', 'paid-memberships-pro' ); ?></th>
1342
- <th><?php esc_html_e( 'Discount Code', 'paid-memberships-pro' );?></th>
 
 
1343
  </tr>
1344
  </thead>
1345
  <tbody id="orders" class="list:order orders-list">
1346
  <?php
1347
- $count = 0;
1348
  foreach ( $order_ids as $order_id ) {
1349
  $order = new MemberOrder();
1350
  $order->nogateway = true;
1351
  $order->getMemberOrderByID( $order_id );
1352
  $order->getUser();
1353
  ?>
1354
- <tr <?php if ( $count ++ % 2 == 0 ) { ?>
1355
- class="alternate"<?php } ?>>
1356
- <td>
1357
- <a href="admin.php?page=pmpro-orders&order=<?php echo esc_attr( $order->id ); ?>"><?php echo esc_html( $order->id ); ?></a>
1358
- </td>
1359
- <td class="order_code column-order_code has-row-actions">
1360
- <a href="admin.php?page=pmpro-orders&order=<?php echo esc_attr( $order->id ); ?>"><?php echo esc_html( $order->code ); ?></a>
1361
- <br />
1362
  <div class="row-actions">
1363
  <?php
1364
  $delete_text = esc_html(
@@ -1382,7 +1472,33 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1382
  'pmpro_orders_nonce'
1383
  );
1384
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1385
  $actions = [
 
 
 
 
 
1386
  'edit' => sprintf(
1387
  '<a title="%1$s" href="%2$s">%3$s</a>',
1388
  esc_attr__( 'Edit', 'paid-memberships-pro' ),
@@ -1412,7 +1528,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1412
  ),
1413
  esc_html__( 'Copy', 'paid-memberships-pro' )
1414
  ),
1415
- 'delete' => sprintf(
1416
  '<a title="%1$s" href="%2$s">%3$s</a>',
1417
  esc_attr__( 'Delete', 'paid-memberships-pro' ),
1418
  'javascript:pmpro_askfirst(\'' . esc_js( $delete_text ) . '\', \'' . esc_js( $delete_nonce_url ) . '\'); void(0);',
@@ -1441,6 +1557,15 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1441
  ),
1442
  ];
1443
 
 
 
 
 
 
 
 
 
 
1444
  /**
1445
  * Filter the extra actions for this user on this order.
1446
  *
@@ -1466,7 +1591,7 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1466
  ?>
1467
  </div>
1468
  </td>
1469
- <td class="username column-username">
1470
  <?php $order->getUser(); ?>
1471
  <?php if ( ! empty( $order->user ) ) { ?>
1472
  <a href="user-edit.php?user_id=<?php echo esc_attr( $order->user->ID ); ?>"><?php echo esc_html( $order->user->user_login ); ?></a><br />
@@ -1478,56 +1603,84 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1478
  <?php } ?>
1479
  </td>
1480
  <?php do_action( 'pmpro_orders_extra_cols_body', $order ); ?>
1481
- <td>
1482
  <?php
1483
  $level = pmpro_getLevel( $order->membership_id );
1484
  if ( ! empty( $level ) ) {
1485
  echo esc_html( $level->name );
1486
  } elseif ( $order->membership_id > 0 ) { ?>
1487
  [<?php esc_html_e( 'deleted', 'paid-memberships-pro' ); ?>]
1488
- <?php } else { ?>
1489
- [<?php esc_html_e( 'none', 'paid-memberships-pro' ); ?>]
1490
- <?php }
1491
  ?>
1492
  </td>
1493
- <td><?php echo pmpro_escape_price( pmpro_formatPrice( $order->total ) ); ?></td>
1494
- <td>
1495
- <?php
1496
- if ( ! empty( $order->payment_type ) ) {
1497
- echo esc_html( $order->payment_type ) . '<br />';
1498
- }
1499
- ?>
1500
- <?php if ( ! empty( $order->accountnumber ) ) { ?>
1501
- <?php echo esc_html( $order->cardtype ); ?>: x<?php echo esc_html( last4( $order->accountnumber ) ); ?><br/>
1502
- <?php } ?>
1503
- <?php if ( ! empty( $order->billing->name ) ) { ?>
1504
- <?php echo esc_html( $order->billing->name ); ?><br/>
1505
- <?php } ?>
1506
- <?php if ( ! empty( $order->billing->street ) ) { ?>
1507
- <?php echo esc_html( $order->billing->street ); ?><br/>
1508
- <?php if ( $order->billing->city && $order->billing->state ) { ?>
1509
- <?php echo esc_html( $order->billing->city ); ?>, <?php echo esc_html( $order->billing->state ); ?> <?php echo esc_html( $order->billing->zip ); ?>
1510
- <?php
1511
- if ( ! empty( $order->billing->country ) ) {
1512
- echo esc_html( $order->billing->country ); }
1513
- ?>
1514
- <br/>
1515
- <?php } ?>
1516
- <?php } ?>
1517
  <?php
1518
- if ( ! empty( $order->billing->phone ) ) {
1519
- echo esc_html( formatPhone( $order->billing->phone ) );
1520
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1521
  ?>
1522
  </td>
1523
- <td><?php echo $order->gateway; ?>
1524
  <?php
1525
- if ( $order->gateway_environment == 'test' ) {
1526
- echo '(test)';
1527
- }
 
 
 
 
 
 
 
 
 
1528
  ?>
1529
  </td>
1530
- <td>
1531
  <?php esc_html_e( 'Payment', 'paid-memberships-pro' ); ?>:
1532
  <?php
1533
  if ( ! empty( $order->payment_transaction_id ) ) {
@@ -1546,18 +1699,38 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1546
  }
1547
  ?>
1548
  </td>
1549
- <td><?php echo esc_html( $order->status ); if( $order->is_renewal() ){ echo "<br/>(".__( 'renewal', 'paid-memberships-pro' ).")"; } ?></td>
1550
- <td>
1551
- <?php echo esc_html( date_i18n( get_option( 'date_format' ), $order->getTimestamp() ) ); ?><br/>
1552
- <?php echo esc_html( date_i18n( get_option( 'time_format' ), $order->getTimestamp() ) ); ?>
1553
- </td>
1554
- <td>
1555
- <?php if ( $order->getDiscountCode() ) { ?>
1556
- <a title="<?php esc_attr_e('edit', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $order->discount_code->id ), admin_url('admin.php' ) ) ); ?>">
1557
- <?php echo esc_html( $order->discount_code->code ); ?>
1558
- </a>
1559
  <?php } ?>
1560
  </td>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1561
  </tr>
1562
  <?php
1563
  }
@@ -1573,12 +1746,18 @@ if ( function_exists( 'pmpro_add_email_order_modal' ) ) {
1573
  </tbody>
1574
  </table>
1575
  </form>
1576
- <?php
1577
- // add normal args
1578
- $pagination_url = esc_url( add_query_arg( $url_params, admin_url( '/admin.php?page=pmpro-orders' ) ) );
1579
- echo pmpro_getPaginationString( $pn, $totalrows, $limit, 1, $pagination_url, "&limit=$limit&pn=" );
1580
- ?>
1581
-
 
 
 
 
 
 
1582
  <?php } ?>
1583
  <?php
1584
  require_once( dirname( __FILE__ ) . '/admin_footer.php' );
162
  $nonceokay = false;
163
  }
164
 
165
+ $dorder_code = intval( $_REQUEST['delete'] );
166
+ $dorder = new MemberOrder( $dorder_code );
167
  if ( $nonceokay && $dorder->deleteMe() ) {
168
+ $pmpro_msg = sprintf( __( 'Order %s deleted successfully.', 'paid-memberships-pro' ), $dorder_code );
169
  $pmpro_msgt = 'success';
170
  } else {
171
  $pmpro_msg = __( 'Error deleting order.', 'paid-memberships-pro' );
173
  }
174
  }
175
 
176
+ // Refund this order
177
+ if ( ! empty( $_REQUEST['refund'] ) ) {
178
+ // Check nonce for refunding.
179
+ $nonceokay = true;
180
+ if ( empty( $_REQUEST['pmpro_orders_nonce'] ) || ! check_admin_referer( 'refund_order', 'pmpro_orders_nonce' ) ) {
181
+ $nonceokay = false;
182
+ }
183
+
184
+ $rorder = new MemberOrder( (int) $_REQUEST['refund'] );
185
+ if ( $nonceokay && !empty( $rorder ) && pmpro_allowed_refunds( $rorder ) ) {
186
+
187
+ if( pmpro_refund_order( $rorder ) ) {
188
+ $pmpro_msg = __( 'Order refunded successfully.', 'paid-memberships-pro' );
189
+ $pmpro_msgt = 'success';
190
+ } else {
191
+ $pmpro_msg = __( 'Error refunding order. Please check the order notes for more information.', 'paid-memberships-pro' );
192
+ $pmpro_msgt = 'error';
193
+ }
194
+
195
+ } else {
196
+ $pmpro_msg = __( 'Error refunding order. Please check the order notes for more information.', 'paid-memberships-pro' );
197
+ $pmpro_msgt = 'error';
198
+ }
199
+ }
200
+
201
  $thisyear = date( 'Y', $now );
202
 
203
  // this array stores fields that should be read only
315
  $day = intval( $_POST['ts_day'] );
316
  $hour = intval( $_POST['ts_hour'] );
317
  $minute = intval( $_POST['ts_minute'] );
318
+ $date = get_gmt_from_date( $year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':00' , 'U' );
319
+ $order->timestamp = $date; // Passed 'U' to get_gmt_from_date() so that we get a Unix timesamp.
320
  }
321
 
322
  // affiliate stuff
412
 
413
  <?php if ( ! empty( $order ) ) { ?>
414
 
415
+ <?php if ( ! empty( $order->id ) ) {
416
+ $refund_text = esc_html(
417
+ sprintf(
418
+ // translators: %s is the Order Code.
419
+ __( 'Refund order %s at the payment gateway. This action is permanent. The user and admin will receive an email confirmation after the refund is processed. Are you sure you want to refund this order?', 'paid-memberships-pro' ),
420
+ str_replace( "'", '', $order->code )
421
+ )
422
+ );
423
+
424
+ $refund_nonce_url = wp_nonce_url(
425
+ add_query_arg(
426
+ [
427
+ 'page' => 'pmpro-orders',
428
+ 'action' => 'refund_order',
429
+ 'refund' => $order->id,
430
+ 'order' => $order->id
431
+ ],
432
+ admin_url( 'admin.php' )
433
+ ),
434
+ 'refund_order',
435
+ 'pmpro_orders_nonce'
436
+ );
437
+ ?>
438
+ <h1 class="wp-heading-inline"><?php esc_html_e( 'Edit Order', 'paid-memberships-pro' ); ?> ID: <?php echo esc_html( $order->id ); ?></h1>
439
+ <a title="<?php esc_attr_e( 'Print', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( add_query_arg( array( 'action' => 'pmpro_orders_print_view', 'order' => $order->id ), admin_url( 'admin-ajax.php' ) ) ); ?>" target="_blank" class="page-title-action pmpro-has-icon pmpro-has-icon-printer"><?php esc_html_e( 'Print', 'paid-memberships-pro' ); ?></a>
440
+ <a title="<?php esc_attr_e( 'Email', 'paid-memberships-pro' ); ?>" href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link page-title-action pmpro-has-icon pmpro-has-icon-email" data-order="<?php echo esc_html( $order->id ); ?>"><?php esc_html_e( 'Email', 'paid-memberships-pro' ); ?></a>
441
+ <a title="<?php esc_attr_e( 'View', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( pmpro_url("invoice", "?invoice=" . $order->code ) ) ?>" target="_blank" class="page-title-action pmpro-has-icon pmpro-has-icon-admin-users"><?php esc_html_e( 'View', 'paid-memberships-pro' ); ?></a>
442
+ <?php
443
+ if( pmpro_allowed_refunds( $order ) ) {
444
+ printf(
445
+ '<a title="%1$s" href="%2$s" class="page-title-action pmpro-has-icon pmpro-has-icon-image-rotate">%3$s</a>',
446
+ esc_attr__( 'Refund', 'paid-memberships-pro' ),
447
+ esc_js( 'javascript:pmpro_askfirst(' . wp_json_encode( $refund_text ) . ', ' . wp_json_encode( $refund_nonce_url ) . '); void(0);' ),
448
+ esc_html__( 'Refund', 'paid-memberships-pro' )
449
+ );
450
+ }
451
+ ?>
452
+ <hr class="wp-header-end">
453
  <?php } else { ?>
454
  <h1 class="wp-heading-inline"><?php esc_html_e( 'New Order', 'paid-memberships-pro' ); ?></h1>
455
  <?php } ?>
 
456
 
457
  <?php if ( ! empty( $pmpro_msg ) ) { ?>
458
  <div id="message" class="
472
  <table class="form-table">
473
  <tbody>
474
  <tr>
475
+ <th scope="row" valign="top"><label for="code"><?php esc_html_e( 'Code', 'paid-memberships-pro' ); ?>:</label></th>
 
 
 
 
 
 
 
 
 
 
 
 
 
476
  <td>
477
  <?php
478
  if ( in_array( 'code', $read_only_fields ) ) {
479
  echo esc_html( $order->code );
480
  } else { ?>
481
+ <input id="code" name="code" type="text" value="<?php echo esc_attr( $order->code ); ?>" />
482
  <?php
483
  }
484
  ?>
485
+ <p class="description"><?php esc_html_e( 'A randomly generated code that serves as a unique, non-sequential invoice number.', 'paid-memberships-pro' ); ?></p>
486
  <?php if ( $order_id < 0 ) { ?>
487
  <p class="description"><?php esc_html_e( 'Randomly generated for you.', 'paid-memberships-pro' ); ?></p>
488
  <?php } ?>
489
  </td>
490
  </tr>
491
  <tr>
492
+ <th scope="row" valign="top"><label for="ts_month"><?php esc_html_e( 'Date', 'paid-memberships-pro' ); ?>:</label></th>
493
+ <td>
494
+ <?php
495
+ if ( in_array( 'timestamp', $read_only_fields ) && $order_id > 0 ) {
496
+ echo esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $order->getTimestamp() ) );
497
+ } else {
498
+ // set up date vars
499
+ if ( ! empty( $order->timestamp ) ) {
500
+ $timestamp = $order->getTimestamp();
501
+ } else {
502
+ $timestamp = current_time( 'timestamp' );
503
+ }
504
+
505
+ $year = date( 'Y', $timestamp );
506
+ $month = date( 'n', $timestamp );
507
+ $day = date( 'j', $timestamp );
508
+ $hour = date( 'H', $timestamp );
509
+ $minute = date( 'i', $timestamp );
510
+ $second = date( 's', $timestamp );
511
+ ?>
512
+ <select id="ts_month" name="ts_month">
513
+ <?php
514
+ for ( $i = 1; $i < 13; $i ++ ) {
515
+ ?>
516
+ <option value="<?php echo esc_attr( $i ); ?>" <?php selected( $i, $month ); ?>>
517
+ <?php echo esc_html( date_i18n( 'F', mktime( 0, 0, 0, $i, 2 ) ) ); ?>
518
+ </option>
519
+ <?php
520
+ }
521
+ ?>
522
+ </select>
523
+ <input name="ts_day" type="text" size="2" value="<?php echo esc_attr( $day ); ?>"/>
524
+ <input name="ts_year" type="text" size="4" value="<?php echo esc_attr( $year ); ?>"/>
525
+ <?php esc_html_e( 'at', 'paid-memberships-pro' ); ?>
526
+ <input name="ts_hour" type="text" size="2" value="<?php echo esc_attr( $hour ); ?>"/> :
527
+ <input name="ts_minute" type="text" size="2" value="<?php echo esc_attr( $minute ); ?>"/>
528
+ <?php } ?>
529
+ </td>
530
+ </tr>
531
+ </tbody>
532
+ </table>
533
+ <hr />
534
+ <h2><?php esc_html_e( 'Member Information', 'paid-memberships-pro' ); ?></h2>
535
+ <table class="form-table">
536
+ <tbody>
537
+ <tr>
538
+ <tr>
539
+ <th scope="row" valign="top"><label for="user_id"><?php esc_html_e( 'User ID', 'paid-memberships-pro' ); ?>:</label></th>
540
  <td>
541
  <?php
542
  if ( in_array( 'user_id', $read_only_fields ) && $order_id > 0 ) {
543
  echo esc_html( $order->user_id );
544
  } else { ?>
545
+ <input id="user_id" name="user_id" type="text" value="<?php echo esc_attr( $order->user_id ); ?>" size="10" />
546
  <?php
547
  }
548
  ?>
555
  if ( in_array( 'membership_id', $read_only_fields ) && $order_id > 0 ) {
556
  echo esc_html( $order->membership_id );
557
  } else { ?>
558
+ <input id="membership_id" name="membership_id" type="text" value="<?php echo esc_attr( $order->membership_id ); ?>" size="10" />
559
  <?php
560
  }
561
  ?>
562
  </td>
563
  </tr>
564
+ </tbody>
565
+ </table>
566
+ <hr />
567
+ <h2>
568
+ <?php esc_html_e( 'Billing Address', 'paid-memberships-pro' ); ?>
569
+ <?php if ( ! $order->has_billing_address() ) { ?>
570
+ <a href="javascript:void(0);" id="show_billing_action"><?php esc_html_e( 'Show Billing Address Fields', 'paid-memberships-pro' ); ?></a>
571
+ <?php } ?>
572
+ </h2>
573
+ <table id="billing_address_fields" class="form-table"<?php if ( ! $order->has_billing_address() ) { ?> style="display: none;"<?php } ?>>
574
+ <tbody>
575
  <tr>
576
  <th scope="row" valign="top"><label for="billing_name"><?php esc_html_e( 'Billing Name', 'paid-memberships-pro' ); ?>:</label>
577
  </th>
661
  <?php } ?>
662
  </td>
663
  </tr>
664
+ </tbody>
665
+ </table> <!-- end #billing_address_fields -->
666
+ <script>
667
+ // Script to show billing fields if they are empty and hidden by default on this form.
668
+ jQuery(document).ready(function() {
669
+ jQuery('#show_billing_action').click(function() {
670
+ jQuery('#show_billing_action').hide();
671
+ jQuery('#billing_address_fields').show();
672
+ });
673
+ });
674
+ </script>
675
+ <hr />
676
+ <h2><?php esc_html_e( 'Payment Information', 'paid-memberships-pro' ); ?></h2>
677
+ <table class="form-table">
678
+ <tbody>
679
+
680
  <?php
681
  if ( $order_id > 0 ) {
682
  $order->getDiscountCode();
716
  </tr>
717
  <?php } ?>
718
  <tr>
719
+ <th scope="row" valign="top"><label for="subtotal"><?php esc_html_e( 'Sub Total', 'paid-memberships-pro' ); ?>:</label></th>
720
  <td>
721
  <?php
722
  if ( in_array( 'subtotal', $read_only_fields ) && $order_id > 0 ) {
833
  </tr>
834
 
835
  <?php
836
+ } else { ?>
 
 
 
 
 
 
 
 
 
 
837
  <tr>
838
+ <th scope="row" valign="top"><label for="expirationmonth"><?php esc_html_e( 'Expiration', 'paid-memberships-pro' ); ?>:</label></th>
839
  <td>
840
+ <input id="expirationmonth" name="expirationmonth" type="text" size="10"
841
+ value="<?php echo esc_attr( $order->expirationmonth ); ?>"/> /
842
  <input id="expirationyear" name="expirationyear" type="text" size="10"
843
  value="<?php echo esc_attr( $order->expirationyear ); ?>"/>
844
+ <span class="description"><?php esc_html_e( 'MM/YYYY', 'paid-memberships-pro' );?></span>
845
  </td>
846
  </tr>
847
  <?php } ?>
850
  <td>
851
  <?php
852
  if ( in_array( 'status', $read_only_fields ) && $order_id > 0 ) {
853
+ echo esc_html( ucwords( $order->status ) );
854
  } else { ?>
855
  <?php
856
  $statuses = pmpro_getOrderStatuses();
866
  ?>
867
  </td>
868
  </tr>
869
+ </tbody>
870
+ </table>
871
+ <hr />
872
+ <h2><?php esc_html_e( 'Payment Gateway Information', 'paid-memberships-pro' ); ?></h2>
873
+ <table class="form-table">
874
+ <tbody>
875
  <tr>
876
  <th scope="row" valign="top"><label for="gateway"><?php esc_html_e( 'Gateway', 'paid-memberships-pro' ); ?>:</label></th>
877
  <td>
913
 
914
  <tr>
915
  <th scope="row" valign="top"><label
916
+ for="payment_transaction_id"><?php esc_html_e( 'Payment Transaction ID', 'paid-memberships-pro' ); ?>:</label></th>
917
  <td>
918
  <?php
919
  if ( in_array( 'payment_transaction_id', $read_only_fields ) && $order_id > 0 ) {
933
  <?php
934
  if ( in_array( 'subscription_transaction_id', $read_only_fields ) && $order_id > 0 ) {
935
  echo $order->subscription_transaction_id;
936
+ } else { ?>
937
+ <input id="subscription_transaction_id" name="subscription_transaction_id" type="text" size="50" value="<?php echo esc_attr( $order->subscription_transaction_id ); ?>"/>
938
+ <?php if ( $order->is_renewal() ) { ?>
939
+ <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-orders', 's' => $order->subscription_transaction_id ), admin_url( 'admin.php' ) ) ); ?>" title="<?php esc_attr_e( 'View all orders for this subscription', 'paid-memberships-pro' ); ?>" class="pmpro_order-renewal"><?php esc_html_e( 'Renewal', 'paid-memberships-pro' ); ?></a>
940
+ <?php } ?>
941
  <?php } ?>
942
  <p class="description"><?php esc_html_e( 'Generated by the gateway. Useful to cross reference subscriptions.', 'paid-memberships-pro' ); ?></p>
943
  </td>
944
  </tr>
945
+ </tbody>
946
+ </table>
947
+ <hr />
948
+ <h2><?php esc_html_e( 'Additional Order Information', 'paid-memberships-pro' ); ?></h2>
949
+ <table class="form-table">
950
+ <tbody>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
951
  <?php
952
  $affiliates = apply_filters( 'pmpro_orders_show_affiliate_ids', false );
953
  if ( ! empty( $affiliates ) ) {
1052
  <form id="posts-filter" method="get" action="">
1053
 
1054
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Orders', 'paid-memberships-pro' ); ?></h1>
1055
+ <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-orders', 'order' => -1 ), admin_url( 'admin.php' ) ) ); ?>" class="page-title-action pmpro-has-icon pmpro-has-icon-plus"><?php esc_html_e( 'Add New Order', 'paid-memberships-pro' ); ?></a>
1056
 
1057
  <?php
1058
  // build the export URL
1073
  );
1074
  $export_url = add_query_arg( $url_params, $export_url );
1075
  ?>
1076
+ <a target="_blank" href="<?php echo esc_url( $export_url ); ?>" class="page-title-action pmpro-has-icon pmpro-has-icon-download"><?php esc_html_e( 'Export to CSV', 'paid-memberships-pro' ); ?></a>
1077
 
1078
  <hr class="wp-header-end">
1079
 
1090
  "><p><?php echo $pmpro_msg; ?></p></div>
1091
  <?php } ?>
1092
 
1093
+ <p class="search-box">
1094
+ <label class="hidden" for="post-search-input"><?php esc_html_e( 'Search Orders', 'paid-memberships-pro' ); ?>:</label>
1095
+ <input type="hidden" name="page" value="pmpro-orders"/>
1096
+ <input id="post-search-input" type="text" value="<?php echo esc_attr( wp_unslash( $s ) ); ?>" name="s"/>
1097
+ <input class="button" type="submit" value="<?php esc_attr_e( 'Search Orders', 'paid-memberships-pro' ); ?>"/>
1098
+ </p>
1099
 
1100
+ <div class="tablenav top">
1101
+ <?php esc_html_e( 'Show', 'paid-memberships-pro' ); ?>
1102
+ <select id="filter" name="filter">
1103
+ <option value="all" <?php selected( $filter, 'all' ); ?>><?php esc_html_e( 'All', 'paid-memberships-pro' ); ?></option>
1104
+ <option
1105
+ value="within-a-date-range" <?php selected( $filter, 'within-a-date-range' ); ?>><?php esc_html_e( 'Within a Date Range', 'paid-memberships-pro' ); ?></option>
1106
+ <option
1107
+ value="predefined-date-range" <?php selected( $filter, 'predefined-date-range' ); ?>><?php esc_html_e( 'Predefined Date Range', 'paid-memberships-pro' ); ?></option>
1108
+ <option
1109
+ value="within-a-level" <?php selected( $filter, 'within-a-level' ); ?>><?php esc_html_e( 'Within a Level', 'paid-memberships-pro' ); ?></option>
1110
+ <option
1111
+ value="with-discount-code" <?php selected( $filter, 'with-discount-code' ); ?>><?php esc_html_e( 'With a Discount Code', 'paid-memberships-pro' ); ?></option>
1112
+ <option
1113
+ value="within-a-status" <?php selected( $filter, 'within-a-status' ); ?>><?php esc_html_e( 'Within a Status', 'paid-memberships-pro' ); ?></option>
1114
+ <option
1115
+ value="only-paid" <?php selected( $filter, 'only-paid' ); ?>><?php esc_html_e( 'Only Paid Orders', 'paid-memberships-pro' ); ?></option>
1116
+ <option
1117
+ value="only-free" <?php selected( $filter, 'only-free' ); ?>><?php esc_html_e( 'Only Free Orders', 'paid-memberships-pro' ); ?></option>
1118
+
1119
+ <?php $custom_filters = apply_filters( 'pmpro_admin_orders_filters', array() ); ?>
1120
+ <?php foreach( $custom_filters as $value => $name ) { ?>
1121
+ <option value="<?php echo esc_attr( $value ); ?>" <?php selected( $filter, $value ); ?>><?php esc_html_e( $name ); ?></option>
1122
+ <?php } ?>
1123
+ </select>
 
1124
 
1125
+ <span id="from"><?php esc_html_e( 'From', 'paid-memberships-pro' ); ?></span>
1126
 
1127
+ <select id="start-month" name="start-month">
1128
+ <?php for ( $i = 1; $i < 13; $i ++ ) { ?>
1129
+ <option
1130
+ value="<?php echo esc_attr( $i ); ?>" <?php selected( $start_month, $i ); ?>><?php echo esc_html( date_i18n( 'F', mktime( 0, 0, 0, $i, 2 ) ) ); ?></option>
1131
+ <?php } ?>
1132
+ </select>
1133
 
1134
+ <input id='start-day' name="start-day" type="text" size="2"
1135
+ value="<?php echo esc_attr( $start_day ); ?>"/>
1136
+ <input id='start-year' name="start-year" type="text" size="4"
1137
+ value="<?php echo esc_attr( $start_year ); ?>"/>
1138
 
1139
 
1140
+ <span id="to"><?php esc_html_e( 'To', 'paid-memberships-pro' ); ?></span>
1141
 
1142
+ <select id="end-month" name="end-month">
1143
+ <?php for ( $i = 1; $i < 13; $i ++ ) { ?>
1144
+ <option
1145
+ value="<?php echo esc_attr( $i ); ?>" <?php selected( $end_month, $i ); ?>><?php echo esc_html( date_i18n( 'F', mktime( 0, 0, 0, $i, 2 ) ) ); ?></option>
1146
+ <?php } ?>
1147
+ </select>
1148
 
1149
 
1150
+ <input id='end-day' name="end-day" type="text" size="2" value="<?php echo esc_attr( $end_day ); ?>"/>
1151
+ <input id='end-year' name="end-year" type="text" size="4" value="<?php echo esc_attr( $end_year ); ?>"/>
1152
 
1153
+ <span id="filterby"><?php esc_html_e( 'filter by ', 'paid-memberships-pro' ); ?></span>
1154
 
1155
+ <select id="predefined-date" name="predefined-date">
1156
 
1157
+ <option
1158
+ value="<?php echo 'This Month'; ?>" <?php selected( $predefined_date, 'This Month' ); ?>><?php esc_html_e( 'This Month', 'paid-memberships-pro' ); ?></option>
1159
+ <option
1160
+ value="<?php echo 'Last Month'; ?>" <?php selected( $predefined_date, 'Last Month' ); ?>><?php esc_html_e( 'Last Month', 'paid-memberships-pro' ); ?></option>
1161
+ <option
1162
+ value="<?php echo 'This Year'; ?>" <?php selected( $predefined_date, 'This Year' ); ?>><?php esc_html_e( 'This Year', 'paid-memberships-pro' ); ?></option>
1163
+ <option
1164
+ value="<?php echo 'Last Year'; ?>" <?php selected( $predefined_date, 'Last Year' ); ?>><?php esc_html_e( 'Last Year', 'paid-memberships-pro' ); ?></option>
1165
 
1166
+ </select>
1167
 
1168
+ <?php
1169
+ // Note: only orders belonging to current levels can be filtered. There is no option for orders belonging to deleted levels
1170
+ $levels = pmpro_sort_levels_by_order( pmpro_getAllLevels( true, true ) );
1171
+ ?>
1172
+ <select id="l" name="l">
1173
+ <?php foreach ( $levels as $level ) { ?>
1174
+ <option
1175
+ value="<?php echo esc_attr( $level->id ); ?>" <?php selected( $l, $level->id ); ?>><?php echo esc_html( $level->name ); ?></option>
1176
+ <?php } ?>
1177
 
1178
+ </select>
1179
 
1180
+ <?php
1181
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->pmpro_discount_codes ";
1182
+ $sqlQuery .= "ORDER BY id DESC ";
1183
+ $codes = $wpdb->get_results($sqlQuery, OBJECT);
1184
+ if ( ! empty( $codes ) ) { ?>
1185
+ <select id="discount-code" name="discount-code">
1186
+ <?php foreach ( $codes as $code ) { ?>
1187
+ <option
1188
+ value="<?php echo esc_attr( $code->id ); ?>" <?php selected( $discount_code, $code->id ); ?>><?php echo esc_html( $code->code ); ?></option>
 
 
1189
  <?php } ?>
1190
+ </select>
1191
+ <?php } ?>
1192
 
1193
+ <?php
1194
+ $statuses = pmpro_getOrderStatuses();
1195
+ ?>
1196
+ <select id="status" name="status">
1197
+ <?php foreach ( $statuses as $the_status ) { ?>
1198
+ <option
1199
+ value="<?php echo esc_attr( $the_status ); ?>" <?php selected( $the_status, $status ); ?>><?php echo esc_html( $the_status ); ?></option>
1200
+ <?php } ?>
1201
+ </select>
1202
 
1203
+ <input id="submit" class="button" type="submit" value="<?php esc_attr_e( 'Filter', 'paid-memberships-pro' ); ?>"/>
 
 
1204
 
1205
  <script>
1206
  //update month/year when period dropdown is changed
1331
 
1332
  </script>
1333
 
 
 
 
 
 
 
 
1334
  <?php
1335
  if ( $s ) {
1336
  $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS o.id FROM $wpdb->pmpro_membership_orders o LEFT JOIN $wpdb->users u ON o.user_id = u.ID LEFT JOIN $wpdb->pmpro_membership_levels l ON o.membership_id = l.id ";
1401
 
1402
  if ( $order_ids ) {
1403
  ?>
1404
+ <div class="tablenav-pages one-page">
1405
+ <span class="displaying-num"><?php printf( __( '%d orders found.', 'paid-memberships-pro' ), $totalrows ); ?></span>
1406
+ </div>
1407
  <?php
1408
  }
1409
+
1410
+ // Get all the gateways so we can reference their name later.
1411
+ $pmpro_gateways = pmpro_gateways();
1412
+
1413
+ // Get the value for whether to show discount codes or now.
1414
+ if ( $wpdb->get_var( "SELECT id FROM $wpdb->pmpro_discount_codes LIMIT 1" ) ) {
1415
+ $pmpro_discount_codes = true;
1416
+ } else {
1417
+ $pmpro_discount_codes = false;
1418
+ }
1419
  ?>
1420
+ <br class="clear" />
1421
+ </div> <!-- end tablenav -->
1422
+
1423
+ <table class="wp-list-table widefat striped">
1424
  <thead>
1425
  <tr class="thead">
1426
+ <th class="column-code"><?php esc_html_e( 'Code', 'paid-memberships-pro' ); ?></th>
1427
+ <th class="column-username"><?php esc_html_e( 'User', 'paid-memberships-pro' ); ?></th>
 
1428
  <?php do_action( 'pmpro_orders_extra_cols_header', $order_ids ); ?>
1429
+ <th class="column-level"><?php esc_html_e( 'Level', 'paid-memberships-pro' ); ?></th>
1430
+ <th class="column-total"><?php esc_html_e( 'Total', 'paid-memberships-pro' ); ?></th>
1431
+ <th class="column-billing"><?php esc_html_e( 'Billing', 'paid-memberships-pro' ); ?></th>
1432
+ <th class="column-gateway"><?php esc_html_e( 'Gateway', 'paid-memberships-pro' ); ?></th>
1433
+ <th class="column-transaction-ids"><?php esc_html_e( 'Transaction IDs', 'paid-memberships-pro' ); ?></th>
1434
+ <th class="column-status"><?php esc_html_e( 'Status', 'paid-memberships-pro' ); ?></th>
1435
+ <th class="column-date"><?php esc_html_e( 'Date', 'paid-memberships-pro' ); ?></th>
1436
+ <?php if ( ! empty( $pmpro_discount_codes ) ) { ?>
1437
+ <th class="column-discount-code"><?php esc_html_e( 'Discount Code', 'paid-memberships-pro' );?></th>
1438
+ <?php } ?>
1439
  </tr>
1440
  </thead>
1441
  <tbody id="orders" class="list:order orders-list">
1442
  <?php
 
1443
  foreach ( $order_ids as $order_id ) {
1444
  $order = new MemberOrder();
1445
  $order->nogateway = true;
1446
  $order->getMemberOrderByID( $order_id );
1447
  $order->getUser();
1448
  ?>
1449
+ <tr>
1450
+ <td class="column-code has-row-actions">
1451
+ <strong><a href="admin.php?page=pmpro-orders&order=<?php echo esc_attr( $order->id ); ?>"><?php echo esc_html( $order->code ); ?></a></strong>
 
 
 
 
 
1452
  <div class="row-actions">
1453
  <?php
1454
  $delete_text = esc_html(
1472
  'pmpro_orders_nonce'
1473
  );
1474
 
1475
+ $refund_text = esc_html(
1476
+ sprintf(
1477
+ // translators: %s is the Order Code.
1478
+ __( 'Refund order %s at the payment gateway. This action is permanent. The user and admin will receive an email confirmation after the refund is processed. Are you sure you want to refund this order?', 'paid-memberships-pro' ),
1479
+ str_replace( "'", '', $order->code )
1480
+ )
1481
+ );
1482
+
1483
+ $refund_nonce_url = wp_nonce_url(
1484
+ add_query_arg(
1485
+ [
1486
+ 'page' => 'pmpro-orders',
1487
+ 'action' => 'refund_order',
1488
+ 'refund' => $order->id,
1489
+ ],
1490
+ admin_url( 'admin.php' )
1491
+ ),
1492
+ 'refund_order',
1493
+ 'pmpro_orders_nonce'
1494
+ );
1495
+
1496
  $actions = [
1497
+ 'id' => sprintf(
1498
+ // translators: %s is the Order ID.
1499
+ __( 'ID: %s', 'paid-memberships-pro' ),
1500
+ esc_attr( $order->id ),
1501
+ ),
1502
  'edit' => sprintf(
1503
  '<a title="%1$s" href="%2$s">%3$s</a>',
1504
  esc_attr__( 'Edit', 'paid-memberships-pro' ),
1528
  ),
1529
  esc_html__( 'Copy', 'paid-memberships-pro' )
1530
  ),
1531
+ 'delete' => sprintf(
1532
  '<a title="%1$s" href="%2$s">%3$s</a>',
1533
  esc_attr__( 'Delete', 'paid-memberships-pro' ),
1534
  'javascript:pmpro_askfirst(\'' . esc_js( $delete_text ) . '\', \'' . esc_js( $delete_nonce_url ) . '\'); void(0);',
1557
  ),
1558
  ];
1559
 
1560
+ if( pmpro_allowed_refunds( $order ) ) {
1561
+ $actions['refund'] = sprintf(
1562
+ '<a title="%1$s" href="%2$s">%3$s</a>',
1563
+ esc_attr__( 'Refund', 'paid-memberships-pro' ),
1564
+ esc_js( 'javascript:pmpro_askfirst(' . wp_json_encode( $refund_text ) . ', ' . wp_json_encode( $refund_nonce_url ) . '); void(0);' ),
1565
+ esc_html__( 'Refund', 'paid-memberships-pro' )
1566
+ );
1567
+ }
1568
+
1569
  /**
1570
  * Filter the extra actions for this user on this order.
1571
  *
1591
  ?>
1592
  </div>
1593
  </td>
1594
+ <td class="column-username">
1595
  <?php $order->getUser(); ?>
1596
  <?php if ( ! empty( $order->user ) ) { ?>
1597
  <a href="user-edit.php?user_id=<?php echo esc_attr( $order->user->ID ); ?>"><?php echo esc_html( $order->user->user_login ); ?></a><br />
1603
  <?php } ?>
1604
  </td>
1605
  <?php do_action( 'pmpro_orders_extra_cols_body', $order ); ?>
1606
+ <td class="column-level">
1607
  <?php
1608
  $level = pmpro_getLevel( $order->membership_id );
1609
  if ( ! empty( $level ) ) {
1610
  echo esc_html( $level->name );
1611
  } elseif ( $order->membership_id > 0 ) { ?>
1612
  [<?php esc_html_e( 'deleted', 'paid-memberships-pro' ); ?>]
1613
+ <?php } else {
1614
+ esc_html_e( '&#8212;', 'paid-memberships-pro' );
1615
+ }
1616
  ?>
1617
  </td>
1618
+ <td class="column-total"><?php echo pmpro_escape_price( pmpro_formatPrice( $order->total ) ); ?></td>
1619
+ <td class="column-billing">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1620
  <?php
1621
+ // Build our return variable.
1622
+ $r = '';
1623
+
1624
+ if ( ! empty( $order->payment_type ) ) {
1625
+ if ( in_array( $order->payment_type, array( 'PayPal Standard', 'PayPal Express' ) ) ) {
1626
+ $r .= esc_html( 'PayPal', 'paid-memberships-pro' );
1627
+ } else {
1628
+ $r .= esc_html( ucwords( $order->payment_type ) );
1629
+ }
1630
+ $r .= '<br />';
1631
+ }
1632
+
1633
+ if ( ! empty( $order->accountnumber ) ) {
1634
+ $r .= esc_html( $order->cardtype ) . ': x' . esc_html( last4( $order->accountnumber ) ) . '<br />';
1635
+ }
1636
+
1637
+ if ( ! empty( $order->billing->name ) ) {
1638
+ $r .= esc_html( $order->billing->name ) . '<br />';
1639
+ }
1640
+
1641
+ if ( ! empty( $order->billing->street ) ) {
1642
+ $r .= esc_html( $order->billing->street ) . '<br />';
1643
+ }
1644
+
1645
+ if ( $order->billing->city && $order->billing->state ) {
1646
+ $r .= esc_html( $order->billing->city ) . ', ';
1647
+ $r .= esc_html( $order->billing->state ) . ' ';
1648
+ $r .= esc_html( $order->billing->zip ) . ' ';
1649
+ if ( ! empty( $order->billing->country ) ) {
1650
+ $r .= esc_html( $order->billing->country );
1651
+ }
1652
+ }
1653
+
1654
+ if ( ! empty( $order->billing->phone ) ) {
1655
+ $r .= '<br />' . esc_html( formatPhone( $order->billing->phone ) );
1656
+ }
1657
+
1658
+ // If this column is completely empty, set $r to a dash.
1659
+ if ( empty( $r ) ) {
1660
+ $r .= esc_html( '&#8212;', 'paid-memberships-pro' );
1661
+ }
1662
+
1663
+ // Echo the data for this column.
1664
+ echo $r;
1665
  ?>
1666
  </td>
1667
+ <td class="column-gateway">
1668
  <?php
1669
+ if ( ! empty( $order->gateway ) ) {
1670
+ if ( ! empty( $pmpro_gateways[$order->gateway] ) ) {
1671
+ echo $pmpro_gateways[$order->gateway];
1672
+ } else {
1673
+ esc_html_e( ucwords( $order->gateway ) );
1674
+ }
1675
+ if ( $order->gateway_environment == 'sandbox' ) {
1676
+ echo ' (test)';
1677
+ }
1678
+ } else {
1679
+ esc_html_e( '&#8212;', 'paid-memberships-pro' );
1680
+ }
1681
  ?>
1682
  </td>
1683
+ <td class="column-transaction-ids">
1684
  <?php esc_html_e( 'Payment', 'paid-memberships-pro' ); ?>:
1685
  <?php
1686
  if ( ! empty( $order->payment_transaction_id ) ) {
1699
  }
1700
  ?>
1701
  </td>
1702
+ <td class="column-status">
1703
+ <span class="pmpro_order-status pmpro_order-status-<?php esc_attr_e( $order->status ); ?>">
1704
+ <?php if ( in_array( $order->status, array( 'success', 'cancelled' ) ) ) {
1705
+ esc_html_e( 'Paid', 'paid-memberships-pro' );
1706
+ } else {
1707
+ esc_html_e( ucwords( $order->status ) );
1708
+ } ?>
1709
+ </span>
1710
+ <?php if ( $order->is_renewal() ) { ?>
1711
+ <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-orders', 's' => $order->subscription_transaction_id ), admin_url( 'admin.php' ) ) ); ?>" title="<?php esc_attr_e( 'View all orders for this subscription', 'paid-memberships-pro' ); ?>" class="pmpro_order-renewal"><?php esc_html_e( 'Renewal', 'paid-memberships-pro' ); ?></a>
1712
  <?php } ?>
1713
  </td>
1714
+ <td class="column-date">
1715
+ <?php
1716
+ echo esc_html( sprintf(
1717
+ // translators: %1$s is the date and %2$s is the time.
1718
+ __( '%1$s at %2$s', 'paid-memberships-pro' ),
1719
+ esc_html( date_i18n( get_option( 'date_format' ), $order->getTimestamp() ) ),
1720
+ esc_html( date_i18n( get_option( 'time_format' ), $order->getTimestamp() ) ),
1721
+ ) ); ?>
1722
+ </td>
1723
+ <?php if ( ! empty( $pmpro_discount_codes ) ) { ?>
1724
+ <td class="column-discount-code">
1725
+ <?php if ( $order->getDiscountCode() ) { ?>
1726
+ <a title="<?php esc_attr_e('edit', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-discountcodes', 'edit' => $order->discount_code->id ), admin_url('admin.php' ) ) ); ?>">
1727
+ <?php echo esc_html( $order->discount_code->code ); ?>
1728
+ </a>
1729
+ <?php } else {
1730
+ esc_html_e( '&#8212;', 'paid-memberships-pro' );
1731
+ } ?>
1732
+ </td>
1733
+ <?php } ?>
1734
  </tr>
1735
  <?php
1736
  }
1746
  </tbody>
1747
  </table>
1748
  </form>
1749
+ <div class="tablenav bottom">
1750
+ <div class="tablenav-pages">
1751
+ <?php if ( $order_ids ) { ?>
1752
+ <span class="displaying-num"><?php printf( __( '%d orders found.', 'paid-memberships-pro' ), $totalrows ); ?></span>
1753
+ <?php } ?>
1754
+ <?php
1755
+ // add normal args
1756
+ $pagination_url = esc_url( add_query_arg( $url_params, admin_url( '/admin.php?page=pmpro-orders' ) ) );
1757
+ echo pmpro_getPaginationString( $pn, $totalrows, $limit, 1, $pagination_url, "&limit=$limit&pn=" );
1758
+ ?>
1759
+ </div>
1760
+ </div>
1761
  <?php } ?>
1762
  <?php
1763
  require_once( dirname( __FILE__ ) . '/admin_footer.php' );
adminpages/pagesettings.php CHANGED
@@ -162,11 +162,10 @@ require_once(dirname(__FILE__) . "/admin_header.php");
162
  ?>
163
 
164
 
165
- <form action="<?php echo admin_url('admin.php?page=pmpro-pagesettings');?>" method="post" enctype="multipart/form-data">
166
  <?php wp_nonce_field('savesettings', 'pmpro_pagesettings_nonce');?>
167
-
168
- <h1 class="wp-heading-inline"><?php esc_html_e( 'Page Settings', 'paid-memberships-pro' ); ?></h1>
169
  <hr class="wp-header-end">
 
170
  <?php
171
  // check if we have all pages
172
  if ( $pmpro_pages['account'] ||
@@ -183,17 +182,17 @@ require_once(dirname(__FILE__) . "/admin_header.php");
183
  }
184
 
185
  if ( $pmpro_some_pages_ready ) { ?>
186
- <p><?php _e('Manage the WordPress pages assigned to each required Paid Memberships Pro page.', 'paid-memberships-pro' ); ?></p>
187
  <?php } elseif( ! empty( $_REQUEST['manualpages'] ) ) { ?>
188
- <p><?php _e('Assign the WordPress pages for each required Paid Memberships Pro page or', 'paid-memberships-pro' ); ?> <a
189
- href="<?php echo wp_nonce_url( admin_url( 'admin.php?page=pmpro-pagesettings&createpages=1' ), 'createpages', 'pmpro_pagesettings_nonce');?>"><?php _e('click here to let us generate them for you', 'paid-memberships-pro' ); ?></a>.
190
  </p>
191
  <?php } else { ?>
192
  <div class="pmpro-new-install">
193
- <h2><?php echo esc_attr_e( 'Manage Pages', 'paid-memberships-pro' ); ?></h2>
194
- <h4><?php echo esc_attr_e( 'Several frontend pages are required for your Paid Memberships Pro site.', 'paid-memberships-pro' ); ?></h4>
195
- <a href="<?php echo wp_nonce_url( admin_url( 'admin.php?page=pmpro-pagesettings&createpages=1'), 'createpages', 'pmpro_pagesettings_nonce' ); ?>" class="button-primary"><?php echo esc_attr_e( 'Generate Pages For Me', 'paid-memberships-pro' ); ?></a>
196
- <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings&manualpages=1' ) ); ?>" class="button"><?php echo esc_attr_e( 'Create Pages Manually', 'paid-memberships-pro' ); ?></a>
197
  </div> <!-- end pmpro-new-install -->
198
  <?php } ?>
199
 
@@ -202,7 +201,7 @@ require_once(dirname(__FILE__) . "/admin_header.php");
202
  <tbody>
203
  <tr>
204
  <th scope="row" valign="top">
205
- <label for="account_page_id"><?php _e('Account Page', 'paid-memberships-pro' ); ?>:</label>
206
  </th>
207
  <td>
208
  <?php
@@ -217,16 +216,16 @@ require_once(dirname(__FILE__) . "/admin_header.php");
217
  ?>
218
  <?php if (!empty($pmpro_pages['account'])) { ?>
219
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['account']; ?>&action=edit"
220
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
221
  &nbsp;
222
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['account']); ?>"
223
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
224
  <?php } ?>
225
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_account] <?php _e('or the Membership Account block', 'paid-memberships-pro' ); ?>.</p>
226
  </td>
227
  <tr>
228
  <th scope="row" valign="top">
229
- <label for="billing_page_id"><?php _e('Billing Information Page', 'paid-memberships-pro' ); ?>:</label>
230
  </th>
231
  <td>
232
  <?php
@@ -241,16 +240,16 @@ require_once(dirname(__FILE__) . "/admin_header.php");
241
  ?>
242
  <?php if (!empty($pmpro_pages['billing'])) { ?>
243
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['billing'] ?>&action=edit"
244
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
245
  &nbsp;
246
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['billing']); ?>"
247
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
248
  <?php } ?>
249
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_billing] <?php _e('or the Membership Billing block', 'paid-memberships-pro' ); ?>.</p>
250
  </td>
251
  <tr>
252
  <th scope="row" valign="top">
253
- <label for="cancel_page_id"><?php _e('Cancel Page', 'paid-memberships-pro' ); ?>:</label>
254
  </th>
255
  <td>
256
  <?php
@@ -265,17 +264,17 @@ require_once(dirname(__FILE__) . "/admin_header.php");
265
  ?>
266
  <?php if (!empty($pmpro_pages['cancel'])) { ?>
267
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['cancel'] ?>&action=edit"
268
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
269
  &nbsp;
270
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['cancel']); ?>"
271
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
272
  <?php } ?>
273
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_cancel] <?php _e('or the Membership Cancel block', 'paid-memberships-pro' ); ?>.</p>
274
  </td>
275
  </tr>
276
  <tr>
277
  <th scope="row" valign="top">
278
- <label for="checkout_page_id"><?php _e('Checkout Page', 'paid-memberships-pro' ); ?>:</label>
279
  </th>
280
  <td>
281
  <?php
@@ -290,17 +289,17 @@ require_once(dirname(__FILE__) . "/admin_header.php");
290
  ?>
291
  <?php if (!empty($pmpro_pages['checkout'])) { ?>
292
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['checkout'] ?>&action=edit"
293
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
294
  &nbsp;
295
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['checkout']); ?>"
296
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
297
  <?php } ?>
298
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_checkout] <?php _e('or the Membership Checkout block', 'paid-memberships-pro' ); ?>.</p>
299
  </td>
300
  </tr>
301
  <tr>
302
  <th scope="row" valign="top">
303
- <label for="confirmation_page_id"><?php _e('Confirmation Page', 'paid-memberships-pro' ); ?>:</label>
304
  </th>
305
  <td>
306
  <?php
@@ -315,17 +314,17 @@ require_once(dirname(__FILE__) . "/admin_header.php");
315
  ?>
316
  <?php if (!empty($pmpro_pages['confirmation'])) { ?>
317
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['confirmation'] ?>&action=edit"
318
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
319
  &nbsp;
320
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['confirmation']); ?>"
321
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
322
  <?php } ?>
323
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_confirmation] <?php _e('or the Membership Confirmation block', 'paid-memberships-pro' ); ?>.</p>
324
  </td>
325
  </tr>
326
  <tr>
327
  <th scope="row" valign="top">
328
- <label for="invoice_page_id"><?php _e('Invoice Page', 'paid-memberships-pro' ); ?>:</label>
329
  </th>
330
  <td>
331
  <?php
@@ -340,17 +339,17 @@ require_once(dirname(__FILE__) . "/admin_header.php");
340
  ?>
341
  <?php if (!empty($pmpro_pages['invoice'])) { ?>
342
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['invoice'] ?>&action=edit"
343
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
344
  &nbsp;
345
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['invoice']); ?>"
346
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
347
  <?php } ?>
348
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_invoice] <?php _e('or the Membership Invoice block', 'paid-memberships-pro' ); ?>.</p>
349
  </td>
350
  </tr>
351
  <tr>
352
  <th scope="row" valign="top">
353
- <label for="levels_page_id"><?php _e('Levels Page', 'paid-memberships-pro' ); ?>:</label>
354
  </th>
355
  <td>
356
  <?php
@@ -365,12 +364,12 @@ require_once(dirname(__FILE__) . "/admin_header.php");
365
  ?>
366
  <?php if (!empty($pmpro_pages['levels'])) { ?>
367
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['levels'] ?>&action=edit"
368
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
369
  &nbsp;
370
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['levels']); ?>"
371
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
372
  <?php } ?>
373
- <p class="description"><?php _e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_levels] <?php _e('or the Membership Levels block', 'paid-memberships-pro' ); ?>.</p>
374
 
375
  <?php if ( ! function_exists( 'pmpro_advanced_levels_shortcode' ) ) {
376
  $allowed_advanced_levels_html = array (
@@ -386,7 +385,7 @@ require_once(dirname(__FILE__) . "/admin_header.php");
386
  </tr>
387
  <tr>
388
  <th scope="row" valign="top">
389
- <label for="login_page_id"><?php esc_attr_e( 'Log In Page', 'paid-memberships-pro' ); ?>:</label>
390
  </th>
391
  <td>
392
  <?php
@@ -402,20 +401,20 @@ require_once(dirname(__FILE__) . "/admin_header.php");
402
 
403
  <?php if ( ! empty( $pmpro_pages['login'] ) ) { ?>
404
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['login'] ?>&action=edit"
405
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
406
  &nbsp;
407
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['login']); ?>"
408
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
409
  <?php } elseif ( empty( pmpro_getOption( 'login_page_generated' ) ) ) { ?>
410
  &nbsp;
411
- <a href="<?php echo wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( 'login' ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php _e('Generate Page', 'paid-memberships-pro' ); ?></a>
412
  <?php } ?>
413
  <p class="description"><?php printf( esc_html__('Include the shortcode %s or the Log In Form block.', 'paid-memberships-pro' ), '[pmpro_login]' ); ?></p>
414
  </td>
415
  </tr>
416
  <tr>
417
  <th scope="row" valign="top">
418
- <label for="member_profile_edit_page_id"><?php esc_attr_e( 'Member Profile Edit Page', 'paid-memberships-pro' ); ?>:</label>
419
  </th>
420
  <td>
421
  <?php
@@ -431,13 +430,13 @@ require_once(dirname(__FILE__) . "/admin_header.php");
431
 
432
  <?php if ( ! empty( $pmpro_pages['member_profile_edit'] ) ) { ?>
433
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['member_profile_edit'] ?>&action=edit"
434
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
435
  &nbsp;
436
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['member_profile_edit']); ?>"
437
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
438
  <?php } elseif ( empty( pmpro_getOption( 'member_profile_edit_page_generated' ) ) ) { ?>
439
  &nbsp;
440
- <a href="<?php echo wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( 'member_profile_edit' ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php _e('Generate Page', 'paid-memberships-pro' ); ?></a>
441
  <?php } ?>
442
  <p class="description"><?php printf( esc_html__('Include the shortcode %s or the Member Profile Edit block.', 'paid-memberships-pro' ), '[pmpro_member_profile_edit]' ); ?></p>
443
 
@@ -458,7 +457,7 @@ require_once(dirname(__FILE__) . "/admin_header.php");
458
 
459
  <?php
460
  if (!empty($extra_pages)) { ?>
461
- <h2><?php _e('Additional Page Settings', 'paid-memberships-pro' ); ?></h2>
462
  <table class="form-table">
463
  <tbody>
464
  <?php foreach ($extra_pages as $name => $page) { ?>
@@ -490,13 +489,13 @@ require_once(dirname(__FILE__) . "/admin_header.php");
490
  if(!empty($pmpro_pages[$name])) {
491
  ?>
492
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages[$name] ?>&action=edit"
493
- class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'paid-memberships-pro' ); ?></a>
494
  &nbsp;
495
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages[$name]); ?>"
496
- class="button button-secondary pmpro_page_view"><?php _e('view page', 'paid-memberships-pro' ); ?></a>
497
  <?php } else { ?>
498
  &nbsp;
499
- <a href="<?php echo wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( $name ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php _e('Generate Page', 'paid-memberships-pro' ); ?></a>
500
  <?php } ?>
501
  <?php if(!empty($hint)) { ?>
502
  <p class="description"><?php echo $hint;?></p>
@@ -509,7 +508,7 @@ require_once(dirname(__FILE__) . "/admin_header.php");
509
  <?php } ?>
510
  <p class="submit">
511
  <input name="savesettings" type="submit" class="button button-primary"
512
- value="<?php _e('Save Settings', 'paid-memberships-pro' ); ?>"/>
513
  </p>
514
  <?php } ?>
515
  </form>
162
  ?>
163
 
164
 
165
+ <form action="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings' ) );?>" method="post" enctype="multipart/form-data">
166
  <?php wp_nonce_field('savesettings', 'pmpro_pagesettings_nonce');?>
 
 
167
  <hr class="wp-header-end">
168
+ <h1 class="wp-heading-inline"><?php esc_html_e( 'Page Settings', 'paid-memberships-pro' ); ?></h1>
169
  <?php
170
  // check if we have all pages
171
  if ( $pmpro_pages['account'] ||
182
  }
183
 
184
  if ( $pmpro_some_pages_ready ) { ?>
185
+ <p><?php esc_html_e('Manage the WordPress pages assigned to each required Paid Memberships Pro page.', 'paid-memberships-pro' ); ?></p>
186
  <?php } elseif( ! empty( $_REQUEST['manualpages'] ) ) { ?>
187
+ <p><?php esc_html_e('Assign the WordPress pages for each required Paid Memberships Pro page or', 'paid-memberships-pro' ); ?> <a
188
+ href="<?php echo wp_nonce_url( admin_url( 'admin.php?page=pmpro-pagesettings&createpages=1' ), 'createpages', 'pmpro_pagesettings_nonce');?>"><?php esc_html_e('click here to let us generate them for you', 'paid-memberships-pro' ); ?></a>.
189
  </p>
190
  <?php } else { ?>
191
  <div class="pmpro-new-install">
192
+ <h2><?php esc_html_e( 'Manage Pages', 'paid-memberships-pro' ); ?></h2>
193
+ <h4><?php esc_html_e( 'Several frontend pages are required for your Paid Memberships Pro site.', 'paid-memberships-pro' ); ?></h4>
194
+ <a href="<?php echo wp_nonce_url( admin_url( 'admin.php?page=pmpro-pagesettings&createpages=1'), 'createpages', 'pmpro_pagesettings_nonce' ); ?>" class="button-primary"><?php esc_html_e( 'Generate Pages For Me', 'paid-memberships-pro' ); ?></a>
195
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings&manualpages=1' ) ); ?>" class="button"><?php esc_html_e( 'Create Pages Manually', 'paid-memberships-pro' ); ?></a>
196
  </div> <!-- end pmpro-new-install -->
197
  <?php } ?>
198
 
201
  <tbody>
202
  <tr>
203
  <th scope="row" valign="top">
204
+ <label for="account_page_id"><?php esc_html_e('Account Page', 'paid-memberships-pro' ); ?>:</label>
205
  </th>
206
  <td>
207
  <?php
216
  ?>
217
  <?php if (!empty($pmpro_pages['account'])) { ?>
218
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['account']; ?>&action=edit"
219
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
220
  &nbsp;
221
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['account']); ?>"
222
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
223
  <?php } ?>
224
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_account] <?php esc_html_e('or the Membership Account block', 'paid-memberships-pro' ); ?>.</p>
225
  </td>
226
  <tr>
227
  <th scope="row" valign="top">
228
+ <label for="billing_page_id"><?php esc_html_e('Billing Information Page', 'paid-memberships-pro' ); ?>:</label>
229
  </th>
230
  <td>
231
  <?php
240
  ?>
241
  <?php if (!empty($pmpro_pages['billing'])) { ?>
242
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['billing'] ?>&action=edit"
243
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
244
  &nbsp;
245
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['billing']); ?>"
246
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
247
  <?php } ?>
248
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_billing] <?php esc_html_e('or the Membership Billing block', 'paid-memberships-pro' ); ?>.</p>
249
  </td>
250
  <tr>
251
  <th scope="row" valign="top">
252
+ <label for="cancel_page_id"><?php esc_html_e('Cancel Page', 'paid-memberships-pro' ); ?>:</label>
253
  </th>
254
  <td>
255
  <?php
264
  ?>
265
  <?php if (!empty($pmpro_pages['cancel'])) { ?>
266
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['cancel'] ?>&action=edit"
267
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
268
  &nbsp;
269
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['cancel']); ?>"
270
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
271
  <?php } ?>
272
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_cancel] <?php esc_html_e('or the Membership Cancel block', 'paid-memberships-pro' ); ?>.</p>
273
  </td>
274
  </tr>
275
  <tr>
276
  <th scope="row" valign="top">
277
+ <label for="checkout_page_id"><?php esc_html_e('Checkout Page', 'paid-memberships-pro' ); ?>:</label>
278
  </th>
279
  <td>
280
  <?php
289
  ?>
290
  <?php if (!empty($pmpro_pages['checkout'])) { ?>
291
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['checkout'] ?>&action=edit"
292
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
293
  &nbsp;
294
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['checkout']); ?>"
295
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
296
  <?php } ?>
297
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_checkout] <?php esc_html_e('or the Membership Checkout block', 'paid-memberships-pro' ); ?>.</p>
298
  </td>
299
  </tr>
300
  <tr>
301
  <th scope="row" valign="top">
302
+ <label for="confirmation_page_id"><?php esc_html_e('Confirmation Page', 'paid-memberships-pro' ); ?>:</label>
303
  </th>
304
  <td>
305
  <?php
314
  ?>
315
  <?php if (!empty($pmpro_pages['confirmation'])) { ?>
316
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['confirmation'] ?>&action=edit"
317
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
318
  &nbsp;
319
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['confirmation']); ?>"
320
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
321
  <?php } ?>
322
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_confirmation] <?php esc_html_e('or the Membership Confirmation block', 'paid-memberships-pro' ); ?>.</p>
323
  </td>
324
  </tr>
325
  <tr>
326
  <th scope="row" valign="top">
327
+ <label for="invoice_page_id"><?php esc_html_e('Invoice Page', 'paid-memberships-pro' ); ?>:</label>
328
  </th>
329
  <td>
330
  <?php
339
  ?>
340
  <?php if (!empty($pmpro_pages['invoice'])) { ?>
341
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['invoice'] ?>&action=edit"
342
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
343
  &nbsp;
344
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['invoice']); ?>"
345
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
346
  <?php } ?>
347
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_invoice] <?php esc_html_e('or the Membership Invoice block', 'paid-memberships-pro' ); ?>.</p>
348
  </td>
349
  </tr>
350
  <tr>
351
  <th scope="row" valign="top">
352
+ <label for="levels_page_id"><?php esc_html_e('Levels Page', 'paid-memberships-pro' ); ?>:</label>
353
  </th>
354
  <td>
355
  <?php
364
  ?>
365
  <?php if (!empty($pmpro_pages['levels'])) { ?>
366
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['levels'] ?>&action=edit"
367
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
368
  &nbsp;
369
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['levels']); ?>"
370
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
371
  <?php } ?>
372
+ <p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_levels] <?php esc_html_e('or the Membership Levels block', 'paid-memberships-pro' ); ?>.</p>
373
 
374
  <?php if ( ! function_exists( 'pmpro_advanced_levels_shortcode' ) ) {
375
  $allowed_advanced_levels_html = array (
385
  </tr>
386
  <tr>
387
  <th scope="row" valign="top">
388
+ <label for="login_page_id"><?php esc_html_e( 'Log In Page', 'paid-memberships-pro' ); ?>:</label>
389
  </th>
390
  <td>
391
  <?php
401
 
402
  <?php if ( ! empty( $pmpro_pages['login'] ) ) { ?>
403
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['login'] ?>&action=edit"
404
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
405
  &nbsp;
406
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['login']); ?>"
407
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
408
  <?php } elseif ( empty( pmpro_getOption( 'login_page_generated' ) ) ) { ?>
409
  &nbsp;
410
+ <a href="<?php echo wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( 'login' ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php esc_html_e('Generate Page', 'paid-memberships-pro' ); ?></a>
411
  <?php } ?>
412
  <p class="description"><?php printf( esc_html__('Include the shortcode %s or the Log In Form block.', 'paid-memberships-pro' ), '[pmpro_login]' ); ?></p>
413
  </td>
414
  </tr>
415
  <tr>
416
  <th scope="row" valign="top">
417
+ <label for="member_profile_edit_page_id"><?php esc_html_e( 'Member Profile Edit Page', 'paid-memberships-pro' ); ?>:</label>
418
  </th>
419
  <td>
420
  <?php
430
 
431
  <?php if ( ! empty( $pmpro_pages['member_profile_edit'] ) ) { ?>
432
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['member_profile_edit'] ?>&action=edit"
433
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
434
  &nbsp;
435
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages['member_profile_edit']); ?>"
436
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
437
  <?php } elseif ( empty( pmpro_getOption( 'member_profile_edit_page_generated' ) ) ) { ?>
438
  &nbsp;
439
+ <a href="<?php echo wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( 'member_profile_edit' ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php esc_html_e('Generate Page', 'paid-memberships-pro' ); ?></a>
440
  <?php } ?>
441
  <p class="description"><?php printf( esc_html__('Include the shortcode %s or the Member Profile Edit block.', 'paid-memberships-pro' ), '[pmpro_member_profile_edit]' ); ?></p>
442
 
457
 
458
  <?php
459
  if (!empty($extra_pages)) { ?>
460
+ <h2><?php esc_html_e('Additional Page Settings', 'paid-memberships-pro' ); ?></h2>
461
  <table class="form-table">
462
  <tbody>
463
  <?php foreach ($extra_pages as $name => $page) { ?>
489
  if(!empty($pmpro_pages[$name])) {
490
  ?>
491
  <a target="_blank" href="post.php?post=<?php echo $pmpro_pages[$name] ?>&action=edit"
492
+ class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
493
  &nbsp;
494
  <a target="_blank" href="<?php echo get_permalink($pmpro_pages[$name]); ?>"
495
+ class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
496
  <?php } else { ?>
497
  &nbsp;
498
+ <a href="<?php echo wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( $name ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php esc_html_e('Generate Page', 'paid-memberships-pro' ); ?></a>
499
  <?php } ?>
500
  <?php if(!empty($hint)) { ?>
501
  <p class="description"><?php echo $hint;?></p>
508
  <?php } ?>
509
  <p class="submit">
510
  <input name="savesettings" type="submit" class="button button-primary"
511
+ value="<?php esc_attr_e('Save Settings', 'paid-memberships-pro' ); ?>"/>
512
  </p>
513
  <?php } ?>
514
  </form>
adminpages/paymentsettings.php CHANGED
@@ -108,23 +108,26 @@
108
 
109
  <form action="" method="post" enctype="multipart/form-data">
110
  <?php wp_nonce_field('savesettings', 'pmpro_paymentsettings_nonce');?>
111
-
112
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Payment Gateway', 'paid-memberships-pro' );?> &amp; <?php esc_html_e( 'SSL Settings', 'paid-memberships-pro' ); ?></h1>
113
- <hr class="wp-header-end">
114
-
115
- <p><?php _e('Learn more about <a title="Paid Memberships Pro - Payment Gateway Settings" target="_blank" href="https://www.paidmembershipspro.com/documentation/admin/payment-ssl-settings/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=documentation&utm_content=payment-gateway-settings">Payment Gateway Settings</a> and <a title="Paid Memberships Pro - SSL Settings" target="_blank" href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/ssl/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=documentation&utm_content=ssl&utm_term=link1">SSL</a>.', 'paid-memberships-pro' ); ?></p>
 
 
 
116
 
117
  <table class="form-table">
118
  <tbody>
119
  <tr class="pmpro_settings_divider">
120
  <td colspan="2">
121
  <hr />
122
- <h3><?php _e('Choose a Gateway', 'paid-memberships-pro' ); ?></h3>
123
  </td>
124
  </tr>
125
  <tr>
126
  <th scope="row" valign="top">
127
- <label for="gateway"><?php _e('Payment Gateway', 'paid-memberships-pro' );?>:</label>
128
  </th>
129
  <td>
130
  <select id="gateway" name="gateway">
@@ -139,18 +142,20 @@
139
  ?>
140
  </select>
141
  <?php if( pmpro_onlyFreeLevels() ) { ?>
142
- <div id="pmpro-default-gateway-message" style="display:none;"><p class="description"><?php echo __( 'This gateway is for membership sites with Free levels or for sites that accept payment offline.', 'paid-memberships-pro' ) . '<br/>' . __( 'It is not connected to a live gateway environment and cannot accept payments.', 'paid-memberships-pro' ); ?></p></div>
 
 
143
  <?php } ?>
144
  </td>
145
  </tr>
146
  <tr>
147
  <th scope="row" valign="top">
148
- <label for="gateway_environment"><?php _e('Gateway Environment', 'paid-memberships-pro' );?>:</label>
149
  </th>
150
  <td>
151
  <select id="gateway_environment" name="gateway_environment">
152
- <option value="sandbox" <?php selected( $gateway_environment, "sandbox" ); ?>><?php _e('Sandbox/Testing', 'paid-memberships-pro' );?></option>
153
- <option value="live" <?php selected( $gateway_environment, "live" ); ?>><?php _e('Live/Production', 'paid-memberships-pro' );?></option>
154
  </select>
155
  <script>
156
  function pmpro_changeGateway()
@@ -191,12 +196,12 @@
191
  <tr class="pmpro_settings_divider">
192
  <td colspan="2">
193
  <hr />
194
- <h3><?php _e('Currency and Tax Settings', 'paid-memberships-pro' ); ?></h3>
195
  </td>
196
  </tr>
197
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("currency"));?>" <?php if(!empty($gateway) && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource" && $gateway != "payflowpro" && $gateway != "stripe" && $gateway != "authorizenet" && $gateway != "gourl") { ?>style="display: none;"<?php } ?>>
198
  <th scope="row" valign="top">
199
- <label for="currency"><?php _e('Currency', 'paid-memberships-pro' );?>:</label>
200
  </th>
201
  <td>
202
  <select name="currency">
@@ -207,17 +212,17 @@
207
  if(is_array($cdescription))
208
  $cdescription = $cdescription['name'];
209
  ?>
210
- <option value="<?php echo $ccode?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo $cdescription?></option>
211
  <?php
212
  }
213
  ?>
214
  </select>
215
- <p class="description"><?php _e( 'Not all currencies will be supported by every gateway. Please check with your gateway.', 'paid-memberships-pro' ); ?></p>
216
  </td>
217
  </tr>
218
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("accepted_credit_cards"));?>" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "stripe" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
219
  <th scope="row" valign="top">
220
- <label for="creditcards"><?php _e('Accepted Credit Card Types', 'paid-memberships-pro' );?></label>
221
  </th>
222
  <td>
223
  <input type="checkbox" id="creditcards_visa" name="creditcards_visa" value="1" <?php if(in_array("Visa", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> <label for="creditcards_visa">Visa</label><br />
@@ -231,43 +236,49 @@
231
  </tr>
232
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("tax_rate"));?>" <?php if(!empty($gateway) && $gateway != "stripe" && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
233
  <th scope="row" valign="top">
234
- <label for="tax"><?php _e('Sales Tax', 'paid-memberships-pro' );?> (<?php _e('optional', 'paid-memberships-pro' );?>)</label>
235
  </th>
236
  <td>
237
  <?php _e('Tax State', 'paid-memberships-pro' );?>:
238
  <input type="text" id="tax_state" name="tax_state" value="<?php echo esc_attr($tax_state)?>" class="small-text" /> (<?php _e('abbreviation, e.g. "PA"', 'paid-memberships-pro' );?>)
239
  &nbsp; <?php _e('Tax Rate', 'paid-memberships-pro' ); ?>:
240
- <input type="text" id="tax_rate" name="tax_rate" size="10" value="<?php echo esc_attr($tax_rate)?>" class="small-text" /> (<?php _e('decimal, e.g. "0.06"', 'paid-memberships-pro' );?>)
241
- <p class="description"><?php _e('US only. If values are given, tax will be applied for any members ordering from the selected state.<br />For non-US or more complex tax rules, use the <a target="_blank" href="https://www.paidmembershipspro.com/non-us-taxes-paid-memberships-pro/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=blog&utm_content=non-us-taxes-paid-memberships-pro">pmpro_tax filter</a>.', 'paid-memberships-pro' );?></p>
 
 
 
 
 
 
242
  </td>
243
  </tr>
244
 
245
  <tr class="pmpro_settings_divider">
246
  <td colspan="2">
247
  <hr />
248
- <h3><?php _e('SSL Settings', 'paid-memberships-pro' ); ?></h3>
249
  </td>
250
  </tr>
251
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("use_ssl"));?>">
252
  <th scope="row" valign="top">
253
- <label for="use_ssl"><?php _e('Force SSL', 'paid-memberships-pro' );?>:</label>
254
  </th>
255
  <td>
256
  <?php
257
  if( pmpro_check_site_url_for_https() ) {
258
  //entire site is over HTTPS
259
  ?>
260
- <p class="description"><?php _e( 'Your Site URL starts with https:// and so PMPro will allow your entire site to be served over HTTPS.', 'paid-memberships-pro' ); ?></p>
261
  <?php
262
  } else {
263
  //site is not over HTTPS, show setting
264
  ?>
265
  <select id="use_ssl" name="use_ssl">
266
- <option value="0" <?php if(empty($use_ssl)) { ?>selected="selected"<?php } ?>><?php _e('No', 'paid-memberships-pro' );?></option>
267
- <option value="1" <?php if(!empty($use_ssl) && $use_ssl == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'paid-memberships-pro' );?></option>
268
- <option value="2" <?php if(!empty($use_ssl) && $use_ssl == 2) { ?>selected="selected"<?php } ?>><?php _e('Yes (with JavaScript redirects)', 'paid-memberships-pro' );?></option>
269
  </select>
270
- <p class="description"><?php _e('Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops.', 'paid-memberships-pro' ); ?></p>
271
  <?php
272
  }
273
  ?>
@@ -275,26 +286,32 @@
275
  </tr>
276
  <tr>
277
  <th scope="row" valign="top">
278
- <label for="sslseal"><?php _e('SSL Seal Code', 'paid-memberships-pro' );?>:</label>
279
  </th>
280
  <td>
281
  <textarea id="sslseal" name="sslseal" rows="3" cols="50" class="large-text"><?php echo stripslashes(esc_textarea($sslseal))?></textarea>
282
- <p class="description"><?php _e('Your <strong><a target="_blank" href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/ssl/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=documentation&utm_content=ssl&utm_term=link2">SSL Certificate</a></strong> must be installed by your web host. Use this field to display your seal or other trusted merchant images. This field does not accept JavaScript.', 'paid-memberships-pro' ); ?></p>
 
 
 
 
 
 
283
  </td>
284
  </tr>
285
  <tr>
286
  <th scope="row" valign="top">
287
- <label for="nuclear_HTTPS"><?php _e('Extra HTTPS URL Filter', 'paid-memberships-pro' );?>:</label>
288
  </th>
289
  <td>
290
- <input type="checkbox" id="nuclear_HTTPS" name="nuclear_HTTPS" value="1" <?php if(!empty($nuclear_HTTPS)) { ?>checked="checked"<?php } ?> /> <label for="nuclear_HTTPS"><?php _e('Pass all generated HTML through a URL filter to add HTTPS to URLs used on secure pages. Check this if you are using SSL and have warnings on your checkout pages.', 'paid-memberships-pro' );?></label>
291
  </td>
292
  </tr>
293
 
294
  </tbody>
295
  </table>
296
  <p class="submit">
297
- <input name="savesettings" type="submit" class="button button-primary" value="<?php _e('Save Settings', 'paid-memberships-pro' );?>" />
298
  </p>
299
  </form>
300
 
108
 
109
  <form action="" method="post" enctype="multipart/form-data">
110
  <?php wp_nonce_field('savesettings', 'pmpro_paymentsettings_nonce');?>
111
+ <hr class="wp-header-end">
112
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Payment Gateway', 'paid-memberships-pro' );?> &amp; <?php esc_html_e( 'SSL Settings', 'paid-memberships-pro' ); ?></h1>
113
+ <p><?php
114
+ $gateway_settings_link = '<a title="' . esc_html__( 'Paid Memberships Pro - Payment Gateway Settings', 'paid-memberships-pro' ) . '" target="_blank" rel="nofollow noopener" href="https://www.paidmembershipspro.com/documentation/admin/payment-ssl-settings/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=documentation&utm_content=payment-gateway-settings">' . esc_html__( 'Payment Gateway Settings', 'paid-memberships-pro' ) . '</a>';
115
+ $ssl_settings_link = '<a title="' . esc_html__( 'Paid Memberships Pro - SSL Settings', 'paid-memberships-pro' ) . '" target="_blank" rel="nofollow noopener" href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/ssl/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=documentation&utm_content=ssl&utm_term=link1">' . esc_html__( 'SSL', 'paid-memberships-pro' ) . '</a>';
116
+ // translators: %s and %s: Links to Payment Gateway Settings and SSL Settings docs.
117
+ printf( esc_html__('Learn more about %s and %s.', 'paid-memberships-pro' ), $gateway_settings_link, $ssl_settings_link );
118
+ ?></p>
119
 
120
  <table class="form-table">
121
  <tbody>
122
  <tr class="pmpro_settings_divider">
123
  <td colspan="2">
124
  <hr />
125
+ <h3><?php esc_html_e('Choose a Gateway', 'paid-memberships-pro' ); ?></h3>
126
  </td>
127
  </tr>
128
  <tr>
129
  <th scope="row" valign="top">
130
+ <label for="gateway"><?php esc_html_e('Payment Gateway', 'paid-memberships-pro' );?>:</label>
131
  </th>
132
  <td>
133
  <select id="gateway" name="gateway">
142
  ?>
143
  </select>
144
  <?php if( pmpro_onlyFreeLevels() ) { ?>
145
+ <div id="pmpro-default-gateway-message" style="display:none;"><p class="description"><?php echo esc_html__( 'This gateway is for membership sites with Free levels or for sites that accept payment offline.', 'paid-memberships-pro' )
146
+ . '<br/>'
147
+ . esc_html__( 'It is not connected to a live gateway environment and cannot accept payments.', 'paid-memberships-pro' ); ?></p></div>
148
  <?php } ?>
149
  </td>
150
  </tr>
151
  <tr>
152
  <th scope="row" valign="top">
153
+ <label for="gateway_environment"><?php esc_html_e('Gateway Environment', 'paid-memberships-pro' );?>:</label>
154
  </th>
155
  <td>
156
  <select id="gateway_environment" name="gateway_environment">
157
+ <option value="sandbox" <?php selected( $gateway_environment, "sandbox" ); ?>><?php esc_html_e('Sandbox/Testing', 'paid-memberships-pro' );?></option>
158
+ <option value="live" <?php selected( $gateway_environment, "live" ); ?>><?php esc_html_e('Live/Production', 'paid-memberships-pro' );?></option>
159
  </select>
160
  <script>
161
  function pmpro_changeGateway()
196
  <tr class="pmpro_settings_divider">
197
  <td colspan="2">
198
  <hr />
199
+ <h3><?php esc_html_e('Currency and Tax Settings', 'paid-memberships-pro' ); ?></h3>
200
  </td>
201
  </tr>
202
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("currency"));?>" <?php if(!empty($gateway) && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource" && $gateway != "payflowpro" && $gateway != "stripe" && $gateway != "authorizenet" && $gateway != "gourl") { ?>style="display: none;"<?php } ?>>
203
  <th scope="row" valign="top">
204
+ <label for="currency"><?php esc_html_e('Currency', 'paid-memberships-pro' );?>:</label>
205
  </th>
206
  <td>
207
  <select name="currency">
212
  if(is_array($cdescription))
213
  $cdescription = $cdescription['name'];
214
  ?>
215
+ <option value="<?php echo esc_attr( $ccode ) ?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo esc_html( $cdescription ); ?></option>
216
  <?php
217
  }
218
  ?>
219
  </select>
220
+ <p class="description"><?php esc_html_e( 'Not all currencies will be supported by every gateway. Please check with your gateway.', 'paid-memberships-pro' ); ?></p>
221
  </td>
222
  </tr>
223
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("accepted_credit_cards"));?>" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "stripe" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
224
  <th scope="row" valign="top">
225
+ <label for="creditcards"><?php esc_html_e('Accepted Credit Card Types', 'paid-memberships-pro' );?></label>
226
  </th>
227
  <td>
228
  <input type="checkbox" id="creditcards_visa" name="creditcards_visa" value="1" <?php if(in_array("Visa", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> <label for="creditcards_visa">Visa</label><br />
236
  </tr>
237
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("tax_rate"));?>" <?php if(!empty($gateway) && $gateway != "stripe" && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
238
  <th scope="row" valign="top">
239
+ <label for="tax"><?php esc_html_e('Sales Tax', 'paid-memberships-pro' );?> (<?php esc_html_e('optional', 'paid-memberships-pro' );?>)</label>
240
  </th>
241
  <td>
242
  <?php _e('Tax State', 'paid-memberships-pro' );?>:
243
  <input type="text" id="tax_state" name="tax_state" value="<?php echo esc_attr($tax_state)?>" class="small-text" /> (<?php _e('abbreviation, e.g. "PA"', 'paid-memberships-pro' );?>)
244
  &nbsp; <?php _e('Tax Rate', 'paid-memberships-pro' ); ?>:
245
+ <input type="text" id="tax_rate" name="tax_rate" size="10" value="<?php echo esc_attr($tax_rate)?>" class="small-text" /> (<?php _e('decimal, e.g. "0.06"', 'paid-memberships-pro' );?>)
246
+ <p class="description">
247
+ <?php
248
+ $filter_link = '<a target="_blank" rel="nofollow noopener" href="https://www.paidmembershipspro.com/non-us-taxes-paid-memberships-pro/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=blog&utm_content=non-us-taxes-paid-memberships-pro">pmpro_tax filter</a>';
249
+ // translators: %s: A link to the docs for the pmpro_tax filter.
250
+ printf( __('US only. If values are given, tax will be applied for any members ordering from the selected state. For non-US or more complex tax rules, use the %s.', 'paid-memberships-pro' ), $filter_link );
251
+ ?>
252
+ </p>
253
  </td>
254
  </tr>
255
 
256
  <tr class="pmpro_settings_divider">
257
  <td colspan="2">
258
  <hr />
259
+ <h3><?php esc_html_e('SSL Settings', 'paid-memberships-pro' ); ?></h3>
260
  </td>
261
  </tr>
262
  <tr class="gateway gateway_ <?php echo esc_attr(pmpro_getClassesForPaymentSettingsField("use_ssl"));?>">
263
  <th scope="row" valign="top">
264
+ <label for="use_ssl"><?php esc_html_e('Force SSL', 'paid-memberships-pro' );?>:</label>
265
  </th>
266
  <td>
267
  <?php
268
  if( pmpro_check_site_url_for_https() ) {
269
  //entire site is over HTTPS
270
  ?>
271
+ <p class="description"><?php esc_html_e( 'Your Site URL starts with https:// and so PMPro will allow your entire site to be served over HTTPS.', 'paid-memberships-pro' ); ?></p>
272
  <?php
273
  } else {
274
  //site is not over HTTPS, show setting
275
  ?>
276
  <select id="use_ssl" name="use_ssl">
277
+ <option value="0" <?php if(empty($use_ssl)) { ?>selected="selected"<?php } ?>><?php esc_html_e('No', 'paid-memberships-pro' );?></option>
278
+ <option value="1" <?php if(!empty($use_ssl) && $use_ssl == 1) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes', 'paid-memberships-pro' );?></option>
279
+ <option value="2" <?php if(!empty($use_ssl) && $use_ssl == 2) { ?>selected="selected"<?php } ?>><?php esc_html_e('Yes (with JavaScript redirects)', 'paid-memberships-pro' );?></option>
280
  </select>
281
+ <p class="description"><?php esc_html_e('Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops.', 'paid-memberships-pro' ); ?></p>
282
  <?php
283
  }
284
  ?>
286
  </tr>
287
  <tr>
288
  <th scope="row" valign="top">
289
+ <label for="sslseal"><?php esc_html_e('SSL Seal Code', 'paid-memberships-pro' );?>:</label>
290
  </th>
291
  <td>
292
  <textarea id="sslseal" name="sslseal" rows="3" cols="50" class="large-text"><?php echo stripslashes(esc_textarea($sslseal))?></textarea>
293
+ <p class="description">
294
+ <?php
295
+ $ssl_certificate_link = '<a target="_blank" rel="nofollow noopener" href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/ssl/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=documentation&utm_content=ssl&utm_term=link2">' . esc_html__( 'SSL Certificate', 'paid-memberships-pro' ) . '</a>';
296
+ // translators: %s: Link to SSL Certificate docs.
297
+ printf( esc_html__('Your %s must be installed by your web host. Use this field to display your seal or other trusted merchant images. This field does not accept JavaScript.', 'paid-memberships-pro' ), $ssl_certificate_link );
298
+ ?>
299
+ </p>
300
  </td>
301
  </tr>
302
  <tr>
303
  <th scope="row" valign="top">
304
+ <label for="nuclear_HTTPS"><?php esc_html_e('Extra HTTPS URL Filter', 'paid-memberships-pro' );?>:</label>
305
  </th>
306
  <td>
307
+ <input type="checkbox" id="nuclear_HTTPS" name="nuclear_HTTPS" value="1" <?php if(!empty($nuclear_HTTPS)) { ?>checked="checked"<?php } ?> /> <label for="nuclear_HTTPS"><?php esc_html_e('Pass all generated HTML through a URL filter to add HTTPS to URLs used on secure pages. Check this if you are using SSL and have warnings on your checkout pages.', 'paid-memberships-pro' );?></label>
308
  </td>
309
  </tr>
310
 
311
  </tbody>
312
  </table>
313
  <p class="submit">
314
+ <input name="savesettings" type="submit" class="button button-primary" value="<?php esc_attr_e('Save Settings', 'paid-memberships-pro' );?>" />
315
  </p>
316
  </form>
317
 
adminpages/reports.php CHANGED
@@ -8,14 +8,17 @@ global $pmpro_reports;
8
  /**
9
  * Load the Paid Memberships Pro dashboard-area header
10
  */
11
- require_once( dirname( __FILE__ ) . '/admin_header.php' );
12
 
 
 
 
13
  // View a single report if requested.
14
  if ( ! empty( $_REQUEST[ 'report' ] ) ) {
15
  //view a single report
16
  $report = sanitize_text_field( $_REQUEST[ 'report' ] );
17
  call_user_func( 'pmpro_report_' . $report . '_page' ); ?>
18
- <a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-reports' ) );?>"><?php esc_html_e( 'Back to Reports Dashboard', 'paid-memberships-pro' ); ?></a>
19
 
20
  <?php
21
  } else {
8
  /**
9
  * Load the Paid Memberships Pro dashboard-area header
10
  */
11
+ require_once( dirname( __FILE__ ) . '/admin_header.php' ); ?>
12
 
13
+ <hr class="wp-header-end">
14
+
15
+ <?php
16
  // View a single report if requested.
17
  if ( ! empty( $_REQUEST[ 'report' ] ) ) {
18
  //view a single report
19
  $report = sanitize_text_field( $_REQUEST[ 'report' ] );
20
  call_user_func( 'pmpro_report_' . $report . '_page' ); ?>
21
+ <p><a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-reports' ) );?>"><?php esc_html_e( 'Back to Reports Dashboard', 'paid-memberships-pro' ); ?></a></p>
22
 
23
  <?php
24
  } else {
adminpages/reports/login.php CHANGED
@@ -28,38 +28,38 @@ function pmpro_report_login_widget() {
28
  <thead>
29
  <tr>
30
  <th scope="col">&nbsp;</th>
31
- <th scope="col"><?php _e('Visits','paid-memberships-pro'); ?></th>
32
- <th scope="col"><?php _e('Views','paid-memberships-pro'); ?></th>
33
- <th scope="col"><?php _e('Logins','paid-memberships-pro'); ?></th>
34
  </tr>
35
  </thead>
36
  <tbody>
37
  <tr>
38
- <th scope="row"><?php _e('Today','paid-memberships-pro'); ?></th>
39
  <td><?php echo number_format_i18n($visits['today']); ?></td>
40
  <td><?php echo number_format_i18n($views['today']); ?></td>
41
  <td><?php echo number_format_i18n($logins['today']);?></td>
42
  </tr>
43
  <tr>
44
- <th scope="row"><?php _e('This Week','paid-memberships-pro'); ?></th>
45
  <td><?php echo number_format_i18n($visits['week']); ?></td>
46
  <td><?php echo number_format_i18n($views['week']); ?></td>
47
  <td><?php echo number_format_i18n($logins['week']); ?></td>
48
  </tr>
49
  <tr>
50
- <th scope="row"><?php _e('This Month','paid-memberships-pro'); ?></th>
51
  <td><?php echo number_format_i18n($visits['month']); ?></td>
52
  <td><?php echo number_format_i18n($views['month']); ?></td>
53
  <td><?php echo number_format_i18n($logins['month']); ?></td>
54
  </tr>
55
  <tr>
56
- <th scope="row"><?php _e('Year to Date','paid-memberships-pro'); ?></th>
57
  <td><?php echo number_format_i18n($visits['ytd']); ?></td>
58
  <td><?php echo number_format_i18n($views['ytd']); ?></td>
59
  <td><?php echo number_format_i18n($logins['ytd']);?></td>
60
  </tr>
61
  <tr>
62
- <th scope="row"><?php _e('All Time','paid-memberships-pro'); ?></th>
63
  <td><?php echo number_format_i18n($visits['alltime']); ?></td>
64
  <td><?php echo number_format_i18n($views['alltime']);?></td>
65
  <td><?php echo number_format_i18n($logins['alltime']); ?></td>
@@ -68,7 +68,7 @@ function pmpro_report_login_widget() {
68
  </table>
69
  <?php if ( function_exists( 'pmpro_report_login_page' ) ) { ?>
70
  <p class="pmpro_report-button">
71
- <a class="button button-primary" href="<?php echo admin_url( 'admin.php?page=pmpro-reports&report=login' ); ?>"><?php _e('Details', 'paid-memberships-pro' );?></a>
72
  </p>
73
  <?php } ?>
74
  </span>
@@ -97,118 +97,121 @@ function pmpro_report_login_page()
97
  <form id="posts-filter" method="get" action="">
98
  <h1>
99
  <?php _e('Visits, Views, and Logins Report', 'paid-memberships-pro');?>
100
- </h1>
101
- <ul class="subsubsub">
102
- <li>
103
- <?php _e( 'Show', 'Dropdown label, e.g. Show All Users', 'paid-memberships-pro' )?> <select name="l" onchange="jQuery('#posts-filter').submit();">
104
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Users', 'paid-memberships-pro')?></option>
105
- <option value="all" <?php if($l == "all") { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'paid-memberships-pro')?></option>
106
- <?php
107
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
108
- $levels = pmpro_sort_levels_by_order( $levels );
109
- foreach($levels as $level)
110
- {
111
- ?>
112
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
113
- <?php
114
- }
115
- ?>
116
- </select>
117
- </li>
118
- </ul>
119
  <p class="search-box">
120
- <label class="hidden" for="post-search-input"><?php _e( 'Search', 'Search form label', 'paid-memberships-pro')?> <?php if(empty($l)) echo "Users"; else echo "Members";?>:</label>
121
  <input type="hidden" name="page" value="pmpro-reports" />
122
  <input type="hidden" name="report" value="login" />
123
  <input id="post-search-input" type="text" value="<?php echo esc_attr($s)?>" name="s"/>
124
- <input class="button" type="submit" value="Search Members"/>
125
  </p>
126
- <?php
127
- //some vars for the search
128
- if(isset($_REQUEST['pn']))
129
- $pn = intval($_REQUEST['pn']);
130
- else
131
- $pn = 1;
132
-
133
- if(isset($_REQUEST['limit']))
134
- $limit = intval($_REQUEST['limit']);
135
- else
136
- $limit = 15;
137
-
138
- $end = $pn * $limit;
139
- $start = $end - $limit;
 
 
 
 
 
 
 
 
 
 
140
 
141
- if($s)
142
- {
143
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%') ";
144
-
145
- if($l == "all")
146
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id > 0 ";
147
- elseif($l)
148
- $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' ";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
- $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
151
- }
152
- else
153
- {
154
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
155
- $sqlQuery .= " WHERE 1=1 ";
156
-
157
- if($l == "all")
158
- $sqlQuery .= " AND mu.membership_id > 0 AND mu.status = 'active' ";
159
- elseif($l)
160
- $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' ";
161
- $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
162
- }
163
 
164
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
165
-
166
- $theusers = $wpdb->get_results($sqlQuery);
167
- $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
168
-
169
- if($theusers)
170
- {
171
- ?>
172
- <p class="clear"><?php echo strval($totalrows)?> <?php if(empty($l)) echo "users"; else echo "members";?> found.
173
- <?php
174
- }
175
- ?>
176
  <table class="widefat">
177
  <thead>
178
  <tr class="thead">
179
- <th><?php _e('ID', 'paid-memberships-pro')?></th>
180
- <th><?php _e('Username', 'paid-memberships-pro')?></th>
181
- <th><?php _e('Name', 'paid-memberships-pro')?></th>
182
- <th><?php _e('Level', 'paid-memberships-pro')?></th>
183
- <th><?php _e('Joined', 'paid-memberships-pro')?></th>
184
- <th><?php _e('Expires', 'paid-memberships-pro')?></th>
185
- <th><?php _e('Last Visit', 'paid-memberships-pro')?></th>
186
- <th><?php _e('Visits This Week', 'paid-memberships-pro')?></th>
187
- <th><?php _e('Visits This Month', 'paid-memberships-pro')?></th>
188
- <th><?php _e('Visits This Year', 'paid-memberships-pro')?></th>
189
- <th><?php _e('Visits All Time', 'paid-memberships-pro')?></th>
190
- <th><?php _e('Views This Week', 'paid-memberships-pro')?></th>
191
- <th><?php _e('Views This Month', 'paid-memberships-pro')?></th>
192
- <th><?php _e('Views This Year', 'paid-memberships-pro')?></th>
193
- <th><?php _e('Views All Time', 'paid-memberships-pro')?></th>
194
- <th><?php _e('Last Login', 'paid-memberships-pro')?></th>
195
- <th><?php _e('Logins This Week', 'paid-memberships-pro')?></th>
196
- <th><?php _e('Logins This Month', 'paid-memberships-pro')?></th>
197
- <th><?php _e('Logins This Year', 'paid-memberships-pro')?></th>
198
- <th><?php _e('Logins All Time', 'paid-memberships-pro')?></th>
199
  </tr>
200
  </thead>
201
- <tbody id="users" class="list:user user-list">
202
- <?php
203
- $count = 0;
204
  foreach($theusers as $auser)
205
  {
206
- //get meta
207
- $theuser = get_userdata($auser->ID);
208
  $visits = pmpro_reports_get_values_for_user("visits", $auser->ID);
209
  $views = pmpro_reports_get_values_for_user("views", $auser->ID);
210
  $logins = pmpro_reports_get_values_for_user("logins", $auser->ID);
211
-
212
  if(empty($logins))
213
  $logins = array("last"=>"N/A", "week"=>"N/A", "month"=>"N/A", "ytd"=>"N/A", "alltime"=>"N/A");
214
  ?>
@@ -221,17 +224,17 @@ function pmpro_report_login_page()
221
  $userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
222
  $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
223
  echo $userlink;
224
- ?>
225
  </strong>
226
- </td>
227
  <td>
228
  <?php echo $theuser->display_name;?>
229
  </td>
230
- <td><?php echo $auser->membership?></td>
231
  <td><?php echo date_i18n( 'm/d/Y', strtotime( get_date_from_gmt( $theuser->user_registered ), current_time( 'timestamp' ) ) ); ?></td>
232
 
233
  <td>
234
- <?php
235
  if($auser->enddate)
236
  echo date_i18n(get_option('date_format'), $auser->enddate);
237
  else
@@ -255,16 +258,16 @@ function pmpro_report_login_page()
255
  </tr>
256
  <?php
257
  }
258
-
259
  if(!$theusers)
260
  {
261
  ?>
262
  <tr>
263
- <td colspan="9"><p><?php _e('No members found.', 'paid-memberships-pro')?> <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo esc_attr($s)?>"><?php _e('Search all levels', 'paid-memberships-pro')?></a>.<?php } ?></p></td>
264
  </tr>
265
  <?php
266
  }
267
- ?>
268
  </tbody>
269
  </table>
270
  </form>
@@ -379,7 +382,7 @@ function pmpro_reports_get_all_values($type) {
379
  $allvalues['thismonth'] = $thismonth;
380
  $update = true;
381
  }
382
-
383
  if(!isset($allvalues['thisyear']) || $thisyear != $allvalues['thisyear'])
384
  {
385
  $allvalues['ytd'] = 0;
@@ -448,7 +451,7 @@ function pmpro_report_track_values($type, $user_id = NULL) {
448
  $values['week'] = 1;
449
  $values['thisweek'] = $thisweek;
450
  }
451
-
452
  if($thismonth == $values['thismonth'])
453
  $values['month'] = $values['month'] + 1;
454
  else
@@ -456,15 +459,15 @@ function pmpro_report_track_values($type, $user_id = NULL) {
456
  $values['month'] = 1;
457
  $values['thismonth'] = $thismonth;
458
  }
459
-
460
  if($thisyear == $values['thisyear'])
461
  $values['ytd'] = $values['ytd'] + 1;
462
  else
463
  {
464
  $values['ytd'] = 1;
465
  $values['thisyear'] = $thisyear;
466
- }
467
-
468
  //update user data
469
  update_user_meta($user_id, "pmpro_" . $type, $values);
470
  }
28
  <thead>
29
  <tr>
30
  <th scope="col">&nbsp;</th>
31
+ <th scope="col"><?php esc_html_e('Visits','paid-memberships-pro'); ?></th>
32
+ <th scope="col"><?php esc_html_e('Views','paid-memberships-pro'); ?></th>
33
+ <th scope="col"><?php esc_html_e('Logins','paid-memberships-pro'); ?></th>
34
  </tr>
35
  </thead>
36
  <tbody>
37
  <tr>
38
+ <th scope="row"><?php esc_html_e('Today','paid-memberships-pro'); ?></th>
39
  <td><?php echo number_format_i18n($visits['today']); ?></td>
40
  <td><?php echo number_format_i18n($views['today']); ?></td>
41
  <td><?php echo number_format_i18n($logins['today']);?></td>
42
  </tr>
43
  <tr>
44
+ <th scope="row"><?php esc_html_e('This Week','paid-memberships-pro'); ?></th>
45
  <td><?php echo number_format_i18n($visits['week']); ?></td>
46
  <td><?php echo number_format_i18n($views['week']); ?></td>
47
  <td><?php echo number_format_i18n($logins['week']); ?></td>
48
  </tr>
49
  <tr>
50
+ <th scope="row"><?php esc_html_e('This Month','paid-memberships-pro'); ?></th>
51
  <td><?php echo number_format_i18n($visits['month']); ?></td>
52
  <td><?php echo number_format_i18n($views['month']); ?></td>
53
  <td><?php echo number_format_i18n($logins['month']); ?></td>
54
  </tr>
55
  <tr>
56
+ <th scope="row"><?php esc_html_e('Year to Date','paid-memberships-pro'); ?></th>
57
  <td><?php echo number_format_i18n($visits['ytd']); ?></td>
58
  <td><?php echo number_format_i18n($views['ytd']); ?></td>
59
  <td><?php echo number_format_i18n($logins['ytd']);?></td>
60
  </tr>
61
  <tr>
62
+ <th scope="row"><?php esc_html_e('All Time','paid-memberships-pro'); ?></th>
63
  <td><?php echo number_format_i18n($visits['alltime']); ?></td>
64
  <td><?php echo number_format_i18n($views['alltime']);?></td>
65
  <td><?php echo number_format_i18n($logins['alltime']); ?></td>
68
  </table>
69
  <?php if ( function_exists( 'pmpro_report_login_page' ) ) { ?>
70
  <p class="pmpro_report-button">
71
+ <a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-reports&report=login' ) ); ?>"><?php esc_html_e('Details', 'paid-memberships-pro' );?></a>
72
  </p>
73
  <?php } ?>
74
  </span>
97
  <form id="posts-filter" method="get" action="">
98
  <h1>
99
  <?php _e('Visits, Views, and Logins Report', 'paid-memberships-pro');?>
100
+ </h1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  <p class="search-box">
102
+ <label class="hidden" for="post-search-input"><?php echo esc_html_x( 'Search', 'Search form label', 'paid-memberships-pro')?> <?php if(empty($l)) esc_html_e( 'Users', 'paid-memberships-pro' ); else esc_html_e( 'Members', 'paid-memberships-pro' );?>:</label>
103
  <input type="hidden" name="page" value="pmpro-reports" />
104
  <input type="hidden" name="report" value="login" />
105
  <input id="post-search-input" type="text" value="<?php echo esc_attr($s)?>" name="s"/>
106
+ <input class="button" type="submit" value="<?php esc_attr_e( 'Search Members', 'paid-memberships-pro' ) ?>"/>
107
  </p>
108
+ <div class="tablenav top">
109
+ <label for="l"><?php echo esc_html_x( 'Show', 'Dropdown label, e.g. Show All Users', 'paid-memberships-pro' ); ?></label>
110
+ <select name="l" onchange="jQuery('#posts-filter').submit();">
111
+ <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php esc_html_e('All Users', 'paid-memberships-pro')?></option>
112
+ <option value="all" <?php if($l == "all") { ?>selected="selected"<?php } ?>><?php esc_html_e('All Levels', 'paid-memberships-pro')?></option>
113
+ <?php
114
+ $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
115
+ $levels = pmpro_sort_levels_by_order( $levels );
116
+ foreach($levels as $level)
117
+ {
118
+ ?>
119
+ <option value="<?php echo esc_attr( $level->id ) ?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo esc_html( $level->name ); ?></option>
120
+
121
+ <?php
122
+ }
123
+ ?>
124
+ </select>
125
+ <div class="tablenav-pages one-page">
126
+ <?php
127
+ //some vars for the search
128
+ if(isset($_REQUEST['pn']))
129
+ $pn = intval($_REQUEST['pn']);
130
+ else
131
+ $pn = 1;
132
 
133
+ if(isset($_REQUEST['limit']))
134
+ $limit = intval($_REQUEST['limit']);
135
+ else
136
+ $limit = 15;
137
+
138
+ $end = $pn * $limit;
139
+ $start = $end - $limit;
140
+
141
+ if($s)
142
+ {
143
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%') ";
144
+
145
+ if($l == "all")
146
+ $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id > 0 ";
147
+ elseif($l)
148
+ $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' ";
149
+
150
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
151
+ }
152
+ else
153
+ {
154
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
155
+ $sqlQuery .= " WHERE 1=1 ";
156
+
157
+ if($l == "all")
158
+ $sqlQuery .= " AND mu.membership_id > 0 AND mu.status = 'active' ";
159
+ elseif($l)
160
+ $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' ";
161
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
162
+ }
163
+
164
+ $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
165
 
166
+ $theusers = $wpdb->get_results($sqlQuery);
167
+ $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
 
 
 
 
 
 
 
 
 
 
 
168
 
169
+ if($theusers)
170
+ {
171
+ ?>
172
+ <span class="displaying-num"><?php echo strval($totalrows)?> <?php if(empty($l)) echo "users"; else echo "members";?> found.</span>
173
+ <?php
174
+ }
175
+ ?>
176
+ </div>
177
+ <br class="clear" />
178
+ </div>
 
 
179
  <table class="widefat">
180
  <thead>
181
  <tr class="thead">
182
+ <th><?php esc_html_e('ID', 'paid-memberships-pro')?></th>
183
+ <th><?php esc_html_e('Username', 'paid-memberships-pro')?></th>
184
+ <th><?php esc_html_e('Name', 'paid-memberships-pro')?></th>
185
+ <th><?php esc_html_e('Level', 'paid-memberships-pro')?></th>
186
+ <th><?php esc_html_e('Joined', 'paid-memberships-pro')?></th>
187
+ <th><?php esc_html_e('Expires', 'paid-memberships-pro')?></th>
188
+ <th><?php esc_html_e('Last Visit', 'paid-memberships-pro')?></th>
189
+ <th><?php esc_html_e('Visits This Week', 'paid-memberships-pro')?></th>
190
+ <th><?php esc_html_e('Visits This Month', 'paid-memberships-pro')?></th>
191
+ <th><?php esc_html_e('Visits This Year', 'paid-memberships-pro')?></th>
192
+ <th><?php esc_html_e('Visits All Time', 'paid-memberships-pro')?></th>
193
+ <th><?php esc_html_e('Views This Week', 'paid-memberships-pro')?></th>
194
+ <th><?php esc_html_e('Views This Month', 'paid-memberships-pro')?></th>
195
+ <th><?php esc_html_e('Views This Year', 'paid-memberships-pro')?></th>
196
+ <th><?php esc_html_e('Views All Time', 'paid-memberships-pro')?></th>
197
+ <th><?php esc_html_e('Last Login', 'paid-memberships-pro')?></th>
198
+ <th><?php esc_html_e('Logins This Week', 'paid-memberships-pro')?></th>
199
+ <th><?php esc_html_e('Logins This Month', 'paid-memberships-pro')?></th>
200
+ <th><?php esc_html_e('Logins This Year', 'paid-memberships-pro')?></th>
201
+ <th><?php esc_html_e('Logins All Time', 'paid-memberships-pro')?></th>
202
  </tr>
203
  </thead>
204
+ <tbody id="users" class="list:user user-list">
205
+ <?php
206
+ $count = 0;
207
  foreach($theusers as $auser)
208
  {
209
+ //get meta
210
+ $theuser = get_userdata($auser->ID);
211
  $visits = pmpro_reports_get_values_for_user("visits", $auser->ID);
212
  $views = pmpro_reports_get_values_for_user("views", $auser->ID);
213
  $logins = pmpro_reports_get_values_for_user("logins", $auser->ID);
214
+
215
  if(empty($logins))
216
  $logins = array("last"=>"N/A", "week"=>"N/A", "month"=>"N/A", "ytd"=>"N/A", "alltime"=>"N/A");
217
  ?>
224
  $userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
225
  $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
226
  echo $userlink;
227
+ ?>
228
  </strong>
229
+ </td>
230
  <td>
231
  <?php echo $theuser->display_name;?>
232
  </td>
233
+ <td><?php echo $auser->membership?></td>
234
  <td><?php echo date_i18n( 'm/d/Y', strtotime( get_date_from_gmt( $theuser->user_registered ), current_time( 'timestamp' ) ) ); ?></td>
235
 
236
  <td>
237
+ <?php
238
  if($auser->enddate)
239
  echo date_i18n(get_option('date_format'), $auser->enddate);
240
  else
258
  </tr>
259
  <?php
260
  }
261
+
262
  if(!$theusers)
263
  {
264
  ?>
265
  <tr>
266
+ <td colspan="9"><p><?php esc_html_e('No members found.', 'paid-memberships-pro')?> <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo esc_attr($s)?>"><?php esc_html_e('Search all levels', 'paid-memberships-pro')?></a>.<?php } ?></p></td>
267
  </tr>
268
  <?php
269
  }
270
+ ?>
271
  </tbody>
272
  </table>
273
  </form>
382
  $allvalues['thismonth'] = $thismonth;
383
  $update = true;
384
  }
385
+
386
  if(!isset($allvalues['thisyear']) || $thisyear != $allvalues['thisyear'])
387
  {
388
  $allvalues['ytd'] = 0;
451
  $values['week'] = 1;
452
  $values['thisweek'] = $thisweek;
453
  }
454
+
455
  if($thismonth == $values['thismonth'])
456
  $values['month'] = $values['month'] + 1;
457
  else
459
  $values['month'] = 1;
460
  $values['thismonth'] = $thismonth;
461
  }
462
+
463
  if($thisyear == $values['thisyear'])
464
  $values['ytd'] = $values['ytd'] + 1;
465
  else
466
  {
467
  $values['ytd'] = 1;
468
  $values['thisyear'] = $thisyear;
469
+ }
470
+
471
  //update user data
472
  update_user_meta($user_id, "pmpro_" . $type, $values);
473
  }
adminpages/reports/memberships.php CHANGED
@@ -40,8 +40,8 @@ function pmpro_report_memberships_widget() {
40
  <thead>
41
  <tr>
42
  <th scope="col">&nbsp;</th>
43
- <th scope="col"><?php _e('Signups', 'paid-memberships-pro' ); ?></th>
44
- <th scope="col"><?php _e('All Cancellations', 'paid-memberships-pro' ); ?></th>
45
  </tr>
46
  </thead>
47
  <?php
@@ -93,7 +93,7 @@ function pmpro_report_memberships_widget() {
93
  </table>
94
  <?php if ( function_exists( 'pmpro_report_memberships_page' ) ) { ?>
95
  <p class="pmpro_report-button">
96
- <a class="button button-primary" href="<?php echo esc_url(admin_url( 'admin.php?page=pmpro-reports&report=memberships')); ?>"><?php _e('Details', 'paid-memberships-pro' );?></a>
97
  </p>
98
  <?php } ?>
99
  </span>
@@ -326,65 +326,64 @@ function pmpro_report_memberships_page()
326
  <h1>
327
  <?php _e('Membership Stats', 'paid-memberships-pro' );?>
328
  </h1>
329
- <ul class="subsubsub">
330
- <li>
331
- <?php _e('Show', 'paid-memberships-pro' )?>
332
- <select id="period" name="period">
333
- <option value="daily" <?php selected($period, "daily");?>><?php _e('Daily', 'paid-memberships-pro' );?></option>
334
- <option value="monthly" <?php selected($period, "monthly");?>><?php _e('Monthly', 'paid-memberships-pro' );?></option>
335
- <option value="annual" <?php selected($period, "annual");?>><?php _e('Annual', 'paid-memberships-pro' );?></option>
336
- </select>
337
- <select id="type" name="type">
338
- <option value="signup_v_all" <?php selected($type, "signup_v_all");?>><?php _e('Signups vs. All Cancellations', 'paid-memberships-pro' );?></option>
339
- <option value="signup_v_cancel" <?php selected($type, "signup_v_cancel");?>><?php _e('Signups vs. Cancellations', 'paid-memberships-pro' );?></option>
340
- <option value="signup_v_expiration" <?php selected($type, "signup_v_expiration");?>><?php _e('Signups vs. Expirations', 'paid-memberships-pro' );?></option>
341
- </select>
342
- <span id="for"><?php _e('for', 'paid-memberships-pro' )?></span>
343
- <select id="month" name="month">
344
- <?php for($i = 1; $i < 13; $i++) { ?>
345
- <option value="<?php echo esc_attr($i);?>" <?php selected($month, $i);?>><?php echo esc_html(date_i18n("F", mktime(0, 0, 0, $i, 2)));?></option>
346
- <?php } ?>
347
- </select>
348
- <select id="year" name="year">
349
- <?php for($i = $thisyear; $i > 2007; $i--) { ?>
350
- <option value="<?php echo esc_attr($i);?>" <?php selected($year, $i);?>><?php echo esc_html($i);?></option>
351
- <?php } ?>
352
- </select>
353
- <span id="for"><?php _e('for', 'paid-memberships-pro' )?></span>
354
- <select name="level">
355
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'paid-memberships-pro' );?></option>
356
- <option value="paid-levels" <?php if(isset($_REQUEST['level']) && $_REQUEST['level'] == "paid-levels"){?> selected="selected" <?php }?>><?php _e( 'All Paid Levels', 'paid-memberships-pro' ); ?></option>
357
- <option value="free-levels" <?php if(isset($_REQUEST['level']) && $_REQUEST['level'] == "free-levels"){?> selected="selected" <?php }?>><?php _e( 'All Free Levels', 'paid-memberships-pro' ); ?></option>
358
- <?php
359
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
360
- $levels = pmpro_sort_levels_by_order( $levels );
361
- foreach($levels as $level)
362
- {
363
- ?>
364
- <option value="<?php echo esc_attr($level->id)?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo esc_html($level->name);?></option>
365
- <?php
366
- }
367
 
368
- ?>
369
 
370
- </select>
371
- <?php
372
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->pmpro_discount_codes ";
373
- $sqlQuery .= "ORDER BY id DESC ";
374
- $codes = $wpdb->get_results($sqlQuery, OBJECT);
375
- if ( ! empty( $codes ) ) { ?>
376
- <select id="discount_code" name="discount_code">
377
- <option value="" <?php if ( empty( $discount_code ) ) { ?>selected="selected"<?php } ?>><?php _e('All Codes', 'paid-memberships-pro' );?></option>
378
- <?php foreach ( $codes as $code ) { ?>
379
- <option value="<?php echo esc_attr($code->id); ?>" <?php selected( $discount_code, $code->id ); ?>><?php echo esc_html($code->code); ?></option>
380
- <?php } ?>
381
- </select>
382
  <?php } ?>
383
- <input type="hidden" name="page" value="pmpro-reports" />
384
- <input type="hidden" name="report" value="memberships" />
385
- <input type="submit" class="button" value="<?php esc_attr_e('Generate Report', 'paid-memberships-pro' );?>" />
386
- </li>
387
- </ul>
 
 
388
 
389
  <div id="chart_div" style="clear: both; width: 100%; height: 500px;"></div>
390
 
40
  <thead>
41
  <tr>
42
  <th scope="col">&nbsp;</th>
43
+ <th scope="col"><?php esc_html_e('Signups', 'paid-memberships-pro' ); ?></th>
44
+ <th scope="col"><?php esc_html_e('All Cancellations', 'paid-memberships-pro' ); ?></th>
45
  </tr>
46
  </thead>
47
  <?php
93
  </table>
94
  <?php if ( function_exists( 'pmpro_report_memberships_page' ) ) { ?>
95
  <p class="pmpro_report-button">
96
+ <a class="button button-primary" href="<?php echo esc_url(admin_url( 'admin.php?page=pmpro-reports&report=memberships')); ?>"><?php esc_html_e('Details', 'paid-memberships-pro' );?></a>
97
  </p>
98
  <?php } ?>
99
  </span>
326
  <h1>
327
  <?php _e('Membership Stats', 'paid-memberships-pro' );?>
328
  </h1>
329
+ <div class="tablenav top">
330
+ <?php _e('Show', 'paid-memberships-pro' )?>
331
+ <select id="period" name="period">
332
+ <option value="daily" <?php selected($period, "daily");?>><?php esc_html_e('Daily', 'paid-memberships-pro' );?></option>
333
+ <option value="monthly" <?php selected($period, "monthly");?>><?php esc_html_e('Monthly', 'paid-memberships-pro' );?></option>
334
+ <option value="annual" <?php selected($period, "annual");?>><?php esc_html_e('Annual', 'paid-memberships-pro' );?></option>
335
+ </select>
336
+ <select id="type" name="type">
337
+ <option value="signup_v_all" <?php selected($type, "signup_v_all");?>><?php esc_html_e('Signups vs. All Cancellations', 'paid-memberships-pro' );?></option>
338
+ <option value="signup_v_cancel" <?php selected($type, "signup_v_cancel");?>><?php esc_html_e('Signups vs. Cancellations', 'paid-memberships-pro' );?></option>
339
+ <option value="signup_v_expiration" <?php selected($type, "signup_v_expiration");?>><?php esc_html_e('Signups vs. Expirations', 'paid-memberships-pro' );?></option>
340
+ </select>
341
+ <span id="for"><?php esc_html_e('for', 'paid-memberships-pro' )?></span>
342
+ <select id="month" name="month">
343
+ <?php for($i = 1; $i < 13; $i++) { ?>
344
+ <option value="<?php echo esc_attr($i);?>" <?php selected($month, $i);?>><?php echo esc_html(date_i18n("F", mktime(0, 0, 0, $i, 2)));?></option>
345
+ <?php } ?>
346
+ </select>
347
+ <select id="year" name="year">
348
+ <?php for($i = $thisyear; $i > 2007; $i--) { ?>
349
+ <option value="<?php echo esc_attr($i);?>" <?php selected($year, $i);?>><?php echo esc_html($i);?></option>
350
+ <?php } ?>
351
+ </select>
352
+ <span id="for"><?php esc_html_e('for', 'paid-memberships-pro' )?></span>
353
+ <select name="level">
354
+ <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php esc_html_e('All Levels', 'paid-memberships-pro' );?></option>
355
+ <option value="paid-levels" <?php if(isset($_REQUEST['level']) && $_REQUEST['level'] === "paid-levels"){?> selected="selected" <?php }?>><?php esc_html_e( 'All Paid Levels', 'paid-memberships-pro' ); ?></option>
356
+ <option value="free-levels" <?php if(isset($_REQUEST['level']) && $_REQUEST['level'] === "free-levels"){?> selected="selected" <?php }?>><?php esc_html_e( 'All Free Levels', 'paid-memberships-pro' ); ?></option>
357
+ <?php
358
+ $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
359
+ $levels = pmpro_sort_levels_by_order( $levels );
360
+ foreach($levels as $level)
361
+ {
362
+ ?>
363
+ <option value="<?php echo esc_attr($level->id)?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo esc_html($level->name);?></option>
364
+ <?php
365
+ }
 
366
 
367
+ ?>
368
 
369
+ </select>
370
+ <?php
371
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->pmpro_discount_codes ";
372
+ $sqlQuery .= "ORDER BY id DESC ";
373
+ $codes = $wpdb->get_results($sqlQuery, OBJECT);
374
+ if ( ! empty( $codes ) ) { ?>
375
+ <select id="discount_code" name="discount_code">
376
+ <option value="" <?php if ( empty( $discount_code ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e('All Codes', 'paid-memberships-pro' );?></option>
377
+ <?php foreach ( $codes as $code ) { ?>
378
+ <option value="<?php echo esc_attr($code->id); ?>" <?php selected( $discount_code, $code->id ); ?>><?php echo esc_html($code->code); ?></option>
 
 
379
  <?php } ?>
380
+ </select>
381
+ <?php } ?>
382
+ <input type="hidden" name="page" value="pmpro-reports" />
383
+ <input type="hidden" name="report" value="memberships" />
384
+ <input type="submit" class="button" value="<?php esc_attr_e('Generate Report', 'paid-memberships-pro' );?>" />
385
+ <br class="clear" />
386
+ </div>
387
 
388
  <div id="chart_div" style="clear: both; width: 100%; height: 500px;"></div>
389
 
adminpages/reports/sales.php CHANGED
@@ -41,8 +41,8 @@ function pmpro_report_sales_widget() {
41
  <thead>
42
  <tr>
43
  <th scope="col">&nbsp;</th>
44
- <th scope="col"><?php _e('Sales', 'paid-memberships-pro' ); ?></th>
45
- <th scope="col"><?php _e('Revenue', 'paid-memberships-pro' ); ?></th>
46
  </tr>
47
  </thead>
48
  <?php
@@ -95,7 +95,7 @@ function pmpro_report_sales_widget() {
95
  </table>
96
  <?php if ( function_exists( 'pmpro_report_sales_page' ) ) { ?>
97
  <p class="pmpro_report-button">
98
- <a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-reports&report=sales' ) ); ?>"><?php _e('Details', 'paid-memberships-pro' );?></a>
99
  </p>
100
  <?php } ?>
101
  </span>
@@ -310,15 +310,15 @@ function pmpro_report_sales_page()
310
  <div class="tablenav top">
311
  <?php _e('Show', 'paid-memberships-pro' )?>
312
  <select id="period" name="period">
313
- <option value="daily" <?php selected($period, "daily");?>><?php _e('Daily', 'paid-memberships-pro' );?></option>
314
- <option value="monthly" <?php selected($period, "monthly");?>><?php _e('Monthly', 'paid-memberships-pro' );?></option>
315
- <option value="annual" <?php selected($period, "annual");?>><?php _e('Annual', 'paid-memberships-pro' );?></option>
316
  </select>
317
  <select name="type">
318
- <option value="revenue" <?php selected($type, "revenue");?>><?php _e('Revenue', 'paid-memberships-pro' );?></option>
319
- <option value="sales" <?php selected($type, "sales");?>><?php _e('Sales', 'paid-memberships-pro' );?></option>
320
  </select>
321
- <span id="for"><?php _e('for', 'paid-memberships-pro' )?></span>
322
  <select id="month" name="month">
323
  <?php for($i = 1; $i < 13; $i++) { ?>
324
  <option value="<?php echo esc_attr( $i );?>" <?php selected($month, $i);?>><?php echo esc_html(date_i18n("F", mktime(0, 0, 0, $i, 2)));?></option>
@@ -329,9 +329,9 @@ function pmpro_report_sales_page()
329
  <option value="<?php echo esc_attr( $i );?>" <?php selected($year, $i);?>><?php echo esc_html( $i );?></option>
330
  <?php } ?>
331
  </select>
332
- <span id="for"><?php _e('for', 'paid-memberships-pro' )?></span>
333
  <select id="level" name="level">
334
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'paid-memberships-pro' );?></option>
335
  <?php
336
  $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
337
  $levels = pmpro_sort_levels_by_order( $levels );
@@ -349,7 +349,7 @@ function pmpro_report_sales_page()
349
  $codes = $wpdb->get_results($sqlQuery, OBJECT);
350
  if ( ! empty( $codes ) ) { ?>
351
  <select id="discount_code" name="discount_code">
352
- <option value="" <?php if ( empty( $discount_code ) ) { ?>selected="selected"<?php } ?>><?php _e('All Codes', 'paid-memberships-pro' );?></option>
353
  <?php foreach ( $codes as $code ) { ?>
354
  <option value="<?php echo esc_attr( $code->id ); ?>" <?php selected( $discount_code, $code->id ); ?>><?php echo esc_html( $code->code ); ?></option>
355
  <?php } ?>
@@ -358,6 +358,7 @@ function pmpro_report_sales_page()
358
  <input type="hidden" name="page" value="pmpro-reports" />
359
  <input type="hidden" name="report" value="sales" />
360
  <input type="submit" class="button action" value="<?php esc_attr_e('Generate Report', 'paid-memberships-pro' );?>" />
 
361
  </div>
362
  <div class="pmpro_chart_area">
363
  <div id="chart_div"></div>
@@ -539,7 +540,7 @@ function pmpro_report_sales_page()
539
  } elseif( ! empty( $year ) && $period === 'monthly' ) {
540
  $date = $year;
541
  } else {
542
- $date = __( 'All Time');
543
  }
544
  ?>
545
  return <?php echo wp_json_encode( esc_html( sprintf( __( '%s %s for %s', 'paid-memberships-pro' ), ucwords( $period ), ucwords( $type ), ucwords( $date ) ) ) ); ?>;
41
  <thead>
42
  <tr>
43
  <th scope="col">&nbsp;</th>
44
+ <th scope="col"><?php esc_html_e('Sales', 'paid-memberships-pro' ); ?></th>
45
+ <th scope="col"><?php esc_html_e('Revenue', 'paid-memberships-pro' ); ?></th>
46
  </tr>
47
  </thead>
48
  <?php
95
  </table>
96
  <?php if ( function_exists( 'pmpro_report_sales_page' ) ) { ?>
97
  <p class="pmpro_report-button">
98
+ <a class="button button-primary" href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-reports&report=sales' ) ); ?>"><?php esc_html_e('Details', 'paid-memberships-pro' );?></a>
99
  </p>
100
  <?php } ?>
101
  </span>
310
  <div class="tablenav top">
311
  <?php _e('Show', 'paid-memberships-pro' )?>
312
  <select id="period" name="period">
313
+ <option value="daily" <?php selected($period, "daily");?>><?php esc_html_e('Daily', 'paid-memberships-pro' );?></option>
314
+ <option value="monthly" <?php selected($period, "monthly");?>><?php esc_html_e('Monthly', 'paid-memberships-pro' );?></option>
315
+ <option value="annual" <?php selected($period, "annual");?>><?php esc_html_e('Annual', 'paid-memberships-pro' );?></option>
316
  </select>
317
  <select name="type">
318
+ <option value="revenue" <?php selected($type, "revenue");?>><?php esc_html_e('Revenue', 'paid-memberships-pro' );?></option>
319
+ <option value="sales" <?php selected($type, "sales");?>><?php esc_html_e('Sales', 'paid-memberships-pro' );?></option>
320
  </select>
321
+ <span id="for"><?php esc_html_e('for', 'paid-memberships-pro' )?></span>
322
  <select id="month" name="month">
323
  <?php for($i = 1; $i < 13; $i++) { ?>
324
  <option value="<?php echo esc_attr( $i );?>" <?php selected($month, $i);?>><?php echo esc_html(date_i18n("F", mktime(0, 0, 0, $i, 2)));?></option>
329
  <option value="<?php echo esc_attr( $i );?>" <?php selected($year, $i);?>><?php echo esc_html( $i );?></option>
330
  <?php } ?>
331
  </select>
332
+ <span id="for"><?php esc_html_e('for', 'paid-memberships-pro' )?></span>
333
  <select id="level" name="level">
334
+ <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php esc_html_e('All Levels', 'paid-memberships-pro' );?></option>
335
  <?php
336
  $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
337
  $levels = pmpro_sort_levels_by_order( $levels );
349
  $codes = $wpdb->get_results($sqlQuery, OBJECT);
350
  if ( ! empty( $codes ) ) { ?>
351
  <select id="discount_code" name="discount_code">
352
+ <option value="" <?php if ( empty( $discount_code ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e('All Codes', 'paid-memberships-pro' );?></option>
353
  <?php foreach ( $codes as $code ) { ?>
354
  <option value="<?php echo esc_attr( $code->id ); ?>" <?php selected( $discount_code, $code->id ); ?>><?php echo esc_html( $code->code ); ?></option>
355
  <?php } ?>
358
  <input type="hidden" name="page" value="pmpro-reports" />
359
  <input type="hidden" name="report" value="sales" />
360
  <input type="submit" class="button action" value="<?php esc_attr_e('Generate Report', 'paid-memberships-pro' );?>" />
361
+ <br class="clear" />
362
  </div>
363
  <div class="pmpro_chart_area">
364
  <div id="chart_div"></div>
540
  } elseif( ! empty( $year ) && $period === 'monthly' ) {
541
  $date = $year;
542
  } else {
543
+ $date = __( 'All Time', 'paid-memberships-pro' );
544
  }
545
  ?>
546
  return <?php echo wp_json_encode( esc_html( sprintf( __( '%s %s for %s', 'paid-memberships-pro' ), ucwords( $period ), ucwords( $type ), ucwords( $date ) ) ) ); ?>;
adminpages/templates/orders-email.php CHANGED
@@ -1,75 +1,78 @@
1
- <?php
2
- /**
3
- * Template for Email Invoices
4
- *
5
- * @since 1.8.6
6
- */
7
- ?>
8
- <table style="width:600px;margin-left:auto;margin-right:auto;">
9
- <thead>
10
- <tr>
11
- <td rowspan="2" style="width:80%;">
12
- <h2><?php bloginfo( 'sitename' ); ?></h2>
13
- </td>
14
- <td><?php echo __('Invoice #: ', 'paid-memberships-pro' ) . '&nbsp;' . $order->code; ?></td>
15
- </tr>
16
- <tr>
17
- <td>
18
- <?php echo __( 'Date:', 'paid-memberships-pro' ) . '&nbsp;' . date_i18n( get_option( 'date_format' ), $order->getTimestamp() ); ?>
19
- </td>
20
- </tr>
21
- <?php if(!empty($order->billing->name)): ?>
22
- <tr>
23
- <td style="padding-bottom:10px;">
24
- <strong><?php _e( 'Bill to:', 'paid-memberships-pro' ); ?></strong><br>
25
- <?php
26
- echo pmpro_formatAddress(
27
- $order->billing->name,
28
- $order->billing->street,
29
- "",
30
- $order->billing->city,
31
- $order->billing->state,
32
- $order->billing->zip,
33
- $order->billing->country,
34
- $order->billing->phone
35
- );
36
- ?>
37
- <?php endif; ?>
38
- </td>
39
- </tr>
40
- </thead>
41
- <tbody>
42
- <tr>
43
- <td colspan="2">
44
- <table style="width:100%;border-width:0px;border-collapse:collapse;">
45
- <tr style="border-width:1px;border-style:solid;border-collapse:collapse;">
46
- <th style="text-align:center;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php _e('ID', 'paid-memberships-pro' ); ?></th>
47
- <th style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php _e('Item', 'paid-memberships-pro' ); ?></th>
48
- <th style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php _e('Price', 'paid-memberships-pro' ); ?></th>
49
- </tr>
50
- <tr style="border-width:1px;border-style:solid;border-collapse:collapse;">
51
- <td style="text-align:center;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php echo $level->id; ?></td>
52
- <td style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php echo $level->name; ?></td>
53
- <td style="border-width:1px;border-style:solid;border-collapse:collapse;text-align:right;padding:4px;"><?php echo pmpro_escape_price( pmpro_formatPrice( $order->subtotal ) ); ?></td>
54
- </tr>
55
- <?php
56
- if ( (float)$order->total > 0 ) {
57
- $pmpro_price_parts = pmpro_get_price_parts( $order, 'array' );
58
- foreach ( $pmpro_price_parts as $pmpro_price_part ) { ?>
59
- <tr style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;">
60
- <th colspan="2" style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;">
61
- <?php esc_html_e( $pmpro_price_part['label'] ); ?>
62
- </th>
63
- <td style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;">
64
- <?php esc_html_e( $pmpro_price_part['value'] ); ?>
65
- </td>
66
- </tr>
67
- <?php
68
- }
69
- }
70
- ?>
71
- </table>
72
- </td>
73
- </tr>
74
- </tbody>
75
- </table>
 
 
 
1
+ <?php
2
+ /**
3
+ * Template for Email Invoices
4
+ *
5
+ * @since 1.8.6
6
+ *
7
+ * @var object $level
8
+ * @var MemberOrder $order
9
+ */
10
+ ?>
11
+ <table style="width:600px;margin-left:auto;margin-right:auto;">
12
+ <thead>
13
+ <tr>
14
+ <td rowspan="2" style="width:80%;">
15
+ <h2><?php bloginfo( 'sitename' ); ?></h2>
16
+ </td>
17
+ <td><?php echo esc_html( __('Invoice #: ', 'paid-memberships-pro' ) . '&nbsp;' . $order->code ); ?></td>
18
+ </tr>
19
+ <tr>
20
+ <td>
21
+ <?php echo esc_html( __( 'Date:', 'paid-memberships-pro' ) . '&nbsp;' . date_i18n( get_option( 'date_format' ), $order->getTimestamp() ) ); ?>
22
+ </td>
23
+ </tr>
24
+ <?php if(!empty($order->billing->name)): ?>
25
+ <tr>
26
+ <td style="padding-bottom:10px;">
27
+ <strong><?php esc_html_e( 'Bill to:', 'paid-memberships-pro' ); ?></strong><br>
28
+ <?php
29
+ echo pmpro_formatAddress(
30
+ $order->billing->name,
31
+ $order->billing->street,
32
+ "",
33
+ $order->billing->city,
34
+ $order->billing->state,
35
+ $order->billing->zip,
36
+ $order->billing->country,
37
+ $order->billing->phone
38
+ );
39
+ ?>
40
+ <?php endif; ?>
41
+ </td>
42
+ </tr>
43
+ </thead>
44
+ <tbody>
45
+ <tr>
46
+ <td colspan="2">
47
+ <table style="width:100%;border-width:0px;border-collapse:collapse;">
48
+ <tr style="border-width:1px;border-style:solid;border-collapse:collapse;">
49
+ <th style="text-align:center;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php esc_html_e('ID', 'paid-memberships-pro' ); ?></th>
50
+ <th style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php esc_html_e('Item', 'paid-memberships-pro' ); ?></th>
51
+ <th style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php esc_html_e('Price', 'paid-memberships-pro' ); ?></th>
52
+ </tr>
53
+ <tr style="border-width:1px;border-style:solid;border-collapse:collapse;">
54
+ <td style="text-align:center;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php echo $level->id; ?></td>
55
+ <td style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;"><?php echo $level->name; ?></td>
56
+ <td style="border-width:1px;border-style:solid;border-collapse:collapse;text-align:right;padding:4px;"><?php echo pmpro_escape_price( pmpro_formatPrice( $order->subtotal ) ); ?></td>
57
+ </tr>
58
+ <?php
59
+ if ( (float)$order->total > 0 ) {
60
+ $pmpro_price_parts = pmpro_get_price_parts( $order, 'array' );
61
+ foreach ( $pmpro_price_parts as $pmpro_price_part ) { ?>
62
+ <tr style="border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;">
63
+ <th colspan="2" style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;">
64
+ <?php esc_html_e( $pmpro_price_part['label'] ); ?>
65
+ </th>
66
+ <td style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;padding:4px;">
67
+ <?php esc_html_e( $pmpro_price_part['value'] ); ?>
68
+ </td>
69
+ </tr>
70
+ <?php
71
+ }
72
+ }
73
+ ?>
74
+ </table>
75
+ </td>
76
+ </tr>
77
+ </tbody>
78
+ </table>
adminpages/templates/orders-print.php CHANGED
@@ -1,103 +1,106 @@
1
- <?php
2
- /**
3
- * Template for Print Invoices
4
- *
5
- * @since 1.8.6
6
- */
7
- ?>
8
- <!doctype html>
9
- <html lang="en">
10
- <head>
11
- <meta charset="UTF-8">
12
- <style>
13
- .main, .header {
14
- display: block;
15
- }
16
- .right {
17
- display: inline-block;
18
- float: right;
19
- }
20
- .alignright {
21
- text-align: right;
22
- }
23
- .aligncenter {
24
- text-align: center;
25
- }
26
- .invoice, .invoice tr, .invoice th, .invoice td {
27
- border: 1px solid;
28
- border-collapse: collapse;
29
- padding: 4px;
30
- }
31
- .invoice {
32
- width: 100%;
33
- }
34
- @media screen {
35
- body {
36
- max-width: 50%;
37
- margin: 0 auto;
38
- }
39
- }
40
- </style>
41
- </head>
42
- <body>
43
- <header class="header">
44
- <div>
45
- <h2><?php bloginfo( 'sitename' ); ?></h2>
46
- </div>
47
- <div class="right">
48
- <table>
49
- <tr>
50
- <td><?php echo __('Invoice #: ', 'paid-memberships-pro' ) . '&nbsp;' . $order->code; ?></td>
51
- </tr>
52
- <tr>
53
- <td>
54
- <?php echo __( 'Date:', 'paid-memberships-pro' ) . '&nbsp;' . date_i18n( get_option( 'date_format' ), $order->getTimestamp() ); ?>
55
- </td>
56
- </tr>
57
- </table>
58
- </div>
59
- </header>
60
- <main class="main">
61
- <p>
62
- <?php echo pmpro_formatAddress(
63
- $order->billing->name,
64
- $order->billing->street,
65
- '',
66
- $order->billing->city,
67
- $order->billing->state,
68
- $order->billing->zip,
69
- $order->billing->country,
70
- $order->billing->phone
71
- ); ?>
72
- </p>
73
- <table class="invoice" style="border-width:0px;border-collapse:collapse;">
74
- <tr>
75
- <th><?php _e('ID', 'paid-memberships-pro' ); ?></th>
76
- <th><?php _e('Item', 'paid-memberships-pro' ); ?></th>
77
- <th><?php _e('Price', 'paid-memberships-pro' ); ?></th>
78
- </tr>
79
- <tr>
80
- <td class="aligncenter"><?php echo $level->id; ?></td>
81
- <td><?php echo $level->name; ?></td>
82
- <td class="alignright"><?php echo pmpro_escape_price( pmpro_formatPrice( $order->subtotal ) ); ?></td>
83
- </tr>
84
- <?php
85
- if ( (float)$order->total > 0 ) {
86
- $pmpro_price_parts = pmpro_get_price_parts( $order, 'array' );
87
- foreach ( $pmpro_price_parts as $pmpro_price_part ) { ?>
88
- <tr style="border-width:1px;border-style:solid;border-collapse:collapse;">
89
- <th colspan="2" style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;">
90
- <?php esc_html_e( $pmpro_price_part['label'] ); ?>
91
- </th>
92
- <td style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;">
93
- <?php esc_html_e( $pmpro_price_part['value'] ); ?>
94
- </td>
95
- </tr>
96
- <?php
97
- }
98
- }
99
- ?>
100
- </table>
101
- </main>
102
- </body>
103
- </html>
 
 
 
1
+ <?php
2
+ /**
3
+ * Template for Print Invoices
4
+ *
5
+ * @since 1.8.6
6
+ *
7
+ * @var object $level
8
+ * @var MemberOrder $order
9
+ */
10
+ ?>
11
+ <!doctype html>
12
+ <html lang="en">
13
+ <head>
14
+ <meta charset="UTF-8">
15
+ <style>
16
+ .main, .header {
17
+ display: block;
18
+ }
19
+ .right {
20
+ display: inline-block;
21
+ float: right;
22
+ }
23
+ .alignright {
24
+ text-align: right;
25
+ }
26
+ .aligncenter {
27
+ text-align: center;
28
+ }
29
+ .invoice, .invoice tr, .invoice th, .invoice td {
30
+ border: 1px solid;
31
+ border-collapse: collapse;
32
+ padding: 4px;
33
+ }
34
+ .invoice {
35
+ width: 100%;
36
+ }
37
+ @media screen {
38
+ body {
39
+ max-width: 50%;
40
+ margin: 0 auto;
41
+ }
42
+ }
43
+ </style>
44
+ </head>
45
+ <body>
46
+ <header class="header">
47
+ <div>
48
+ <h2><?php bloginfo( 'sitename' ); ?></h2>
49
+ </div>
50
+ <div class="right">
51
+ <table>
52
+ <tr>
53
+ <td><?php echo esc_html( __('Invoice #: ', 'paid-memberships-pro' ) . '&nbsp;' . $order->code ); ?></td>
54
+ </tr>
55
+ <tr>
56
+ <td>
57
+ <?php echo __( 'Date:', 'paid-memberships-pro' ) . '&nbsp;' . date_i18n( get_option( 'date_format' ), $order->getTimestamp() ); ?>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ </div>
62
+ </header>
63
+ <main class="main">
64
+ <p>
65
+ <?php echo pmpro_formatAddress(
66
+ $order->billing->name,
67
+ $order->billing->street,
68
+ '',
69
+ $order->billing->city,
70
+ $order->billing->state,
71
+ $order->billing->zip,
72
+ $order->billing->country,
73
+ $order->billing->phone
74
+ ); ?>
75
+ </p>
76
+ <table class="invoice" style="border-width:0px;border-collapse:collapse;">
77
+ <tr>
78
+ <th><?php esc_html_e('ID', 'paid-memberships-pro' ); ?></th>
79
+ <th><?php esc_html_e('Item', 'paid-memberships-pro' ); ?></th>
80
+ <th><?php esc_html_e('Price', 'paid-memberships-pro' ); ?></th>
81
+ </tr>
82
+ <tr>
83
+ <td class="aligncenter"><?php echo $level->id; ?></td>
84
+ <td><?php echo $level->name; ?></td>
85
+ <td class="alignright"><?php echo pmpro_escape_price( pmpro_formatPrice( $order->subtotal ) ); ?></td>
86
+ </tr>
87
+ <?php
88
+ if ( (float)$order->total > 0 ) {
89
+ $pmpro_price_parts = pmpro_get_price_parts( $order, 'array' );
90
+ foreach ( $pmpro_price_parts as $pmpro_price_part ) { ?>
91
+ <tr style="border-width:1px;border-style:solid;border-collapse:collapse;">
92
+ <th colspan="2" style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;">
93
+ <?php esc_html_e( $pmpro_price_part['label'] ); ?>
94
+ </th>
95
+ <td style="text-align:right;border-width:1px;border-style:solid;border-collapse:collapse;">
96
+ <?php esc_html_e( $pmpro_price_part['value'] ); ?>
97
+ </td>
98
+ </tr>
99
+ <?php
100
+ }
101
+ }
102
+ ?>
103
+ </table>
104
+ </main>
105
+ </body>
106
+ </html>
adminpages/updates.php CHANGED
@@ -11,14 +11,14 @@
11
  require_once(dirname(__FILE__) . "/admin_header.php");
12
  ?>
13
 
14
- <h2><?php _e('Updating Paid Memberships Pro', 'paid-memberships-pro' );?></h2>
15
 
16
  <?php
17
  $updates = get_option('pmpro_updates', array());
18
  if(!empty($updates)) {
19
  //let's process the first one
20
  ?>
21
- <p id="pmpro_updates_intro"><?php _e('Updates are processing. This may take a few minutes to complete.', 'paid-memberships-pro' );?></p>
22
  <p id="pmpro_updates_progress">[...]</p>
23
  <textarea id="pmpro_updates_status" rows="10" cols="60"><?php echo esc_textarea( __( 'Loading...', 'paid-memberships-pro' ) ); ?></textarea>
24
 
11
  require_once(dirname(__FILE__) . "/admin_header.php");
12
  ?>
13
 
14
+ <h2><?php esc_html_e('Updating Paid Memberships Pro', 'paid-memberships-pro' );?></h2>
15
 
16
  <?php
17
  $updates = get_option('pmpro_updates', array());
18
  if(!empty($updates)) {
19
  //let's process the first one
20
  ?>
21
+ <p id="pmpro_updates_intro"><?php esc_html_e('Updates are processing. This may take a few minutes to complete.', 'paid-memberships-pro' );?></p>
22
  <p id="pmpro_updates_progress">[...]</p>
23
  <textarea id="pmpro_updates_status" rows="10" cols="60"><?php echo esc_textarea( __( 'Loading...', 'paid-memberships-pro' ) ); ?></textarea>
24
 
blocks/account-invoices-section/block.js CHANGED
@@ -19,15 +19,24 @@
19
  export default registerBlockType(
20
  'pmpro/account-invoices-section',
21
  {
22
- title: __( 'Membership Account: Invoices', 'paid-memberships-pro' ),
23
- description: __( 'Displays the member\'s invoices.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'archive',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/account-invoices-section',
21
  {
22
+ title: __( 'PMPro Page: Account Invoices', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section that displays a list of the last 5 membership invoices for the active member.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'archive',
29
  },
30
+ keywords: [
31
+ __( 'account', 'paid-memberships-pro' ),
32
+ __( 'member', 'paid-memberships-pro' ),
33
+ __( 'order', 'paid-memberships-pro' ),
34
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
35
+ __( 'pmpro', 'paid-memberships-pro' ),
36
+ __( 'purchases', 'paid-memberships-pro' ),
37
+ __( 'receipt', 'paid-memberships-pro' ),
38
+ __( 'user', 'paid-memberships-pro' ),
39
+ ],
40
  supports: {
41
  },
42
  attributes: {
blocks/account-links-section/block.js CHANGED
@@ -19,15 +19,24 @@
19
  export default registerBlockType(
20
  'pmpro/account-links-section',
21
  {
22
- title: __( 'Membership Account: Links', 'paid-memberships-pro' ),
23
- description: __( 'Displays the member\'s member links. This block is only visible if other Add Ons or custom code have added links.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'external',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/account-links-section',
21
  {
22
+ title: __( 'PMPro Page: Account Links', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section that displays custom links available for the active member only. This block is only visible if other Add Ons or custom code have added links.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'external',
29
  },
30
+ keywords: [
31
+ __( 'access', 'paid-memberships-pro' ),
32
+ __( 'account', 'paid-memberships-pro' ),
33
+ __( 'link', 'paid-memberships-pro' ),
34
+ __( 'member', 'paid-memberships-pro' ),
35
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
36
+ __( 'pmpro', 'paid-memberships-pro' ),
37
+ __( 'quick link', 'paid-memberships-pro' ),
38
+ __( 'user', 'paid-memberships-pro' ),
39
+ ],
40
  supports: {
41
  },
42
  attributes: {
blocks/account-membership-section/block.js CHANGED
@@ -19,15 +19,22 @@
19
  export default registerBlockType(
20
  'pmpro/account-membership-section',
21
  {
22
- title: __( 'Membership Account: Memberships', 'paid-memberships-pro' ),
23
- description: __( 'Displays the member\'s membership information.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'groups',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/account-membership-section',
21
  {
22
+ title: __( 'PMPro Page: Account Memberships', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section to display the member\'s active membership information with links to view all membership options, update billing information, and change or cancel membership.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'groups',
29
  },
30
+ keywords: [
31
+ __( 'active', 'paid-memberships-pro' ),
32
+ __( 'member', 'paid-memberships-pro' ),
33
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
34
+ __( 'pmpro', 'paid-memberships-pro' ),
35
+ __( 'purchases', 'paid-memberships-pro' ),
36
+ __( 'user', 'paid-memberships-pro' ),
37
+ ],
38
  supports: {
39
  },
40
  attributes: {
blocks/account-page/block.js CHANGED
@@ -21,15 +21,29 @@
21
  export default registerBlockType(
22
  'pmpro/account-page',
23
  {
24
- title: __( 'Membership Account Page', 'paid-memberships-pro' ),
25
- description: __( 'Displays the sections of the Membership Account page as selected below.', 'paid-memberships-pro' ),
26
- category: 'pmpro',
27
  icon: {
28
- background: '#2997c8',
29
- foreground: '#ffffff',
30
  src: 'admin-users',
31
  },
32
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  supports: {
34
  },
35
  attributes: {
21
  export default registerBlockType(
22
  'pmpro/account-page',
23
  {
24
+ title: __( 'PMPro Page: Account (Full)', 'paid-memberships-pro' ),
25
+ description: __( 'Dynamic page section to display the selected sections of the Membership Account page including Memberships, Profile, Invoices, and Member Links. These sections can also be added via separate blocks.', 'paid-memberships-pro' ),
26
+ category: 'pmpro-pages',
27
  icon: {
28
+ background: '#FFFFFF',
29
+ foreground: '#1A688B',
30
  src: 'admin-users',
31
  },
32
+ keywords: [
33
+ __( 'account', 'paid-memberships-pro' ),
34
+ __( 'billing', 'paid-memberships-pro' ),
35
+ __( 'invoice', 'paid-memberships-pro' ),
36
+ __( 'links', 'paid-memberships-pro' ),
37
+ __( 'member', 'paid-memberships-pro' ),
38
+ __( 'order', 'paid-memberships-pro' ),
39
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
40
+ __( 'pmpro', 'paid-memberships-pro' ),
41
+ __( 'profile', 'paid-memberships-pro' ),
42
+ __( 'purchases', 'paid-memberships-pro' ),
43
+ __( 'quick link', 'paid-memberships-pro' ),
44
+ __( 'receipt', 'paid-memberships-pro' ),
45
+ __( 'user', 'paid-memberships-pro' ),
46
+ ],
47
  supports: {
48
  },
49
  attributes: {
blocks/account-profile-section/block.js CHANGED
@@ -20,15 +20,21 @@
20
  export default registerBlockType(
21
  'pmpro/account-profile-section',
22
  {
23
- title: __( 'Membership Account: Profile', 'paid-memberships-pro' ),
24
- description: __( 'Displays the member\'s profile information.', 'paid-memberships-pro' ),
25
- category: 'pmpro',
26
  icon: {
27
- background: '#2997c8',
28
- foreground: '#ffffff',
29
  src: 'admin-users',
30
  },
31
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
32
  supports: {
33
  },
34
  attributes: {
20
  export default registerBlockType(
21
  'pmpro/account-profile-section',
22
  {
23
+ title: __( 'PMPro Page: Account Profile View', 'paid-memberships-pro' ),
24
+ description: __( 'Dynamic page section that displays the member\'s profile as read-only information with a link to edit fields or their change password.', 'paid-memberships-pro' ),
25
+ category: 'pmpro-pages',
26
  icon: {
27
+ background: '#FFFFFF',
28
+ foreground: '#1A688B',
29
  src: 'admin-users',
30
  },
31
+ keywords: [
32
+ __( 'fields', 'paid-memberships-pro' ),
33
+ __( 'member', 'paid-memberships-pro' ),
34
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
35
+ __( 'pmpro', 'paid-memberships-pro' ),
36
+ __( 'user', 'paid-memberships-pro' ),
37
+ ],
38
  supports: {
39
  },
40
  attributes: {
blocks/billing-page/block.js CHANGED
@@ -19,15 +19,21 @@
19
  export default registerBlockType(
20
  'pmpro/billing-page',
21
  {
22
- title: __( 'Membership Billing Page', 'paid-memberships-pro' ),
23
- description: __( 'Displays the member\'s billing information and allows them to update the payment method.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'list-view',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/billing-page',
21
  {
22
+ title: __( 'PMPro Page: Billing', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section to display the member\'s billing information. Members can update their subscription payment method from this form.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'list-view',
29
  },
30
+ keywords: [
31
+ __( 'credit card', 'paid-memberships-pro' ),
32
+ __( 'member', 'paid-memberships-pro' ),
33
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
34
+ __( 'payment method', 'paid-memberships-pro' ),
35
+ __( 'pmpro', 'paid-memberships-pro' ),
36
+ ],
37
  supports: {
38
  },
39
  attributes: {
blocks/blocks.js CHANGED
@@ -108,4 +108,5 @@ import './login/block.js';
108
  L5.33,4.91L9.46,3.96z"/>
109
  </svg>;
110
  wp.blocks.updateCategory( 'pmpro', { icon: PMProSVG } );
 
111
  } )();
108
  L5.33,4.91L9.46,3.96z"/>
109
  </svg>;
110
  wp.blocks.updateCategory( 'pmpro', { icon: PMProSVG } );
111
+ wp.blocks.updateCategory( 'pmpro-pages', { icon: PMProSVG } );
112
  } )();
blocks/blocks.php CHANGED
@@ -40,6 +40,10 @@ function pmpro_place_blocks_in_panel( $categories, $post_or_context ) {
40
  'slug' => 'pmpro',
41
  'title' => __( 'Paid Memberships Pro', 'paid-memberships-pro' ),
42
  ),
 
 
 
 
43
  )
44
  );
45
  }
40
  'slug' => 'pmpro',
41
  'title' => __( 'Paid Memberships Pro', 'paid-memberships-pro' ),
42
  ),
43
+ array(
44
+ 'slug' => 'pmpro-pages',
45
+ 'title' => __( 'Paid Memberships Pro Pages', 'paid-memberships-pro' ),
46
+ ),
47
  )
48
  );
49
  }
blocks/cancel-page/block.js CHANGED
@@ -19,15 +19,21 @@
19
  export default registerBlockType(
20
  'pmpro/cancel-page',
21
  {
22
- title: __( 'Membership Cancel Page', 'paid-memberships-pro' ),
23
- description: __( 'Generates the Membership Cancel page.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'no',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/cancel-page',
21
  {
22
+ title: __( 'PMPro Page: Cancel', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section where members can cancel their membership and active subscription if applicable.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'no',
29
  },
30
+ keywords: [
31
+ __( 'member', 'paid-memberships-pro' ),
32
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
33
+ __( 'payment method', 'paid-memberships-pro' ),
34
+ __( 'pmpro', 'paid-memberships-pro' ),
35
+ __( 'terminate', 'paid-memberships-pro' ),
36
+ ],
37
  supports: {
38
  },
39
  attributes: {
blocks/checkout-button/block.js CHANGED
@@ -29,17 +29,20 @@ export default registerBlockType(
29
  'pmpro/checkout-button',
30
  {
31
  title: __( 'Membership Checkout Button', 'paid-memberships-pro' ),
32
- description: __( 'Displays a button-styled link to Membership Checkout for the specified level.', 'paid-memberships-pro' ),
33
  category: 'pmpro',
34
  icon: {
35
- background: '#2997c8',
36
- foreground: '#ffffff',
37
  src: 'migrate',
38
  },
39
- keywords: [
40
- __( 'pmpro', 'paid-memberships-pro' ),
41
  __( 'buy', 'paid-memberships-pro' ),
42
  __( 'level', 'paid-memberships-pro' ),
 
 
 
 
43
  ],
44
  supports: {
45
  },
29
  'pmpro/checkout-button',
30
  {
31
  title: __( 'Membership Checkout Button', 'paid-memberships-pro' ),
32
+ description: __( 'Inserts a button that links directly to membership checkout for the selected level.', 'paid-memberships-pro' ),
33
  category: 'pmpro',
34
  icon: {
35
+ background: '#FFFFFF',
36
+ foreground: '#658B24',
37
  src: 'migrate',
38
  },
39
+ keywords: [
 
40
  __( 'buy', 'paid-memberships-pro' ),
41
  __( 'level', 'paid-memberships-pro' ),
42
+ __( 'member', 'paid-memberships-pro' ),
43
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
44
+ __( 'pmpro', 'paid-memberships-pro' ),
45
+ __( 'purchase', 'paid-memberships-pro' ),
46
  ],
47
  supports: {
48
  },
blocks/checkout-page/block.js CHANGED
@@ -26,14 +26,21 @@ const {
26
  'pmpro/checkout-page',
27
  {
28
  title: __( 'Membership Checkout Form', 'paid-memberships-pro' ),
29
- description: __( 'Displays the Membership Checkout form.', 'paid-memberships-pro' ),
30
  category: 'pmpro',
31
  icon: {
32
- background: '#2997c8',
33
- foreground: '#ffffff',
34
  src: 'list-view',
35
  },
36
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
37
  supports: {
38
  },
39
  attributes: {
26
  'pmpro/checkout-page',
27
  {
28
  title: __( 'Membership Checkout Form', 'paid-memberships-pro' ),
29
+ description: __( 'Dynamic form that allows users to complete free registration or paid checkout for the selected membership level.', 'paid-memberships-pro' ),
30
  category: 'pmpro',
31
  icon: {
32
+ background: '#FFFFFF',
33
+ foreground: '#658B24',
34
  src: 'list-view',
35
  },
36
+ keywords: [
37
+ __( 'member', 'paid-memberships-pro' ),
38
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
39
+ __( 'pmpro', 'paid-memberships-pro' ),
40
+ __( 'buy', 'paid-memberships-pro' ),
41
+ __( 'purchase', 'paid-memberships-pro' ),
42
+ __( 'sell', 'paid-memberships-pro' ),
43
+ ],
44
  supports: {
45
  },
46
  attributes: {
blocks/confirmation-page/block.js CHANGED
@@ -19,15 +19,23 @@
19
  export default registerBlockType(
20
  'pmpro/confirmation-page',
21
  {
22
- title: __( 'Membership Confirmation Page', 'paid-memberships-pro' ),
23
- description: __( 'Displays the member\'s Membership Confirmation after Membership Checkout.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'yes',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/confirmation-page',
21
  {
22
+ title: __( 'PMPro Page: Confirmation', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section that displays a confirmation message and purchase information for the active member immediately after membership registration and checkout.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'yes',
29
  },
30
+ keywords: [
31
+ __( 'member', 'paid-memberships-pro' ),
32
+ __( 'buy', 'paid-memberships-pro' ),
33
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
34
+ __( 'pmpro', 'paid-memberships-pro' ),
35
+ __( 'purchase', 'paid-memberships-pro' ),
36
+ __( 'receipt', 'paid-memberships-pro' ),
37
+ __( 'success', 'paid-memberships-pro' ),
38
+ ],
39
  supports: {
40
  },
41
  attributes: {
blocks/invoice-page/block.js CHANGED
@@ -19,15 +19,22 @@
19
  export default registerBlockType(
20
  'pmpro/invoice-page',
21
  {
22
- title: __( 'Membership Invoice Page', 'paid-memberships-pro' ),
23
- description: __( 'Displays the member\'s Membership Invoices.', 'paid-memberships-pro' ),
24
- category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'archive',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/invoice-page',
21
  {
22
+ title: __( 'PMPro Page: Invoice', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section that displays a list of all invoices (purchase history) for the active member. Each invoice can be selected and viewed in full detail.', 'paid-memberships-pro' ),
24
+ category: 'pmpro-pages',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#1A688B',
28
  src: 'archive',
29
  },
30
+ keywords: [
31
+ __( 'history', 'paid-memberships-pro' ),
32
+ __( 'order', 'paid-memberships-pro' ),
33
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
34
+ __( 'pmpro', 'paid-memberships-pro' ),
35
+ __( 'purchases', 'paid-memberships-pro' ),
36
+ __( 'receipt', 'paid-memberships-pro' ),
37
+ ],
38
  supports: {
39
  },
40
  attributes: {
blocks/levels-page/block.js CHANGED
@@ -19,15 +19,21 @@
19
  export default registerBlockType(
20
  'pmpro/levels-page',
21
  {
22
- title: __( 'Membership Levels List', 'paid-memberships-pro' ),
23
- description: __( 'Displays a list of Membership Levels. To change the order, go to Memberships > Settings > Levels.', 'paid-memberships-pro' ),
24
  category: 'pmpro',
25
  icon: {
26
- background: '#2997c8',
27
- foreground: '#ffffff',
28
  src: 'list-view',
29
  },
30
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
31
  supports: {
32
  },
33
  attributes: {
19
  export default registerBlockType(
20
  'pmpro/levels-page',
21
  {
22
+ title: __( 'Membership Levels and Pricing Table', 'paid-memberships-pro' ),
23
+ description: __( 'Dynamic page section that displays a list of membership levels and pricing, linked to membership checkout. To reorder the display, navigate to Memberships > Settings > Levels.', 'paid-memberships-pro' ),
24
  category: 'pmpro',
25
  icon: {
26
+ background: '#FFFFFF',
27
+ foreground: '#658B24',
28
  src: 'list-view',
29
  },
30
+ keywords: [
31
+ __( 'level', 'paid-memberships-pro' ),
32
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
33
+ __( 'pmpro', 'paid-memberships-pro' ),
34
+ __( 'price', 'paid-memberships-pro' ),
35
+ __( 'pricing table', 'paid-memberships-pro' ),
36
+ ],
37
  supports: {
38
  },
39
  attributes: {
blocks/login/block.js CHANGED
@@ -19,37 +19,38 @@ const { Fragment } = wp.element;
19
  /**
20
  * Register block
21
  */
22
- export default registerBlockType("pmpro/login-form", {
23
- title: __("Log in Form", "paid-memberships-pro"),
24
- description: __(
25
- "Displays a Log In Form for Paid Memberships Pro.",
26
- "paid-memberships-pro"
27
- ),
28
- category: "pmpro",
29
- icon: {
30
- background: "#2997c8",
31
- foreground: "#ffffff",
32
- src: "unlock",
33
- },
34
- keywords: [
35
- __("pmpro", "paid-memberships-pro"),
36
- __("login", "paid-memberships-pro"),
37
- __("form", "paid-memberships-pro"),
38
- __("log in", "paid-memberships-pro"),
39
- ],
40
- supports: {},
41
- edit: (props) => {
42
- return [
43
- <Fragment>
44
- <Inspector {...props} />
45
- <div className="pmpro-block-element">
46
- <span className="pmpro-block-title">{__("Paid Memberships Pro", "paid-memberships-pro")}</span>
47
- <span className="pmpro-block-subtitle">{__("Log in Form", "paid-memberships-pro")}</span>
48
- </div>
49
- </Fragment>,
50
- ];
51
- },
52
- save() {
53
- return null;
54
- },
55
- });
 
19
  /**
20
  * Register block
21
  */
22
+ export default registerBlockType(
23
+ 'pmpro/login-form',
24
+ {
25
+ title: __( 'Login Form', 'paid-memberships-pro' ),
26
+ description: __( 'Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.', 'paid-memberships-pro' ),
27
+ category: 'pmpro',
28
+ icon: {
29
+ background: '#FFFFFF',
30
+ foreground: '#658B24',
31
+ src: 'unlock',
32
+ },
33
+ keywords: [
34
+ __( 'log in', 'paid-memberships-pro' ),
35
+ __( 'lost password', 'paid-memberships-pro' ),
36
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
37
+ __( 'password reset', 'paid-memberships-pro' ),
38
+ __( 'pmpro', 'paid-memberships-pro' ),
39
+ ],
40
+ supports: {},
41
+ edit: (props) => {
42
+ return [
43
+ <Fragment>
44
+ <Inspector {...props} />
45
+ <div className="pmpro-block-element">
46
+ <span className="pmpro-block-title">{__("Paid Memberships Pro", "paid-memberships-pro")}</span>
47
+ <span className="pmpro-block-subtitle">{__("Log in Form", "paid-memberships-pro")}</span>
48
+ </div>
49
+ </Fragment>,
50
+ ];
51
+ },
52
+ save() {
53
+ return null;
54
+ },
55
+ }
56
+ );
blocks/member-profile-edit/block.js CHANGED
@@ -13,31 +13,36 @@ const { registerBlockType } = wp.blocks;
13
  /**
14
  * Register block
15
  */
16
- export default registerBlockType("pmpro/member-profile-edit", {
17
- title: __("Member Profile Edit", "paid-memberships-pro"),
18
- description: __("Allow member profile editing.", "paid-memberships-pro"),
19
- category: "pmpro",
20
- icon: {
21
- background: "#2997c8",
22
- foreground: "#ffffff",
23
- src: "admin-users",
24
- },
25
- keywords: [
26
- __("pmpro", "paid-memberships-pro"),
27
- __("member", "paid-memberships-pro"),
28
- __("profile", "paid-memberships-pro"),
29
- ],
30
- edit: (props) => {
31
- return (
32
- <div className="pmpro-block-element">
33
- <span className="pmpro-block-title">{__("Paid Memberships Pro", "paid-memberships-pro")}</span>
34
- <span className="pmpro-block-subtitle">
35
- {__("Member Profile Edit", "paid-memberships-pro")}
36
- </span>
37
- </div>
38
- );
39
- },
40
- save() {
41
- return null;
42
- },
43
- });
 
 
 
 
 
13
  /**
14
  * Register block
15
  */
16
+ export default registerBlockType(
17
+ 'pmpro/member-profile-edit',
18
+ {
19
+ title: __( 'PMPro Page: Account Profile Edit', 'paid-memberships-pro' ),
20
+ description: __( 'Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.', 'paid-memberships-pro' ),
21
+ category: 'pmpro-pages',
22
+ icon: {
23
+ background: '#FFFFFF',
24
+ foreground: '#1A688B',
25
+ src: 'admin-users',
26
+ },
27
+ keywords: [
28
+ __( 'custom field', 'paid-memberships-pro' ),
29
+ __( 'fields', 'paid-memberships-pro' ),
30
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
31
+ __( 'pmpro', 'paid-memberships-pro' ),
32
+ __( 'user fields', 'paid-memberships-pro' ),
33
+ ],
34
+ edit: (props) => {
35
+ return (
36
+ <div className="pmpro-block-element">
37
+ <span className="pmpro-block-title">{__("Paid Memberships Pro", "paid-memberships-pro")}</span>
38
+ <span className="pmpro-block-subtitle">
39
+ {__("Member Profile Edit", "paid-memberships-pro")}
40
+ </span>
41
+ </div>
42
+ );
43
+ },
44
+ save() {
45
+ return null;
46
+ },
47
+ }
48
+ );
blocks/membership/block.js CHANGED
@@ -9,11 +9,12 @@
9
  */
10
  const { __ } = wp.i18n;
11
  const {
12
- registerBlockType,
13
  } = wp.blocks;
14
  const {
15
  PanelBody,
16
  CheckboxControl,
 
17
  } = wp.components;
18
  const {
19
  InspectorControls,
@@ -28,15 +29,25 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_
28
  export default registerBlockType(
29
  'pmpro/membership',
30
  {
31
- title: __( 'Require Membership Block', 'paid-memberships-pro' ),
32
- description: __( 'Control the visibility of nested blocks for members or non-members.', 'paid-memberships-pro' ),
33
  category: 'pmpro',
34
  icon: {
35
- background: '#2997c8',
36
- foreground: '#ffffff',
37
  src: 'visibility',
38
  },
39
- keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ],
 
 
 
 
 
 
 
 
 
 
40
  attributes: {
41
  levels: {
42
  type: 'array',
@@ -46,9 +57,13 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_
46
  type: 'string',
47
  default:'',
48
  },
 
 
 
 
49
  },
50
  edit: props => {
51
- const { attributes: {levels, uid}, setAttributes, isSelected } = props;
52
  if( uid=='' ) {
53
  var rand = Math.random()+"";
54
  setAttributes( { uid:rand } );
@@ -69,7 +84,7 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_
69
  }
70
  }
71
  return [
72
- <CheckboxControl
73
  label = { level.label }
74
  checked = { levels.some( levelID => levelID == level.value ) }
75
  onChange = { setLevelsAttribute }
@@ -79,17 +94,31 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_
79
 
80
  return [
81
  isSelected && <InspectorControls>
82
- <PanelBody>
 
83
  <div class="pmpro-block-inspector-scrollable">
84
  {checkboxes}
85
  </div>
 
 
 
 
 
 
 
 
 
 
 
86
  </PanelBody>
87
  </InspectorControls>,
88
  isSelected && <div className="pmpro-block-require-membership-element" >
89
- <span className="pmpro-block-title">{ __( 'Require Membership', 'paid-memberships-pro' ) }</span>
 
90
  <PanelBody>
91
  {checkboxes}
92
  </PanelBody>
 
93
  <InnerBlocks
94
  renderAppender={ () => (
95
  <InnerBlocks.ButtonBlockAppender />
@@ -98,7 +127,7 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_
98
  />
99
  </div>,
100
  ! isSelected && <div className="pmpro-block-require-membership-element" >
101
- <span className="pmpro-block-title">{ __( 'Require Membership', 'paid-memberships-pro' ) }</span>
102
  <InnerBlocks
103
  renderAppender={ () => (
104
  <InnerBlocks.ButtonBlockAppender />
9
  */
10
  const { __ } = wp.i18n;
11
  const {
12
+ registerBlockType
13
  } = wp.blocks;
14
  const {
15
  PanelBody,
16
  CheckboxControl,
17
+ SelectControl,
18
  } = wp.components;
19
  const {
20
  InspectorControls,
29
  export default registerBlockType(
30
  'pmpro/membership',
31
  {
32
+ title: __( 'Membership Required Block', 'paid-memberships-pro' ),
33
+ description: __( 'Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.', 'paid-memberships-pro' ),
34
  category: 'pmpro',
35
  icon: {
36
+ background: '#FFFFFF',
37
+ foreground: '#1A688B',
38
  src: 'visibility',
39
  },
40
+ keywords: [
41
+ __( 'block visibility', 'paid-memberships-pro' ),
42
+ __( 'confitional', 'paid-memberships-pro' ),
43
+ __( 'content', 'paid-memberships-pro' ),
44
+ __( 'hide', 'paid-memberships-pro' ),
45
+ __( 'hidden', 'paid-memberships-pro' ),
46
+ __( 'paid memberships pro', 'paid-memberships-pro' ),
47
+ __( 'pmpro', 'paid-memberships-pro' ),
48
+ __( 'private', 'paid-memberships-pro' ),
49
+ __( 'restrict', 'paid-memberships-pro' ),
50
+ ],
51
  attributes: {
52
  levels: {
53
  type: 'array',
57
  type: 'string',
58
  default:'',
59
  },
60
+ show_noaccess: {
61
+ type: 'boolean',
62
+ default: false,
63
+ },
64
  },
65
  edit: props => {
66
+ const { attributes: {levels, uid, show_noaccess}, setAttributes, isSelected } = props;
67
  if( uid=='' ) {
68
  var rand = Math.random()+"";
69
  setAttributes( { uid:rand } );
84
  }
85
  }
86
  return [
87
+ <CheckboxControl
88
  label = { level.label }
89
  checked = { levels.some( levelID => levelID == level.value ) }
90
  onChange = { setLevelsAttribute }
94
 
95
  return [
96
  isSelected && <InspectorControls>
97
+ <PanelBody>
98
+ <p><strong>{ __( 'Which membership levels can view this block?', 'paid-memberships-pro' ) }</strong></p>
99
  <div class="pmpro-block-inspector-scrollable">
100
  {checkboxes}
101
  </div>
102
+ <hr />
103
+ <p><strong>{ __( 'What should users without access see?', 'paid-memberships-pro' ) }</strong></p>
104
+ <SelectControl
105
+ value={ show_noaccess }
106
+ help={__( "Modify the 'no access' message on the Memberships > Advanced Settings page.", "paid-memberships-pro" ) }
107
+ options={ [
108
+ { label: __( "Show nothing", 'paid-memberships-pro' ), value: '0' },
109
+ { label: __( "Show the 'no access' message", 'paid-memberships-pro' ), value: '1' },
110
+ ] }
111
+ onChange={ show_noaccess => setAttributes( { show_noaccess } ) }
112
+ />
113
  </PanelBody>
114
  </InspectorControls>,
115
  isSelected && <div className="pmpro-block-require-membership-element" >
116
+ <span className="pmpro-block-title">{ __( 'Membership Required', 'paid-memberships-pro' ) }</span>
117
+ <div class="pmpro-block-inspector-scrollable">
118
  <PanelBody>
119
  {checkboxes}
120
  </PanelBody>
121
+ </div>
122
  <InnerBlocks
123
  renderAppender={ () => (
124
  <InnerBlocks.ButtonBlockAppender />
127
  />
128
  </div>,
129
  ! isSelected && <div className="pmpro-block-require-membership-element" >
130
+ <span className="pmpro-block-title">{ __( 'Membership Required', 'paid-memberships-pro' ) }</span>
131
  <InnerBlocks
132
  renderAppender={ () => (
133
  <InnerBlocks.ButtonBlockAppender />
blocks/membership/block.php CHANGED
@@ -44,6 +44,8 @@ function render_dynamic_block( $attributes, $content ) {
44
  } else {
45
  if ( pmpro_hasMembershipLevel( $attributes['levels'] ) ) {
46
  return do_blocks( $content );
 
 
47
  }
48
  }
49
  }
44
  } else {
45
  if ( pmpro_hasMembershipLevel( $attributes['levels'] ) ) {
46
  return do_blocks( $content );
47
+ } elseif ( ! empty( $attributes['show_noaccess'] ) ) {
48
+ return pmpro_get_no_access_message( NULL, $attributes['levels'] );
49
  }
50
  }
51
  }
classes/class-pmpro-admin-activity-email.php CHANGED
@@ -346,10 +346,10 @@ class PMPro_Admin_Activity_Email extends PMProEmail {
346
  ?>
347
  </td>
348
  <td width="40%" style="background-color:#F1F1F1;padding:15px;">
349
- <p style="margin:0px;padding:0px;text-align:center;"><a style="color:#1A688B;" href="https://www.paidmembershipspro.com" target="_blank"><img style="width:100px;height:100px;" src="<?php echo esc_url( plugins_url( 'images/Paid-Memberships-Pro_icon.png', PMPRO_BASE_FILE ) ); ?>" alt="<?php esc_html_e( 'Paid Memberships Pro', 'paid-memberships-pro' ); ?>" /></a></p>
350
- <p style="margin:0px 0px 15px 0px;padding:0px;"><a style="color:#1A688B;" href="https://www.paidmembershipspro.com/support/" target="_blank"><?php esc_html_e( 'Get Support', 'paid-memberships-pro' ); ?></a></p>
351
- <p style="margin:0px 0px 15px 0px;padding:0px;"><a style="color:#1A688B;" href="https://twitter.com/pmproplugin" target="_blank"><?php esc_html_e( 'Follow @pmproplugin on Twitter', 'paid-memberships-pro' ); ?></a></p>
352
- <p style="margin:0px 0px 15px 0px;padding:0px;"><a style="color:#1A688B;" href="https://www.facebook.com/PaidMembershipsPro/" target="_blank"><?php esc_html_e( 'Like us on Facebook', 'paid-memberships-pro' ); ?></p></p>
353
  <p style="margin:0px;padding:0px;"><a style="color:#1A688B;" href="https://www.youtube.com/user/strangerstudiostv?sub_confirmation=1" target="_blank"><?php esc_html_e( 'Subscribe to our YouTube Channel', 'paid-memberships-pro' ); ?></a></p>
354
  </td>
355
  </tr>
346
  ?>
347
  </td>
348
  <td width="40%" style="background-color:#F1F1F1;padding:15px;">
349
+ <p style="margin:0px;padding:0px;text-align:center;"><a style="color:#1A688B;" href="https://www.paidmembershipspro.com" target="_blank" rel="noopener noreferrer"><img style="width:100px;height:100px;" src="<?php echo esc_url( plugins_url( 'images/Paid-Memberships-Pro_icon.png', PMPRO_BASE_FILE ) ); ?>" alt="<?php esc_attr_e( 'Paid Memberships Pro', 'paid-memberships-pro' ); ?>" /></a></p>
350
+ <p style="margin:0px 0px 15px 0px;padding:0px;"><a style="color:#1A688B;" href="https://www.paidmembershipspro.com/support/" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Get Support', 'paid-memberships-pro' ); ?></a></p>
351
+ <p style="margin:0px 0px 15px 0px;padding:0px;"><a style="color:#1A688B;" href="https://twitter.com/pmproplugin" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Follow @pmproplugin on Twitter', 'paid-memberships-pro' ); ?></a></p>
352
+ <p style="margin:0px 0px 15px 0px;padding:0px;"><a style="color:#1A688B;" href="https://www.facebook.com/PaidMembershipsPro/" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Like us on Facebook', 'paid-memberships-pro' ); ?></p></p>
353
  <p style="margin:0px;padding:0px;"><a style="color:#1A688B;" href="https://www.youtube.com/user/strangerstudiostv?sub_confirmation=1" target="_blank"><?php esc_html_e( 'Subscribe to our YouTube Channel', 'paid-memberships-pro' ); ?></a></p>
354
  </td>
355
  </tr>
classes/class-pmpro-members-list-table.php CHANGED
@@ -224,16 +224,16 @@ class PMPro_Members_List_Table extends WP_List_Table {
224
  <p>
225
  <?php _e( 'No members found.', 'paid-memberships-pro' ); ?>
226
  <?php if ( $l ) { ?>
227
- <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 's' => $s ) ) ); ?>"><?php _e( 'Search all levels', 'paid-memberships-pro' );?></a>
228
  <?php } ?>
229
  </p>
230
  <hr />
231
- <p><?php _e( 'You can also try searching:', 'paid-memberships-pro' ); ?>
232
  <ul class="ul-disc">
233
- <li><a href="<?php echo esc_url( add_query_arg( array( 's' => $s ), admin_url( 'users.php' ) ) ); ?>"><?php _e( 'All Users', 'paid-memberships-pro' ); ?></a></li>
234
- <li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'cancelled', 's' => $s ) ) ); ?>"><?php _e( 'Cancelled Members', 'paid-memberships-pro' ); ?></a></li>
235
- <li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'expired', 's' => $s ) ) ); ?>"><?php _e( 'Expired Members', 'paid-memberships-pro' ); ?></a></li>
236
- <li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'oldmembers', 's' => $s ) ) ); ?>"><?php _e( 'Old Members', 'paid-memberships-pro' ); ?></a></li>
237
  </ul>
238
  <?php
239
  }
@@ -328,9 +328,15 @@ class PMPro_Members_List_Table extends WP_List_Table {
328
  $search_query = " AND $key_column LIKE '%" . esc_sql( $s ) . "%' ";
329
  } elseif ( $search_key === 'discount' || $search_key === 'discount_code' || $search_key === 'dc' ) {
330
  $user_ids = $wpdb->get_col( "SELECT dcu.user_id FROM $wpdb->pmpro_discount_codes_uses dcu LEFT JOIN $wpdb->pmpro_discount_codes dc ON dcu.code_id = dc.id WHERE dc.code = '" . esc_sql( $s ) . "'" );
331
- $search_query = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
 
 
 
332
  } else {
333
- $user_ids = $wpdb->get_col( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '" . esc_sql( $search_key ) . "' AND meta_value lIKE '%" . esc_sql( $s ) . "%'" );
 
 
 
334
  $search_query = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
335
  }
336
  } else {
@@ -567,7 +573,7 @@ class PMPro_Members_List_Table extends WP_List_Table {
567
  $fee = '';
568
  // If there is no payment for the level, show a dash.
569
  if ( (float)$item['initial_payment'] <= 0 && (float)$item['billing_amount'] <= 0 ) {
570
- $fee .= esc_html_e( '&#8212;', 'paid-memberships-pro' );
571
  } else {
572
  // Display the member's initial payment.
573
  if ( (float)$item['initial_payment'] > 0 ) {
@@ -575,12 +581,12 @@ class PMPro_Members_List_Table extends WP_List_Table {
575
  }
576
  // If there is a recurring payment, show a plus sign.
577
  if ( (float)$item['initial_payment'] > 0 && (float)$item['billing_amount'] > 0 ) {
578
- $fee .= esc_html( ' + ', 'paid-memberships-pro' );
579
  }
580
  // If there is a recurring payment, show the recurring payment amount and cycle.
581
  if ( (float)$item['billing_amount'] > 0 ) {
582
  $fee .= pmpro_escape_price( pmpro_formatPrice( $item['billing_amount'] ) );
583
- $fee .= esc_html( ' per ', 'paid-memberships-pro' );
584
  if ( $item['cycle_number'] > 1 ) {
585
  $fee .= $item['cycle_number'] . " " . $item['cycle_period'] . "s";
586
  } else {
@@ -650,19 +656,19 @@ class PMPro_Members_List_Table extends WP_List_Table {
650
  }
651
  _e('Show', 'paid-memberships-pro' );?>
652
  <select name="l" onchange="jQuery('#current-page-selector').val('1'); jQuery('#member-list-form').submit();">
653
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'paid-memberships-pro' );?></option>
654
  <?php
655
  $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
656
  foreach($levels as $level)
657
  {
658
  ?>
659
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
660
  <?php
661
  }
662
  ?>
663
- <option value="cancelled" <?php if($l == "cancelled") { ?>selected="selected"<?php } ?>><?php _e('Cancelled Members', 'paid-memberships-pro' );?></option>
664
- <option value="expired" <?php if($l == "expired") { ?>selected="selected"<?php } ?>><?php _e('Expired Members', 'paid-memberships-pro' );?></option>
665
- <option value="oldmembers" <?php if($l == "oldmembers") { ?>selected="selected"<?php } ?>><?php _e('Old Members', 'paid-memberships-pro' );?></option>
666
  </select>
667
  <?php
668
  }
224
  <p>
225
  <?php _e( 'No members found.', 'paid-memberships-pro' ); ?>
226
  <?php if ( $l ) { ?>
227
+ <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 's' => $s ) ) ); ?>"><?php esc_html_e( 'Search all levels', 'paid-memberships-pro' );?></a>
228
  <?php } ?>
229
  </p>
230
  <hr />
231
+ <p><?php esc_html_e( 'You can also try searching:', 'paid-memberships-pro' ); ?>
232
  <ul class="ul-disc">
233
+ <li><a href="<?php echo esc_url( add_query_arg( array( 's' => $s ), admin_url( 'users.php' ) ) ); ?>"><?php esc_html_e( 'All Users', 'paid-memberships-pro' ); ?></a></li>
234
+ <li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'cancelled', 's' => $s ) ) ); ?>"><?php esc_html_e( 'Cancelled Members', 'paid-memberships-pro' ); ?></a></li>
235
+ <li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'expired', 's' => $s ) ) ); ?>"><?php esc_html_e( 'Expired Members', 'paid-memberships-pro' ); ?></a></li>
236
+ <li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'oldmembers', 's' => $s ) ) ); ?>"><?php esc_html_e( 'Old Members', 'paid-memberships-pro' ); ?></a></li>
237
  </ul>
238
  <?php
239
  }
328
  $search_query = " AND $key_column LIKE '%" . esc_sql( $s ) . "%' ";
329
  } elseif ( $search_key === 'discount' || $search_key === 'discount_code' || $search_key === 'dc' ) {
330
  $user_ids = $wpdb->get_col( "SELECT dcu.user_id FROM $wpdb->pmpro_discount_codes_uses dcu LEFT JOIN $wpdb->pmpro_discount_codes dc ON dcu.code_id = dc.id WHERE dc.code = '" . esc_sql( $s ) . "'" );
331
+ if ( empty( $user_ids ) ) {
332
+ $user_ids = array(0); // Avoid warning, but ensure 0 results.
333
+ }
334
+ $search_query = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
335
  } else {
336
+ $user_ids = $wpdb->get_col( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '" . esc_sql( $search_key ) . "' AND meta_value LIKE '%" . esc_sql( $s ) . "%'" );
337
+ if ( empty( $user_ids ) ) {
338
+ $user_ids = array(0); // Avoid warning, but ensure 0 results.
339
+ }
340
  $search_query = " AND u.ID IN(" . implode( ",", $user_ids ) . ") ";
341
  }
342
  } else {
573
  $fee = '';
574
  // If there is no payment for the level, show a dash.
575
  if ( (float)$item['initial_payment'] <= 0 && (float)$item['billing_amount'] <= 0 ) {
576
+ $fee .= esc_html__( '&#8212;', 'paid-memberships-pro' );
577
  } else {
578
  // Display the member's initial payment.
579
  if ( (float)$item['initial_payment'] > 0 ) {
581
  }
582
  // If there is a recurring payment, show a plus sign.
583
  if ( (float)$item['initial_payment'] > 0 && (float)$item['billing_amount'] > 0 ) {
584
+ $fee .= esc_html__( ' + ', 'paid-memberships-pro' );
585
  }
586
  // If there is a recurring payment, show the recurring payment amount and cycle.
587
  if ( (float)$item['billing_amount'] > 0 ) {
588
  $fee .= pmpro_escape_price( pmpro_formatPrice( $item['billing_amount'] ) );
589
+ $fee .= esc_html__( ' per ', 'paid-memberships-pro' );
590
  if ( $item['cycle_number'] > 1 ) {
591
  $fee .= $item['cycle_number'] . " " . $item['cycle_period'] . "s";
592
  } else {
656
  }
657
  _e('Show', 'paid-memberships-pro' );?>
658
  <select name="l" onchange="jQuery('#current-page-selector').val('1'); jQuery('#member-list-form').submit();">
659
+ <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php esc_html_e('All Levels', 'paid-memberships-pro' );?></option>
660
  <?php
661
  $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
662
  foreach($levels as $level)
663
  {
664
  ?>
665
+ <option value="<?php echo esc_attr( $level->id ) ?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
666
  <?php
667
  }
668
  ?>
669
+ <option value="cancelled" <?php if($l == "cancelled") { ?>selected="selected"<?php } ?>><?php esc_html_e('Cancelled Members', 'paid-memberships-pro' );?></option>
670
+ <option value="expired" <?php if($l == "expired") { ?>selected="selected"<?php } ?>><?php esc_html_e('Expired Members', 'paid-memberships-pro' );?></option>
671
+ <option value="oldmembers" <?php if($l == "oldmembers") { ?>selected="selected"<?php } ?>><?php esc_html_e('Old Members', 'paid-memberships-pro' );?></option>
672
  </select>
673
  <?php
674
  }
classes/class-pmpro-site-health.php CHANGED
@@ -100,7 +100,11 @@ class PMPro_Site_Health {
100
  'pmpro-pages' => [
101
  'label' => __( 'Membership Pages', 'paid-memberships-pro' ),
102
  'value' => self::get_pmpro_pages(),
103
- ]
 
 
 
 
104
  ],
105
  ];
106
 
@@ -187,14 +191,17 @@ class PMPro_Site_Health {
187
 
188
  if ( $legacy ) {
189
  $gateway_text .= ' (' . __( 'Legacy Keys', 'paid-memberships-pro' ) . ')';
 
190
  }
191
 
192
  if ( $connect ) {
193
  $gateway_text .= ' (' . __( 'Stripe Connect', 'paid-memberships-pro' ) . ')';
 
194
  }
 
195
  }
196
 
197
- return $gateway_text;
198
  }
199
 
200
  /**
@@ -217,7 +224,7 @@ class PMPro_Site_Health {
217
  return sprintf( __( '%s (environment not registered)', 'paid-memberships-pro' ), $environment );
218
  }
219
 
220
- return $environments[ $environment ];
221
  }
222
 
223
  /**
@@ -313,18 +320,7 @@ class PMPro_Site_Health {
313
  $cron_times = [];
314
 
315
  // These are our crons.
316
- $expected_crons = [
317
- 'pmpro_cron_expire_memberships',
318
- 'pmpro_cron_expiration_warnings',
319
- 'pmpro_cron_credit_card_expiring_warnings',
320
- 'pmpro_cron_admin_activity_email',
321
- ];
322
-
323
- $gateway = pmpro_getOption( 'gateway' );
324
-
325
- if ( 'stripe' === $gateway ) {
326
- $expected_crons[] = 'pmpro_cron_stripe_subscription_updates';
327
- }
328
 
329
  // Find any of our crons and when their next run is.
330
  if ( $crons ) {
@@ -366,7 +362,7 @@ class PMPro_Site_Health {
366
  global $pmpro_pages;
367
 
368
  $page_information = array();
369
-
370
  if( !empty( $pmpro_pages ) ){
371
 
372
  foreach( $pmpro_pages as $key => $val ){
@@ -469,6 +465,37 @@ class PMPro_Site_Health {
469
  return __( 'Off', 'paid-memberships-pro' );
470
  }
471
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
472
  /**
473
  * Get the constants site health information.
474
  *
@@ -541,5 +568,4 @@ class PMPro_Site_Health {
541
 
542
  return $constants_formatted;
543
  }
544
-
545
  }
100
  'pmpro-pages' => [
101
  'label' => __( 'Membership Pages', 'paid-memberships-pro' ),
102
  'value' => self::get_pmpro_pages(),
103
+ ],
104
+ 'pmpro-library-conflicts' => [
105
+ 'label' => __( 'Library Conflicts', 'paid-memberships-pro' ),
106
+ 'value' => self::get_library_conflicts(),
107
+ ],
108
  ],
109
  ];
110
 
191
 
192
  if ( $legacy ) {
193
  $gateway_text .= ' (' . __( 'Legacy Keys', 'paid-memberships-pro' ) . ')';
194
+ return $gateway_text . ' [' . $gateway . ':legacy-keys]';
195
  }
196
 
197
  if ( $connect ) {
198
  $gateway_text .= ' (' . __( 'Stripe Connect', 'paid-memberships-pro' ) . ')';
199
+ return $gateway_text . ' [' . $gateway . ':stripe-connect]';
200
  }
201
+
202
  }
203
 
204
+ return $gateway_text . ' [' . $gateway . ']';
205
  }
206
 
207
  /**
224
  return sprintf( __( '%s (environment not registered)', 'paid-memberships-pro' ), $environment );
225
  }
226
 
227
+ return $environments[ $environment ] . ' [' . $environment . ']';
228
  }
229
 
230
  /**
320
  $cron_times = [];
321
 
322
  // These are our crons.
323
+ $expected_crons = array_keys( pmpro_get_crons() );
 
 
 
 
 
 
 
 
 
 
 
324
 
325
  // Find any of our crons and when their next run is.
326
  if ( $crons ) {
362
  global $pmpro_pages;
363
 
364
  $page_information = array();
365
+
366
  if( !empty( $pmpro_pages ) ){
367
 
368
  foreach( $pmpro_pages as $key => $val ){
465
  return __( 'Off', 'paid-memberships-pro' );
466
  }
467
 
468
+ /**
469
+ * Get library conflicts.
470
+ *
471
+ * @since 2.8
472
+ *
473
+ * @return string|string[] The member page information
474
+ */
475
+ function get_library_conflicts() {
476
+ // Get the current list of library conflicts.
477
+ $library_conflicts = get_option( 'pmpro_library_conflicts' );
478
+
479
+ // If there are no library conflicts, return a message.
480
+ if ( empty( $library_conflicts ) ) {
481
+ return __( 'No library conflicts detected.', 'paid-memberships-pro' );
482
+ }
483
+
484
+ // Format data to be displayed in site health.
485
+ $return_arr = array();
486
+
487
+ // Loop through all libraries that have conflicts.
488
+ foreach ( $library_conflicts as $library_name => $conflicting_plugins ) {
489
+ $conflict_strings = array();
490
+ // Loop through all plugins that have conflicts with this library.
491
+ foreach ( $conflicting_plugins as $conflicting_plugin_path => $conflicting_plugin_data ) {
492
+ $conflict_strings[] = 'v' . $conflicting_plugin_data['version'] . ' (' . $conflicting_plugin_data['timestamp'] . ')' . ' - ' . $conflicting_plugin_path;
493
+ }
494
+ $return_arr[ $library_name ] = implode( ' | ', $conflict_strings );
495
+ }
496
+ return $return_arr;
497
+ }
498
+
499
  /**
500
  * Get the constants site health information.
501
  *
568
 
569
  return $constants_formatted;
570
  }
 
571
  }
classes/class-pmpro-wisdom-integration.php ADDED
@@ -0,0 +1,490 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Wisdom Integration class for PMPro.
5
+ *
6
+ * @see PMPro_Wisdom_Tracker
7
+ *
8
+ * @since 2.8
9
+ */
10
+ class PMPro_Wisdom_Integration {
11
+
12
+ /**
13
+ * The current object instance.
14
+ *
15
+ * @since 2.8
16
+ *
17
+ * @var self
18
+ */
19
+ public static $instance;
20
+
21
+ /**
22
+ * The plugin slug to use with Wisdom.
23
+ *
24
+ * @since 2.8
25
+ *
26
+ * @var string
27
+ */
28
+ public $plugin_slug = 'paid-memberships-pro';
29
+
30
+ /**
31
+ * The plugin option to send to Wisdom.
32
+ *
33
+ * @since 2.8
34
+ *
35
+ * @var string
36
+ */
37
+ public $plugin_option = 'pmpro_wisdom_opt_out';
38
+
39
+ /**
40
+ * The plugin settings pages to include Wisdom notices on.
41
+ *
42
+ * @since 2.8
43
+ *
44
+ * @var array
45
+ */
46
+ public $plugin_pages = [
47
+ 'pmpro-membershiplevels' => true,
48
+ 'pmpro-discountcodes' => true,
49
+ 'pmpro-pagesettings' => true,
50
+ 'pmpro-paymentsettings' => true,
51
+ 'pmpro-emailsettings' => true,
52
+ 'pmpro-emailtemplates' => true,
53
+ 'pmpro-advancedsettings' => true,
54
+ ];
55
+
56
+ /**
57
+ * The Wisdom Tracker object.
58
+ *
59
+ * @since 2.8
60
+ *
61
+ * @var PMPro_Wisdom_Tracker
62
+ */
63
+ public $wisdom_tracker;
64
+
65
+ /**
66
+ * Set up and return the class instance.
67
+ *
68
+ * @since 2.8
69
+ *
70
+ * @return self
71
+ */
72
+ public static function instance() {
73
+ if ( ! isset( self::$instance ) ) {
74
+ self::$instance = new self;
75
+ }
76
+
77
+ return self::$instance;
78
+ }
79
+
80
+ /**
81
+ * Prevent new public instances by having a private constructor.
82
+ */
83
+ private function __construct() {
84
+ // Nothing to do here.
85
+ }
86
+
87
+ /**
88
+ * Set up the Wisdom tracker.
89
+ *
90
+ * @since 2.8
91
+ */
92
+ public function setup_wisdom() {
93
+ require_once PMPRO_DIR . '/classes/class-pmpro-wisdom-tracker.php';
94
+
95
+ // Sync the options together.
96
+ add_action( 'add_option_wisdom_allow_tracking', [ $this, 'sync_wisdom_setting_to_plugin' ], 10, 2 );
97
+ add_action( 'update_option_wisdom_allow_tracking', [ $this, 'sync_wisdom_setting_to_plugin' ], 10, 2 );
98
+ add_action( 'add_option_' . $this->plugin_option, [ $this, 'sync_plugin_setting_to_wisdom' ], 10, 2 );
99
+ add_action( 'update_option_' . $this->plugin_option, [ $this, 'sync_plugin_setting_to_wisdom' ], 10, 2 );
100
+
101
+ // Additional Wisdom customizations.
102
+ add_filter( 'wisdom_is_local_' . $this->plugin_slug, [ $this, 'bypass_local_tracking' ] );
103
+ add_filter( 'wisdom_notice_text_' . $this->plugin_slug, [ $this, 'override_notice' ] );
104
+ add_filter( 'wisdom_tracker_data_' . $this->plugin_slug, [ $this, 'add_stats' ] );
105
+
106
+ // Set up the tracker object.
107
+ $this->wisdom_tracker = new PMPro_Wisdom_Tracker(
108
+ PMPRO_BASE_FILE,
109
+ $this->plugin_slug,
110
+ 'https://asimov.paidmembershipspro.com',
111
+ [
112
+ $this->plugin_option,
113
+ ],
114
+ true,
115
+ false,
116
+ 1
117
+ );
118
+
119
+ // Adjust tracking hooks.
120
+ $this->remove_wisdom_notices_from_non_plugin_screens();
121
+ }
122
+
123
+ /**
124
+ * When the Wisdom setting for tracking is changed, sync the plugin setting to match.
125
+ *
126
+ * @since 2.8
127
+ *
128
+ * @param array|null $old_value The old value of the option.
129
+ * @param array $value The new value of the option.
130
+ */
131
+ public function sync_wisdom_setting_to_plugin( $old_value, $value ) {
132
+ $opt_out = ! empty( $value[ $this->plugin_slug ] ) ? 0 : 1;
133
+ pmpro_setOption( $this->plugin_option, $opt_out );
134
+ }
135
+
136
+ /**
137
+ * When the plugin setting for tracking is changed, sync the Wisdom setting to match.
138
+ *
139
+ * @since 2.8
140
+ *
141
+ * @param array|null $old_value The old value of the option.
142
+ * @param array $value The new value of the option.
143
+ */
144
+ public function sync_plugin_setting_to_wisdom( $old_value, $value ) {
145
+ // Only handle opt in when needed.
146
+ if ( ! isset( $value ) ) {
147
+ return;
148
+ }
149
+
150
+ // Only update when changing the value.
151
+ if ( isset( $old_value ) && (int) $old_value === (int) $value ) {
152
+ return;
153
+ }
154
+
155
+ $opt_out = filter_var( $value, FILTER_VALIDATE_BOOLEAN );
156
+
157
+ // Update opt-in.
158
+ $this->wisdom_tracker->set_is_tracking_allowed( ! $opt_out, $this->plugin_slug );
159
+ $this->wisdom_tracker->set_can_collect_email( ! $opt_out, $this->plugin_slug );
160
+ }
161
+
162
+ /**
163
+ * Bypass local tracking for additional local URLs.
164
+ *
165
+ * @since 2.8
166
+ *
167
+ * @param bool $is_local Whether the site is recognized as a local site.
168
+ *
169
+ * @return bool Whether the site is recognized as a local site.
170
+ */
171
+ public function bypass_local_tracking( $is_local = false ) {
172
+ if ( true === $is_local || 'production' !== wp_get_environment_type() ) {
173
+ return $is_local;
174
+ }
175
+
176
+ $url = network_site_url( '/' );
177
+
178
+ $url = strtolower( trim( $url ) );
179
+ $url_parts = parse_url( $url );
180
+ $host = ! empty( $url_parts['host'] ) ? $url_parts['host'] : false;
181
+
182
+ if ( empty( $host ) ) {
183
+ return $is_local;
184
+ }
185
+
186
+ if ( 'localhost' === $host ) {
187
+ return true;
188
+ }
189
+
190
+ if ( false !== ip2long( $host ) && ! filter_var( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) {
191
+ return true;
192
+ }
193
+
194
+ $tlds_to_check = [
195
+ '.local',
196
+ '.test',
197
+ ];
198
+
199
+ foreach ( $tlds_to_check as $tld ) {
200
+ $minus_tld = strlen( $host ) - strlen( $tld );
201
+
202
+ if ( $minus_tld === strpos( $host, $tld ) ) {
203
+ return true;
204
+ }
205
+ }
206
+
207
+ return $is_local;
208
+ }
209
+
210
+ /**
211
+ * Override the notice for the Wisdom Tracker opt-in.
212
+ *
213
+ * @since 2.8
214
+ *
215
+ * @return string
216
+ */
217
+ public function override_notice() {
218
+ $message = esc_html__( 'Share your usage data to help us improve Paid Memberships Pro. We use this data to analyze how our plugin is meeting your needs and identify new opportunities to help you create a thriving membership business. You can always visit the Advanced Settings and change this preference.', 'paid-memberships-pro' );
219
+ $link = '<a href="https://www.paidmembershipspro.com/privacy-policy/usage-tracking/" target="_blank" rel="nofollow noopener">' . esc_html__( 'Read more about what data we collect.', 'paid-memberships-pro' ) . '</a>';
220
+ return $message . ' ' . $link;
221
+ }
222
+
223
+ /**
224
+ * Remove Wisdom notices from non-plugin screens.
225
+ *
226
+ * @since 2.8
227
+ */
228
+ public function remove_wisdom_notices_from_non_plugin_screens() {
229
+ $settings_page = ! empty( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : '';
230
+
231
+ // Check if we are on a settings page using isset() which is faster than in_array().
232
+ if ( isset( $this->plugin_pages[ $settings_page ] ) ) {
233
+ return;
234
+ }
235
+
236
+ // Remove the notices from the non-plugin settings pages.
237
+ remove_action( 'admin_notices', [ $this->wisdom_tracker, 'optin_notice' ] );
238
+ remove_action( 'admin_notices', [ $this->wisdom_tracker, 'marketing_notice' ] );
239
+ }
240
+
241
+ /**
242
+ * Add custom stats for the plugin to the data being tracked.
243
+ *
244
+ * @since 2.8
245
+ *
246
+ * @param array $stats The data to be sent to the Wisdom plugin site.
247
+ *
248
+ * @return array The data to be sent to the Wisdom plugin site.
249
+ */
250
+ public function add_stats( $stats ) {
251
+ global $wpdb;
252
+
253
+ // License info.
254
+ $license_check = get_option( 'pmpro_license_check', 'No Value' );
255
+
256
+ $license_plan = 'No Value';
257
+
258
+ if ( is_array( $license_check ) && isset( $license_check['license'] ) ) {
259
+ $license_plan = $license_check['license'];
260
+ }
261
+
262
+ $stats['plugin_options_fields']['pmpro_license_key'] = get_option( 'pmpro_license_key', 'No Value' );
263
+ $stats['plugin_options_fields']['pmpro_license_plan'] = $license_plan;
264
+
265
+ // Gateway info.
266
+ $stats['plugin_options_fields'] = array_merge( $stats['plugin_options_fields'], $this->get_gateway_info() );
267
+
268
+ // Levels info.
269
+ $levels_info = $this->get_levels_info();
270
+ $stats['plugin_options_fields']['pmpro_level_count'] = $levels_info['pmpro_level_count'];
271
+ $stats['plugin_options_fields']['pmpro_level_setups'] = $levels_info['pmpro_level_setups'];
272
+ $stats['plugin_options_fields']['pmpro_has_free_level'] = $levels_info['pmpro_has_free_level'];
273
+ $stats['plugin_options_fields']['pmpro_has_paid_level'] = $levels_info['pmpro_has_paid_level'];
274
+
275
+ // Members info.
276
+ $stats['plugin_options_fields']['pmpro_members_count'] = pmpro_getSignups( 'all time' );
277
+ $stats['plugin_options_fields']['pmpro_members_cancelled_count'] = pmpro_getCancellations( 'all time' );
278
+
279
+ // Orders info.
280
+ $stats['plugin_options_fields']['pmpro_orders_count'] = $wpdb->get_var( "SELECT COUNT(*) FROM `{$wpdb->pmpro_membership_orders}`" );
281
+
282
+ // Features.
283
+ $stats['plugin_options_fields']['pmpro_hide_toolbar'] = get_option( 'pmpro_hide_toolbar', 'No Value' );
284
+ $stats['plugin_options_fields']['pmpro_block_dashboard'] = get_option( 'pmpro_block_dashboard', 'No Value' );
285
+ $stats['plugin_options_fields']['pmpro_filterqueries'] = get_option( 'pmpro_filterqueries', 'No Value' );
286
+ $stats['plugin_options_fields']['pmpro_showexcerpts'] = get_option( 'pmpro_showexcerpts', 'No Value' );
287
+ $stats['plugin_options_fields']['pmpro_spamprotection'] = get_option( 'pmpro_spamprotection', 'No Value' );
288
+ $stats['plugin_options_fields']['pmpro_recaptcha'] = get_option( 'pmpro_recaptcha', 'No Value' );
289
+ $stats['plugin_options_fields']['pmpro_maxnotificationpriority'] = get_option( 'pmpro_maxnotificationpriority', 'No Value' );
290
+ $stats['plugin_options_fields']['pmpro_activity_email_frequency'] = get_option( 'pmpro_activity_email_frequency', 'No Value' );
291
+ $stats['plugin_options_fields']['pmpro_hideads'] = get_option( 'pmpro_hideads', 'No Value' );
292
+ $stats['plugin_options_fields']['pmpro_redirecttosubscription'] = get_option( 'pmpro_redirecttosubscription', 'No Value' );
293
+ $stats['plugin_options_fields']['pmpro_only_filter_pmpro_emails'] = get_option( 'pmpro_only_filter_pmpro_emails', 'No Value' );
294
+ $stats['plugin_options_fields']['pmpro_email_member_notification'] = get_option( 'pmpro_email_member_notification', 'No Value' );
295
+ $stats['plugin_options_fields']['pmpro_use_ssl'] = get_option( 'pmpro_pmpro_use_ssl', 'No Value' );
296
+ $ssl_seal = get_option( 'pmpro_sslseal', '' );
297
+ if ( ! empty( $ssl_seal ) ) {
298
+ $stats['plugin_options_fields']['pmpro_sslseal'] = 'Yes';
299
+ } else {
300
+ $stats['plugin_options_fields']['pmpro_sslseal'] = 'No';
301
+ }
302
+ $stats['plugin_options_fields']['pmpro_nuclear_HTTPS'] = get_option( 'pmpro_nuclear_HTTPS', 'No Value' );
303
+
304
+ // Add Ons.
305
+ $addons_info = $this->get_addons_info();
306
+
307
+ $stats['plugin_options_fields']['addons_active'] = $addons_info['addons_active'];
308
+ $stats['plugin_options_fields']['addons_inactive'] = $addons_info['addons_inactive'];
309
+ $stats['plugin_options_fields']['addons_update_available'] = $addons_info['addons_update_available'];
310
+
311
+ // Flatten the arrays.
312
+ foreach ( $stats['plugin_options_fields'] as $option => $value ) {
313
+ if ( is_object( $value ) || is_array( $value ) ) {
314
+ $value = maybe_serialize( $value );
315
+ }
316
+
317
+ $stats['plugin_options_fields'][ $option ] = $value;
318
+ }
319
+ return $stats;
320
+ }
321
+
322
+ /**
323
+ * Get the gateway information to track.
324
+ *
325
+ * @since 2.8
326
+ *
327
+ * @return array The gateway information to track.
328
+ */
329
+ public function get_gateway_info() {
330
+ $stats = [];
331
+
332
+ // Gateway info.
333
+ $stats['pmpro_gateway'] = get_option( 'pmpro_gateway', 'No Value' );
334
+ $stats['pmpro_gateway_environment'] = get_option( 'pmpro_gateway_environment', 'No Value' );
335
+ $stats['pmpro_currency'] = get_option( 'pmpro_currency', 'No Value' );
336
+
337
+ // Get Stripe gateway info for other stats below.
338
+ $stripe_using_legacy_keys = PMProGateway_stripe::using_legacy_keys();
339
+ $stripe_has_connect_credentials = PMProGateway_stripe::has_connect_credentials( 'live' ) || PMProGateway_stripe::has_connect_credentials( 'sandbox' );
340
+
341
+ // Append the Stripe gateway qualifiers.
342
+ if ( 'stripe' === $stats['pmpro_gateway'] ) {
343
+ // Add Legacy Keys text if using Legacy Keys.
344
+ if ( $stripe_using_legacy_keys ) {
345
+ $stats['pmpro_gateway'] .= ' (' . __( 'Legacy Keys', 'paid-memberships-pro' ) . ')';
346
+ }
347
+
348
+ // Add Stripe Connect text if using Stripe Connect.
349
+ if ( $stripe_has_connect_credentials ) {
350
+ $stats['pmpro_gateway'] .= ' (' . __( 'Stripe Connect', 'paid-memberships-pro' ) . ')';
351
+ }
352
+
353
+ $stats['pmpro_gateway'] = strtolower( $stats['pmpro_gateway'] );
354
+ }
355
+
356
+ // Detect any gateway settings.
357
+ $gateway_settings_detected = [
358
+ 'authorizenet' => get_option( 'pmpro_loginname' ),
359
+ 'braintree' => get_option( 'pmpro_braintree_merchantid' ),
360
+ 'cybersource' => get_option( 'pmpro_cybersource_merchantid' ),
361
+ 'payflowpro' => get_option( 'pmpro_payflow_user' ),
362
+ 'paypal' => get_option( 'pmpro_apiusername' ),
363
+ 'paypalexpress' => get_option( 'paypalexpress_skip_confirmation' ),
364
+ 'paypalstandard' => get_option( 'gateway_email' ),
365
+ 'stripe' => $stripe_using_legacy_keys || $stripe_has_connect_credentials,
366
+ 'stripe_sandbox' => get_option( 'sandbox_stripe_connect_user_id' ),
367
+ 'twocheckout' => get_option( 'twocheckout_accountnumber' ),
368
+ ];
369
+
370
+ // Remove any gateway settings that are not set or are empty.
371
+ $gateway_settings_detected = array_map( static function( $value ) {
372
+ return false !== $value && '' !== $value;
373
+ }, $gateway_settings_detected );
374
+ $gateway_settings_detected = array_filter( $gateway_settings_detected );
375
+
376
+ // Fill in the gateway count/detected info.
377
+ $stats['pmpro_gateways_count'] = count( $gateway_settings_detected );
378
+ $stats['pmpro_gateways_detected'] = implode( ', ', array_keys( $gateway_settings_detected ) );
379
+
380
+ return $stats;
381
+ }
382
+
383
+ /**
384
+ * Get the level information for all levels to track.
385
+ *
386
+ * @since 2.8
387
+ *
388
+ * @return array The level information for all levels to track.
389
+ */
390
+ public function get_levels_info() {
391
+ global $wpdb;
392
+
393
+ $stats = array(
394
+ 'pmpro_level_setups' => array(),
395
+ 'pmpro_has_free_level' => 'no',
396
+ 'pmpro_has_paid_level' => 'no',
397
+ 'pmpro_level_count' => 0,
398
+ );
399
+
400
+ // Get the levels.
401
+ $levels = pmpro_getAllLevels( true );
402
+
403
+ // Update the level count.
404
+ $stats['pmpro_level_count'] = count( $levels );
405
+
406
+ // Loop through the levels.
407
+ foreach ( $levels as $level_id => $level_data ) {
408
+ // Remove sensitive info.
409
+ unset( $level_data->name );
410
+ unset( $level_data->description );
411
+ unset( $level_data->confirmation );
412
+
413
+ // Add Set Expiration Date/Subscription Delay info.
414
+ $level_data->set_expiration_date = get_option( 'pmprosed_' . $level_id , '' );
415
+ $level_data->subscription_delay = get_option( 'pmpro_subscription_delay_' . $level_id , '' );
416
+
417
+ // Add if a category is set.
418
+ $categories = $wpdb->get_col(
419
+ $wpdb->prepare(
420
+ "SELECT category_id
421
+ FROM $wpdb->pmpro_memberships_categories
422
+ WHERE membership_id = %d",
423
+ $level_id
424
+ )
425
+ );
426
+ $level_data->has_categories = ! empty( $categories ) ? 'yes' : 'no';
427
+
428
+ // Add level info.
429
+ $stats['pmpro_level_setups'][ $level_id ] = $level_data;
430
+
431
+ // Update whether or not we have a free/paid level yet.
432
+ if ( pmpro_isLevelFree( $level_data ) ) {
433
+ $stats['pmpro_has_free_level'] = 'yes';
434
+ } else {
435
+ $stats['pmpro_has_paid_level'] = 'yes';
436
+ }
437
+ }
438
+ return $stats;
439
+ }
440
+
441
+ /**
442
+ * Get the list of Add Ons categorized by active, inactive, and update available.
443
+ *
444
+ * @since 2.8
445
+ *
446
+ * @return array The list of Add Ons categorized by active, inactive, and update available.
447
+ */
448
+ public function get_addons_info() {
449
+ // Build the list of Add Ons data to track.
450
+ $addons = pmpro_getAddons();
451
+ $plugin_info = get_site_transient( 'update_plugins' );
452
+
453
+ // Split Add Ons into groups for filtering
454
+ $addons_active = [];
455
+ $addons_inactive = [];
456
+ $addons_update_available = [];
457
+
458
+ // Build array of Visible, Hidden, Active, Inactive, Installed, and Not Installed Add Ons.
459
+ foreach ( $addons as $addon ) {
460
+ $plugin_file = $addon['Slug'] . '/' . $addon['Slug'] . '.php';
461
+ $plugin_file_abs = WP_PLUGIN_DIR . '/' . $plugin_file;
462
+
463
+ if ( file_exists( $plugin_file_abs ) ) {
464
+ $plugin_data = get_plugin_data( $plugin_file_abs );
465
+ } else {
466
+ // Plugin is not on the site.
467
+ continue;
468
+ }
469
+
470
+ // Build Active and Inactive arrays - exclude hidden Add Ons that are not installed.
471
+ if ( is_plugin_active( $plugin_file ) ) {
472
+ $addons_active[ $addon['Slug'] ] = $plugin_data['Version'];
473
+ } else {
474
+ $addons_inactive[ $addon['Slug'] ] = $plugin_data['Version'];
475
+ }
476
+
477
+ // Build array of Add Ons that have an update available.
478
+ if ( isset( $plugin_info->response[ $plugin_file ] ) ) {
479
+ $addons_update_available[ $addon['Slug'] ] = $plugin_data['Version'];
480
+ }
481
+ }
482
+
483
+ return [
484
+ 'addons_active' => $addons_active,
485
+ 'addons_inactive' => $addons_inactive,
486
+ 'addons_update_available' => $addons_update_available,
487
+ ];
488
+ }
489
+
490
+ }
classes/class-pmpro-wisdom-tracker.php ADDED
@@ -0,0 +1,1107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Wisdom Tracker class for PMPro.
5
+ *
6
+ * Denote any modifications to this file to facilitate easier updates.
7
+ *
8
+ * @link https://wisdomplugin.com/
9
+ *
10
+ * @since 2.8
11
+ */
12
+ class PMPro_Wisdom_Tracker {
13
+
14
+ private $wisdom_version = '1.2.5';
15
+ private $home_url = '';
16
+ private $plugin_file = '';
17
+ private $plugin_name = '';
18
+ private $options = [];
19
+ private $require_optin = true;
20
+ private $include_goodbye_form = true;
21
+ private $marketing = false;
22
+ private $collect_email = false;
23
+ private $what_am_i = 'plugin';
24
+ private $theme_allows_tracking = 0;
25
+
26
+ /**
27
+ * Class constructor
28
+ *
29
+ * @param $_home_url The URL to the site we're sending data to
30
+ * @param $_plugin_slug The slug for this plugin (PMPRO MODIFICATION).
31
+ * @param $_plugin_file The file path for this plugin
32
+ * @param $_options Plugin options to track
33
+ * @param $_require_optin Whether user opt-in is required (always required on WordPress.org)
34
+ * @param $_include_goodbye_form Whether to include a form when the user deactivates
35
+ * @param $_marketing Marketing method:
36
+ * 0: Don't collect email addresses
37
+ * 1: Request permission same time as tracking opt-in
38
+ * 2: Request permission after opt-in
39
+ */
40
+ public function __construct(
41
+ $_plugin_file, $_plugin_slug, $_home_url, $_options, $_require_optin = true, $_include_goodbye_form = true, $_marketing = false
42
+ ) {
43
+ $this->plugin_file = $_plugin_file;
44
+ $this->home_url = trailingslashit( $_home_url );
45
+
46
+ // If the filename is 'functions' then we're tracking a theme
47
+ if ( basename( $this->plugin_file, '.php' ) != 'functions' ) {
48
+ $this->plugin_name = basename( $this->plugin_file, '.php' );
49
+
50
+ // PMPRO MODIFICATION.
51
+ if ( ! empty( $_plugin_slug ) ) {
52
+ $this->plugin_name = $_plugin_slug;
53
+ }
54
+ } else {
55
+ $this->what_am_i = 'theme';
56
+ $theme = wp_get_theme();
57
+ if ( $theme->Name ) {
58
+ $this->plugin_name = sanitize_text_field( $theme->Name );
59
+ }
60
+ }
61
+
62
+ $this->options = $_options;
63
+ $this->require_optin = $_require_optin;
64
+ $this->include_goodbye_form = $_include_goodbye_form;
65
+ $this->marketing = $_marketing;
66
+
67
+ // Only use this on switching theme
68
+ $this->theme_allows_tracking = get_theme_mod( 'wisdom-allow-tracking', 0 );
69
+
70
+ // Schedule / deschedule tracking when activated / deactivated
71
+ if ( $this->what_am_i == 'theme' ) {
72
+ // Need to think about scheduling for sites that have already activated the theme
73
+ add_action( 'after_switch_theme', [ $this, 'schedule_tracking' ] );
74
+ add_action( 'switch_theme', [ $this, 'deactivate_this_plugin' ] );
75
+ } else {
76
+ register_activation_hook( $this->plugin_file, [ $this, 'schedule_tracking' ] );
77
+ register_deactivation_hook( $this->plugin_file, [ $this, 'deactivate_this_plugin' ] );
78
+ }
79
+
80
+ // Get it going
81
+ $this->init();
82
+ }
83
+
84
+ public function init() {
85
+ // Check marketing
86
+ if ( $this->marketing == 3 ) {
87
+ $this->set_can_collect_email( true, $this->plugin_name );
88
+ }
89
+
90
+ // Check whether opt-in is required
91
+ // If not, then tracking is allowed
92
+ if ( ! $this->require_optin ) {
93
+ $this->set_can_collect_email( true, $this->plugin_name );
94
+ $this->set_is_tracking_allowed( true );
95
+ $this->update_block_notice();
96
+ $this->do_tracking();
97
+ }
98
+
99
+ // Hook our do_tracking function to the weekly action
100
+ add_filter( 'cron_schedules', [ $this, 'schedule_weekly_event' ] );
101
+ // It's called weekly, but in fact it could be daily, weekly or monthly
102
+ add_action( 'put_do_weekly_action', [ $this, 'do_tracking' ] );
103
+
104
+ // Use this action for local testing
105
+ // add_action( 'admin_init', array( $this, 'do_tracking' ) );
106
+
107
+ // Display the admin notice on activation
108
+ add_action( 'admin_init', [ $this, 'set_notification_time' ] );
109
+ add_action( 'admin_notices', [ $this, 'optin_notice' ] );
110
+ add_action( 'admin_notices', [ $this, 'marketing_notice' ] );
111
+
112
+ // Deactivation
113
+ add_filter( 'plugin_action_links_' . plugin_basename( $this->plugin_file ), [ $this, 'filter_action_links' ] );
114
+ add_action( 'admin_footer-plugins.php', [ $this, 'goodbye_ajax' ] );
115
+ add_action( 'wp_ajax_goodbye_form', [ $this, 'goodbye_form_callback' ] );
116
+ }
117
+
118
+ /**
119
+ * When the plugin is activated
120
+ * Create scheduled event
121
+ * And check if tracking is enabled - perhaps the plugin has been reactivated
122
+ *
123
+ * @since 1.0.0
124
+ */
125
+ public function schedule_tracking() {
126
+ if ( ! wp_next_scheduled( 'put_do_weekly_action' ) ) {
127
+ $schedule = $this->get_schedule();
128
+ wp_schedule_event( time(), $schedule, 'put_do_weekly_action' );
129
+ }
130
+ $this->do_tracking( true );
131
+ }
132
+
133
+ /**
134
+ * Create weekly schedule
135
+ *
136
+ * @since 1.2.3
137
+ */
138
+ public function schedule_weekly_event( $schedules ) {
139
+ $schedules['weekly'] = [
140
+ 'interval' => 604800,
141
+ 'display' => __( 'Once Weekly' ),
142
+ ];
143
+ $schedules['monthly'] = [
144
+ 'interval' => 2635200,
145
+ 'display' => __( 'Once Monthly' ),
146
+ ];
147
+
148
+ return $schedules;
149
+ }
150
+
151
+ /**
152
+ * Get how frequently data is tracked back
153
+ *
154
+ * @since 1.2.3
155
+ */
156
+ public function get_schedule() {
157
+ // Could be daily, weekly or monthly
158
+ $schedule = apply_filters( 'wisdom_filter_schedule_' . $this->plugin_name, 'monthly' );
159
+
160
+ return $schedule;
161
+ }
162
+
163
+ /**
164
+ * This is our function to get everything going
165
+ * Check that user has opted in
166
+ * Collect data
167
+ * Then send it back
168
+ *
169
+ * @since 1.0.0
170
+ *
171
+ * @param $force Force tracking if it's not time
172
+ */
173
+ public function do_tracking( $force = false ) {
174
+ // If the home site hasn't been defined, we just drop out. Nothing much we can do.
175
+ if ( ! $this->home_url ) {
176
+ return;
177
+ }
178
+
179
+ // Check to see if the user has opted in to tracking
180
+ $allow_tracking = $this->get_is_tracking_allowed();
181
+ if ( ! $allow_tracking ) {
182
+ return;
183
+ }
184
+
185
+ // Check to see if it's time to track
186
+ $track_time = $this->get_is_time_to_track();
187
+ if ( ! $track_time && ! $force ) {
188
+ return;
189
+ }
190
+
191
+ $this->set_admin_email();
192
+
193
+ // Get our data
194
+ $body = $this->get_data();
195
+
196
+ // Send the data
197
+ $this->send_data( $body );
198
+ }
199
+
200
+ /**
201
+ * We hook this to admin_init when the user accepts tracking
202
+ * Ensures the email address is available
203
+ *
204
+ * @since 1.2.1
205
+ */
206
+ public function force_tracking() {
207
+ $this->do_tracking( true ); // Run this straightaway
208
+ }
209
+
210
+ /**
211
+ * Send the data to the home site
212
+ *
213
+ * @since 1.0.0
214
+ */
215
+ public function send_data( $body ) {
216
+ $request = wp_remote_post( esc_url( $this->home_url . '?usage_tracker=hello' ), [
217
+ 'method' => 'POST',
218
+ 'timeout' => 20,
219
+ 'redirection' => 5,
220
+ 'httpversion' => '1.1',
221
+ 'blocking' => true,
222
+ 'body' => $body,
223
+ 'user-agent' => 'PUT/1.0.0; ' . home_url(),
224
+ ] );
225
+
226
+ $this->set_track_time();
227
+
228
+ if ( is_wp_error( $request ) ) {
229
+ return $request;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Here we collect most of the data
235
+ *
236
+ * @since 1.0.0
237
+ */
238
+ public function get_data() {
239
+ // Use this to pass error messages back if necessary
240
+ $body['message'] = '';
241
+
242
+ // Use this array to send data back
243
+ $body = [
244
+ 'plugin_slug' => sanitize_text_field( $this->plugin_name ),
245
+ 'url' => home_url(),
246
+ 'site_name' => get_bloginfo( 'name' ),
247
+ 'site_version' => get_bloginfo( 'version' ),
248
+ 'site_language' => get_bloginfo( 'language' ),
249
+ 'charset' => get_bloginfo( 'charset' ),
250
+ 'wisdom_version' => $this->wisdom_version,
251
+ 'php_version' => phpversion(),
252
+ 'multisite' => is_multisite(),
253
+ 'file_location' => __FILE__,
254
+ 'product_type' => esc_html( $this->what_am_i ),
255
+ ];
256
+
257
+ // Collect the email if the correct option has been set
258
+ if ( $this->get_can_collect_email() ) {
259
+ $body['email'] = $this->get_admin_email();
260
+ }
261
+ $body['marketing_method'] = $this->marketing;
262
+
263
+ $body['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '';
264
+
265
+ // Extra PHP fields
266
+ $body['memory_limit'] = ini_get( 'memory_limit' );
267
+ $body['upload_max_size'] = ini_get( 'upload_max_size' );
268
+ $body['post_max_size'] = ini_get( 'post_max_size' );
269
+ $body['upload_max_filesize'] = ini_get( 'upload_max_filesize' );
270
+ $body['max_execution_time'] = ini_get( 'max_execution_time' );
271
+ $body['max_input_time'] = ini_get( 'max_input_time' );
272
+
273
+ // Retrieve current plugin information
274
+ if ( ! function_exists( 'get_plugins' ) ) {
275
+ include ABSPATH . '/wp-admin/includes/plugin.php';
276
+ }
277
+
278
+ $plugins = array_keys( get_plugins() );
279
+ $active_plugins = get_option( 'active_plugins', [] );
280
+
281
+ foreach ( $plugins as $key => $plugin ) {
282
+ if ( in_array( $plugin, $active_plugins, true ) ) {
283
+ // Remove active plugins from list so we can show active and inactive separately
284
+ unset( $plugins[ $key ] );
285
+ }
286
+ }
287
+
288
+ $body['active_plugins'] = $active_plugins;
289
+ $body['inactive_plugins'] = $plugins;
290
+
291
+ // Check text direction
292
+ $body['text_direction'] = 'LTR';
293
+ if ( function_exists( 'is_rtl' ) ) {
294
+ if ( is_rtl() ) {
295
+ $body['text_direction'] = 'RTL';
296
+ }
297
+ } else {
298
+ $body['text_direction'] = 'not set';
299
+ }
300
+
301
+ /**
302
+ * Get our plugin data
303
+ * Currently we grab plugin name and version
304
+ * Or, return a message if the plugin data is not available
305
+ *
306
+ * @since 1.0.0
307
+ */
308
+ $plugin = $this->plugin_data();
309
+ $body['status'] = 'Active'; // Never translated
310
+ if ( empty( $plugin ) ) {
311
+ // We can't find the plugin data
312
+ // Send a message back to our home site
313
+ $body['message'] .= __( 'We can\'t detect any product information. This is most probably because you have not included the code snippet.', 'paid-memberships-pro' );
314
+ $body['status'] = 'Data not found'; // Never translated
315
+ } else {
316
+ if ( isset( $plugin['Name'] ) ) {
317
+ $body['plugin'] = sanitize_text_field( $plugin['Name'] );
318
+ }
319
+ if ( isset( $plugin['Version'] ) ) {
320
+ $body['version'] = sanitize_text_field( $plugin['Version'] );
321
+ }
322
+ }
323
+
324
+ /**
325
+ * Get our plugin options
326
+ *
327
+ * @since 1.0.0
328
+ */
329
+ $options = $this->options;
330
+ $plugin_options = [];
331
+ if ( ! empty( $options ) && is_array( $options ) ) {
332
+ foreach ( $options as $option ) {
333
+ $fields = get_option( $option );
334
+ // Check for permission to send this option
335
+ if ( isset( $fields['wisdom_registered_setting'] ) ) {
336
+ foreach ( $fields as $key => $value ) {
337
+ $plugin_options[ $key ] = $value;
338
+ }
339
+ }
340
+ }
341
+ }
342
+ $body['plugin_options'] = $this->options; // Returns array
343
+ $body['plugin_options_fields'] = $plugin_options; // Returns object
344
+
345
+ /**
346
+ * Get our theme data
347
+ * Currently we grab theme name and version
348
+ *
349
+ * @since 1.0.0
350
+ */
351
+ $theme = wp_get_theme();
352
+ if ( $theme->Name ) {
353
+ $body['theme'] = sanitize_text_field( $theme->Name );
354
+ }
355
+ if ( $theme->Version ) {
356
+ $body['theme_version'] = sanitize_text_field( $theme->Version );
357
+ }
358
+ if ( $theme->Template ) {
359
+ $body['theme_parent'] = sanitize_text_field( $theme->Template );
360
+ }
361
+
362
+ // PMPRO MODIFICATION.
363
+ /**
364
+ * Allow filtering the data to be sent to the Wisdom plugin site.
365
+ *
366
+ * @since 2.8
367
+ *
368
+ * @param array $body The data to be sent to the Wisdom plugin site.
369
+ */
370
+ $body = apply_filters( "wisdom_tracker_data_{$this->plugin_name}", $body );
371
+
372
+ // Return the data
373
+ return $body;
374
+ }
375
+
376
+ /**
377
+ * Return plugin data
378
+ *
379
+ * @since 1.0.0
380
+ */
381
+ public function plugin_data() {
382
+ // Being cautious here
383
+ if ( ! function_exists( 'get_plugin_data' ) ) {
384
+ include ABSPATH . '/wp-admin/includes/plugin.php';
385
+ }
386
+ // Retrieve current plugin information
387
+ $plugin = get_plugin_data( $this->plugin_file );
388
+
389
+ return $plugin;
390
+ }
391
+
392
+ /**
393
+ * Deactivating plugin
394
+ *
395
+ * @since 1.0.0
396
+ */
397
+ public function deactivate_this_plugin() {
398
+ // Check to see if the user has opted in to tracking
399
+ if ( $this->what_am_i == 'theme' ) {
400
+ $allow_tracking = $this->theme_allows_tracking;
401
+ } else {
402
+ $allow_tracking = $this->get_is_tracking_allowed();
403
+ }
404
+
405
+ if ( ! $allow_tracking ) {
406
+ return;
407
+ }
408
+
409
+ $body = $this->get_data();
410
+ $body['status'] = 'Deactivated'; // Never translated
411
+ $body['deactivated_date'] = time();
412
+
413
+ // Add deactivation form data
414
+ if ( false !== get_option( 'wisdom_deactivation_reason_' . $this->plugin_name ) ) {
415
+ $body['deactivation_reason'] = get_option( 'wisdom_deactivation_reason_' . $this->plugin_name );
416
+ }
417
+ if ( false !== get_option( 'wisdom_deactivation_details_' . $this->plugin_name ) ) {
418
+ $body['deactivation_details'] = get_option( 'wisdom_deactivation_details_' . $this->plugin_name );
419
+ }
420
+
421
+ $this->send_data( $body );
422
+ // Clear scheduled update
423
+ wp_clear_scheduled_hook( 'put_do_weekly_action' );
424
+
425
+ // Clear the wisdom_last_track_time value for this plugin
426
+ // @since 1.2.2
427
+ $track_time = get_option( 'wisdom_last_track_time' );
428
+ if ( isset( $track_time[ $this->plugin_name ] ) ) {
429
+ unset( $track_time[ $this->plugin_name ] );
430
+ }
431
+ update_option( 'wisdom_last_track_time', $track_time );
432
+ }
433
+
434
+ /**
435
+ * Is tracking allowed?
436
+ *
437
+ * @since 1.0.0
438
+ */
439
+ public function get_is_tracking_allowed() {
440
+ // First, check if the user has changed their mind and opted out of tracking
441
+ if ( $this->has_user_opted_out() ) {
442
+ $this->set_is_tracking_allowed( false, $this->plugin_name );
443
+
444
+ // PMPRO MODIFICATION.
445
+ $this->set_can_collect_email( false, $this->plugin_name );
446
+
447
+ return false;
448
+ }
449
+
450
+ if ( $this->what_am_i == 'theme' ) {
451
+ $mod = get_theme_mod( 'wisdom-allow-tracking', 0 );
452
+ if ( $mod ) {
453
+ return true;
454
+ }
455
+ } else {
456
+ // The wisdom_allow_tracking option is an array of plugins that are being tracked
457
+ $allow_tracking = get_option( 'wisdom_allow_tracking' );
458
+ // If this plugin is in the array, then tracking is allowed
459
+ if ( isset( $allow_tracking[ $this->plugin_name ] ) ) {
460
+ return true;
461
+ }
462
+ }
463
+
464
+ return false;
465
+ }
466
+
467
+ /**
468
+ * Set if tracking is allowed
469
+ * Option is an array of all plugins with tracking permitted
470
+ * More than one plugin may be using the tracker
471
+ *
472
+ * @since 1.0.0
473
+ *
474
+ * @param $is_allowed Boolean true if tracking is allowed, false if not
475
+ */
476
+ public function set_is_tracking_allowed( $is_allowed, $plugin = null ) {
477
+ if ( empty( $plugin ) ) {
478
+ $plugin = $this->plugin_name;
479
+ }
480
+
481
+ // The wisdom_allow_tracking option is an array of plugins that are being tracked
482
+ $allow_tracking = get_option( 'wisdom_allow_tracking' );
483
+
484
+ // If the user has decided to opt out
485
+ if ( $this->has_user_opted_out() ) {
486
+ if ( $this->what_am_i == 'theme' ) {
487
+ set_theme_mod( 'wisdom-allow-tracking', 0 );
488
+ } else {
489
+ if ( isset( $allow_tracking[ $plugin ] ) ) {
490
+ unset( $allow_tracking[ $plugin ] );
491
+ }
492
+ }
493
+ } elseif ( $is_allowed || ! $this->require_optin ) {
494
+ // If the user has agreed to allow tracking or if opt-in is not required
495
+
496
+ if ( $this->what_am_i == 'theme' ) {
497
+ set_theme_mod( 'wisdom-allow-tracking', 1 );
498
+ } else {
499
+ if ( empty( $allow_tracking ) || ! is_array( $allow_tracking ) ) {
500
+ // If nothing exists in the option yet, start a new array with the plugin name
501
+ $allow_tracking = [ $plugin => $plugin ];
502
+ } else {
503
+ // Else add the plugin name to the array
504
+ $allow_tracking[ $plugin ] = $plugin;
505
+ }
506
+ }
507
+ } else {
508
+ if ( $this->what_am_i == 'theme' ) {
509
+ set_theme_mod( 'wisdom-allow-tracking', 0 );
510
+ } else {
511
+ if ( isset( $allow_tracking[ $plugin ] ) ) {
512
+ unset( $allow_tracking[ $plugin ] );
513
+ }
514
+ }
515
+ }
516
+
517
+ update_option( 'wisdom_allow_tracking', $allow_tracking );
518
+ }
519
+
520
+ /**
521
+ * Has the user opted out of allowing tracking?
522
+ * Note that themes are opt in / plugins are opt out
523
+ *
524
+ * @since 1.1.0
525
+ * @return Boolean
526
+ */
527
+ public function has_user_opted_out() {
528
+ // Different opt-out methods for plugins and themes
529
+ if ( $this->what_am_i == 'theme' ) {
530
+ // Look for the theme mod
531
+ $mod = get_theme_mod( 'wisdom-allow-tracking', 0 );
532
+ if ( false === $mod ) {
533
+ // If the theme mod is not set, then return true - the user has opted out
534
+ return true;
535
+ }
536
+ } else {
537
+ // Iterate through the options that are being tracked looking for wisdom_opt_out setting
538
+ if ( ! empty( $this->options ) ) {
539
+ foreach ( $this->options as $option_name ) {
540
+ // Check each option
541
+ $options = get_option( $option_name );
542
+ // If we find the setting, return true
543
+ if ( ! empty( $options['wisdom_opt_out'] ) ) {
544
+ return true;
545
+ }
546
+ }
547
+ }
548
+ }
549
+
550
+ return false;
551
+ }
552
+
553
+ /**
554
+ * Check if it's time to track
555
+ *
556
+ * @since 1.1.1
557
+ */
558
+ public function get_is_time_to_track() {
559
+ // Let's see if we're due to track this plugin yet
560
+ $track_times = get_option( 'wisdom_last_track_time', [] );
561
+ if ( ! isset( $track_times[ $this->plugin_name ] ) ) {
562
+ // If we haven't set a time for this plugin yet, then we must track it
563
+ return true;
564
+ } else {
565
+ // If the time is set, let's get our schedule and check if it's time to track
566
+ $schedule = $this->get_schedule();
567
+ if ( $schedule == 'daily' ) {
568
+ $period = 'day';
569
+ } elseif ( $schedule == 'weekly' ) {
570
+ $period = 'week';
571
+ } else {
572
+ $period = 'month';
573
+ }
574
+ if ( $track_times[ $this->plugin_name ] < strtotime( '-1 ' . $period ) ) {
575
+ return true;
576
+ }
577
+ }
578
+
579
+ return false;
580
+ }
581
+
582
+ /**
583
+ * Record the time we send tracking data
584
+ *
585
+ * @since 1.1.1
586
+ */
587
+ public function set_track_time() {
588
+ // We've tracked, so record the time
589
+ $track_times = get_option( 'wisdom_last_track_time', [] );
590
+ // Set different times according to plugin, in case we are tracking multiple plugins
591
+ $track_times[ $this->plugin_name ] = time();
592
+ update_option( 'wisdom_last_track_time', $track_times );
593
+ }
594
+
595
+ /**
596
+ * Set the time when we can display the opt-in notification
597
+ * Will display now unless filtered
598
+ *
599
+ * @since 1.2.4
600
+ */
601
+ public function set_notification_time() {
602
+ $notification_times = get_option( 'wisdom_notification_times', [] );
603
+ // Set different times according to plugin, in case we are tracking multiple plugins
604
+ if ( ! isset( $notification_times[ $this->plugin_name ] ) ) {
605
+ $delay_notification = apply_filters( 'wisdom_delay_notification_' . $this->plugin_name, 0 );
606
+ // We can delay the notification time
607
+ $notification_time = time() + absint( $delay_notification );
608
+ $notification_times[ $this->plugin_name ] = $notification_time;
609
+ update_option( 'wisdom_notification_times', $notification_times );
610
+ }
611
+ }
612
+
613
+ /**
614
+ * Get whether it's time to display the notification
615
+ *
616
+ * @since 1.2.4
617
+ * @return Boolean
618
+ */
619
+ public function get_is_notification_time() {
620
+ $notification_times = get_option( 'wisdom_notification_times', [] );
621
+ $time = time();
622
+ // Set different times according to plugin, in case we are tracking multiple plugins
623
+ if ( isset( $notification_times[ $this->plugin_name ] ) ) {
624
+ $notification_time = $notification_times[ $this->plugin_name ];
625
+ if ( $time >= $notification_time ) {
626
+ return true;
627
+ }
628
+ }
629
+
630
+ return false;
631
+ }
632
+
633
+ /**
634
+ * Set if we should block the opt-in notice for this plugin
635
+ * Option is an array of all plugins that have received a response from the user
636
+ *
637
+ * @since 1.0.0
638
+ */
639
+ public function update_block_notice( $plugin = null ) {
640
+ if ( empty( $plugin ) ) {
641
+ $plugin = $this->plugin_name;
642
+ }
643
+ $block_notice = get_option( 'wisdom_block_notice' );
644
+ if ( empty( $block_notice ) || ! is_array( $block_notice ) ) {
645
+ // If nothing exists in the option yet, start a new array with the plugin name
646
+ $block_notice = [ $plugin => $plugin ];
647
+ } else {
648
+ // Else add the plugin name to the array
649
+ $block_notice[ $plugin ] = $plugin;
650
+ }
651
+ update_option( 'wisdom_block_notice', $block_notice );
652
+ }
653
+
654
+ /**
655
+ * Can we collect the email address?
656
+ *
657
+ * @since 1.0.0
658
+ */
659
+ public function get_can_collect_email() {
660
+ // The wisdom_collect_email option is an array of plugins that are being tracked
661
+ $collect_email = get_option( 'wisdom_collect_email' );
662
+ // If this plugin is in the array, then we can collect the email address
663
+ if ( isset( $collect_email[ $this->plugin_name ] ) ) {
664
+ return true;
665
+ }
666
+
667
+ return false;
668
+ }
669
+
670
+ /**
671
+ * Set if user has allowed us to collect their email address
672
+ * Option is an array of all plugins with email collection permitted
673
+ * More than one plugin may be using the tracker
674
+ *
675
+ * @since 1.0.0
676
+ *
677
+ * @param $can_collect Boolean true if collection is allowed, false if not
678
+ */
679
+ public function set_can_collect_email( $can_collect, $plugin = null ) {
680
+ if ( empty( $plugin ) ) {
681
+ $plugin = $this->plugin_name;
682
+ }
683
+ // The wisdom_collect_email option is an array of plugins that are being tracked
684
+ $collect_email = get_option( 'wisdom_collect_email' );
685
+ // If the user has agreed to allow tracking or if opt-in is not required
686
+ if ( $can_collect ) {
687
+ if ( empty( $collect_email ) || ! is_array( $collect_email ) ) {
688
+ // If nothing exists in the option yet, start a new array with the plugin name
689
+ $collect_email = [ $plugin => $plugin ];
690
+ } else {
691
+ // Else add the plugin name to the array
692
+ $collect_email[ $plugin ] = $plugin;
693
+ }
694
+ } else {
695
+ if ( isset( $collect_email[ $plugin ] ) ) {
696
+ unset( $collect_email[ $plugin ] );
697
+ }
698
+ }
699
+ update_option( 'wisdom_collect_email', $collect_email );
700
+ }
701
+
702
+ /**
703
+ * Get the correct email address to use
704
+ *
705
+ * @since 1.1.2
706
+ * @return Email address
707
+ */
708
+ public function get_admin_email() {
709
+ // The wisdom_collect_email option is an array of plugins that are being tracked
710
+ $email = get_option( 'wisdom_admin_emails' );
711
+ // If this plugin is in the array, then we can collect the email address
712
+ if ( isset( $email[ $this->plugin_name ] ) ) {
713
+ return $email[ $this->plugin_name ];
714
+ }
715
+
716
+ return false;
717
+ }
718
+
719
+ /**
720
+ * Set the correct email address to use
721
+ * There might be more than one admin on the site
722
+ * So we only use the first admin's email address
723
+ *
724
+ * @since 1.1.2
725
+ *
726
+ * @param $plugin Plugin name to set email address for
727
+ * @param $email Email address to set
728
+ */
729
+ public function set_admin_email( $email = null, $plugin = null ) {
730
+ if ( empty( $plugin ) ) {
731
+ $plugin = $this->plugin_name;
732
+ }
733
+ // If no email address passed, try to get the current user's email
734
+ if ( empty( $email ) ) {
735
+ // Have to check that current user object is available
736
+ if ( function_exists( 'wp_get_current_user' ) ) {
737
+ $current_user = wp_get_current_user();
738
+ $email = $current_user->user_email;
739
+ }
740
+ }
741
+ // The wisdom_admin_emails option is an array of admin email addresses
742
+ $admin_emails = get_option( 'wisdom_admin_emails' );
743
+ if ( empty( $admin_emails ) || ! is_array( $admin_emails ) ) {
744
+ // If nothing exists in the option yet, start a new array with the plugin name
745
+ $admin_emails = [ $plugin => sanitize_email( $email ) ];
746
+ } elseif ( empty( $admin_emails[ $plugin ] ) ) {
747
+ // Else add the email address to the array, if not already set
748
+ $admin_emails[ $plugin ] = sanitize_email( $email );
749
+ }
750
+ update_option( 'wisdom_admin_emails', $admin_emails );
751
+ }
752
+
753
+ /**
754
+ * Display the admin notice to users to allow them to opt in
755
+ *
756
+ * @since 1.0.0
757
+ */
758
+ public function optin_notice() {
759
+ // Check for plugin args
760
+ if ( isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) {
761
+ $plugin = sanitize_text_field( $_GET['plugin'] );
762
+ $action = sanitize_text_field( $_GET['plugin_action'] );
763
+ if ( $action == 'yes' ) {
764
+ $this->set_is_tracking_allowed( true, $plugin );
765
+ // Run this straightaway
766
+ add_action( 'admin_init', [ $this, 'force_tracking' ] );
767
+ } else {
768
+ $this->set_is_tracking_allowed( false, $plugin );
769
+ }
770
+ $this->update_block_notice( $plugin );
771
+ }
772
+
773
+ // Is it time to display the notification?
774
+ $is_time = $this->get_is_notification_time();
775
+ if ( ! $is_time ) {
776
+ return false;
777
+ }
778
+
779
+ // Check whether to block the notice, e.g. because we're in a local environment
780
+ // wisdom_block_notice works the same as wisdom_allow_tracking, an array of plugin names
781
+ $block_notice = get_option( 'wisdom_block_notice' );
782
+
783
+ if ( isset( $block_notice[ $this->plugin_name ] ) ) {
784
+ return;
785
+ }
786
+
787
+ if ( ! current_user_can( 'manage_options' ) ) {
788
+ return;
789
+ }
790
+
791
+ // @credit EDD
792
+ // Don't bother asking user to opt in if they're in local dev
793
+ $is_local = false;
794
+ if ( stristr( network_site_url( '/' ), '.dev' ) !== false || stristr( network_site_url( '/' ), 'localhost' ) !== false || stristr( network_site_url( '/' ), ':8888' ) !== false ) {
795
+ $is_local = true;
796
+ }
797
+
798
+ // PMPRO MODIFICATION
799
+ if ( ! $is_local && stristr( network_site_url( '/' ), '.local' ) !== false ) {
800
+ //$is_local = true;
801
+ }
802
+
803
+ $is_local = apply_filters( 'wisdom_is_local_' . $this->plugin_name, $is_local );
804
+ if ( $is_local ) {
805
+ $this->update_block_notice();
806
+
807
+ // PMPRO MODIFICATION.
808
+ if ( $this->marketing ) {
809
+ $this->set_can_collect_email( false );
810
+ }
811
+ } else {
812
+ // Display the notice requesting permission to track
813
+ // Retrieve current plugin information
814
+ $plugin = $this->plugin_data();
815
+ $plugin_name = $plugin['Name'];
816
+
817
+ // Args to add to query if user opts in to tracking
818
+ $yes_args = [
819
+ 'plugin' => $this->plugin_name,
820
+ 'plugin_action' => 'yes',
821
+ ];
822
+
823
+ // Decide how to request permission to collect email addresses
824
+ if ( $this->marketing == 1 ) {
825
+ // Option 1 combines permissions to track and collect email
826
+ $yes_args['marketing_optin'] = 'yes';
827
+ } elseif ( $this->marketing == 2 ) {
828
+ // Option 2 enables a second notice that fires after the user opts in to tracking
829
+ $yes_args['marketing'] = 'yes';
830
+ }
831
+ $url_yes = add_query_arg( $yes_args );
832
+ $url_no = add_query_arg( [
833
+ 'plugin' => $this->plugin_name,
834
+ 'plugin_action' => 'no',
835
+ ] );
836
+
837
+ // Decide on notice text
838
+ if ( $this->marketing != 1 ) {
839
+ // Standard notice text
840
+ $notice_text = sprintf( __( 'Thank you for installing our %1$s. We would like to track its usage on your site. We don\'t record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional.', 'paid-memberships-pro' ), $this->what_am_i );
841
+ } else {
842
+ // If we have option 1 for marketing, we include reference to sending product information here
843
+ $notice_text = sprintf( __( 'Thank you for installing our %1$s. We\'d like your permission to track its usage on your site and subscribe you to our newsletter. We won\'t record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional.', 'paid-memberships-pro' ), $this->what_am_i );
844
+ }
845
+ // And we allow you to filter the text anyway
846
+ $notice_text = apply_filters( 'wisdom_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?>
847
+
848
+ <div class="notice notice-info updated put-dismiss-notice">
849
+ <h3><?php echo 'Enable Data Tracking For ' . esc_html( $plugin_name ) . '</strong>'; ?></h3>
850
+ <p><?php echo wp_kses_post( $notice_text ); ?></p>
851
+ <p>
852
+ <a href="<?php echo esc_url( $url_yes ); ?>" class="button button-primary"><?php _e( 'Allow', 'paid-memberships-pro' ); ?></a>
853
+ <a href="<?php echo esc_url( $url_no ); ?>" class="button button-secondary"><?php _e( 'Do Not Allow', 'paid-memberships-pro' ); ?></a>
854
+ </p>
855
+ </div>
856
+ <?php
857
+ }
858
+ }
859
+
860
+ /**
861
+ * Display the marketing notice to users if enabled
862
+ * Only displays after the user has opted in to tracking
863
+ *
864
+ * @since 1.0.0
865
+ */
866
+ public function marketing_notice() {
867
+ // Check if user has opted in to marketing
868
+ if ( isset( $_GET['marketing_optin'] ) ) {
869
+ // Set marketing optin
870
+ $this->set_can_collect_email( sanitize_text_field( $_GET['marketing_optin'] ), $this->plugin_name );
871
+ // Do tracking
872
+ $this->do_tracking( true );
873
+ } elseif ( isset( $_GET['marketing'] ) && $_GET['marketing'] == 'yes' ) {
874
+ // Display the notice requesting permission to collect email address
875
+ // Retrieve current plugin information
876
+ $plugin = $this->plugin_data();
877
+ $plugin_name = $plugin['Name'];
878
+
879
+ $url_yes = add_query_arg( [
880
+ 'plugin' => $this->plugin_name,
881
+ 'marketing_optin' => 'yes',
882
+ ] );
883
+ $url_no = add_query_arg( [
884
+ 'plugin' => $this->plugin_name,
885
+ 'marketing_optin' => 'no',
886
+ ] );
887
+
888
+ $marketing_text = sprintf( __( 'Thank you for opting in to tracking. Would you like to receive occasional news about this %s, including details of new features and special offers?', 'paid-memberships-pro' ), $this->what_am_i );
889
+ $marketing_text = apply_filters( 'wisdom_marketing_text_' . esc_attr( $this->plugin_name ), $marketing_text ); ?>
890
+
891
+ <div class="notice notice-info updated put-dismiss-notice">
892
+ <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
893
+ <p><?php echo esc_html( $marketing_text ); ?></p>
894
+ <p>
895
+ <a href="<?php echo esc_url( $url_yes ); ?>" data-putnotice="yes" class="button-secondary"><?php _e( 'Yes Please', 'paid-memberships-pro' ); ?></a>
896
+ <a href="<?php echo esc_url( $url_no ); ?>" data-putnotice="no" class="button-secondary"><?php _e( 'No Thank You', 'paid-memberships-pro' ); ?></a>
897
+ </p>
898
+ </div>
899
+ <?php }
900
+ }
901
+
902
+ /**
903
+ * Filter the deactivation link to allow us to present a form when the user deactivates the plugin
904
+ *
905
+ * @since 1.0.0
906
+ */
907
+ public function filter_action_links( $links ) {
908
+ // Check to see if the user has opted in to tracking
909
+ if ( ! $this->get_is_tracking_allowed() ) {
910
+ return $links;
911
+ }
912
+ if ( isset( $links['deactivate'] ) && $this->include_goodbye_form ) {
913
+ $deactivation_link = $links['deactivate'];
914
+ // Insert an onClick action to allow form before deactivating
915
+ $deactivation_link = str_replace( '<a ', '<div class="put-goodbye-form-wrapper"><span class="put-goodbye-form" id="put-goodbye-form-' . esc_attr( $this->plugin_name ) . '"></span></div><a onclick="javascript:event.preventDefault();" id="put-goodbye-link-' . esc_attr( $this->plugin_name ) . '" ', $deactivation_link );
916
+ $links['deactivate'] = $deactivation_link;
917
+ }
918
+
919
+ return $links;
920
+ }
921
+
922
+ /*
923
+ * Form text strings
924
+ * These are non-filterable and used as fallback in case filtered strings aren't set correctly
925
+ * @since 1.0.0
926
+ */
927
+ public function form_default_text() {
928
+ $form = [];
929
+ $form['heading'] = __( 'Sorry to see you go', 'paid-memberships-pro' );
930
+ $form['body'] = __( 'Before you deactivate the plugin, would you quickly give us your reason for doing so?', 'paid-memberships-pro' );
931
+ $form['options'] = [
932
+ __( 'Set up is too difficult', 'paid-memberships-pro' ),
933
+ __( 'Lack of documentation', 'paid-memberships-pro' ),
934
+ __( 'Not the features I wanted', 'paid-memberships-pro' ),
935
+ __( 'Found a better plugin', 'paid-memberships-pro' ),
936
+ __( 'Installed by mistake', 'paid-memberships-pro' ),
937
+ __( 'Only required temporarily', 'paid-memberships-pro' ),
938
+ __( 'Didn\'t work', 'paid-memberships-pro' ),
939
+ ];
940
+ $form['details'] = __( 'Details (optional)', 'paid-memberships-pro' );
941
+
942
+ return $form;
943
+ }
944
+
945
+ /**
946
+ * Form text strings
947
+ * These can be filtered
948
+ * The filter hook must be unique to the plugin
949
+ *
950
+ * @since 1.0.0
951
+ */
952
+ public function form_filterable_text() {
953
+ $form = $this->form_default_text();
954
+
955
+ return apply_filters( 'wisdom_form_text_' . esc_attr( $this->plugin_name ), $form );
956
+ }
957
+
958
+ /**
959
+ * Form text strings
960
+ * These can be filtered
961
+ *
962
+ * @since 1.0.0
963
+ */
964
+ public function goodbye_ajax() {
965
+ // Get our strings for the form
966
+ $form = $this->form_filterable_text();
967
+ if ( ! isset( $form['heading'] ) || ! isset( $form['body'] ) || ! isset( $form['options'] ) || ! is_array( $form['options'] ) || ! isset( $form['details'] ) ) {
968
+ // If the form hasn't been filtered correctly, we revert to the default form
969
+ $form = $this->form_default_text();
970
+ }
971
+ // Build the HTML to go in the form
972
+ $html = '<div class="put-goodbye-form-head"><strong>' . esc_html( $form['heading'] ) . '</strong></div>';
973
+ $html .= '<div class="put-goodbye-form-body"><p>' . esc_html( $form['body'] ) . '</p>';
974
+ if ( is_array( $form['options'] ) ) {
975
+ $html .= '<div class="put-goodbye-options"><p>';
976
+ foreach ( $form['options'] as $option ) {
977
+ $html .= '<input type="checkbox" name="put-goodbye-options[]" id="' . str_replace( " ", "", esc_attr( $option ) ) . '" value="' . esc_attr( $option ) . '"> <label for="' . str_replace( " ", "", esc_attr( $option ) ) . '">' . esc_attr( $option ) . '</label><br>';
978
+ }
979
+ $html .= '</p><label for="put-goodbye-reasons">' . esc_html( $form['details'] ) . '</label><textarea name="put-goodbye-reasons" id="put-goodbye-reasons" rows="2" style="width:100%"></textarea>';
980
+ $html .= '</div><!-- .put-goodbye-options -->';
981
+ }
982
+ $html .= '</div><!-- .put-goodbye-form-body -->';
983
+ $html .= '<p class="deactivating-spinner"><span class="spinner"></span> ' . __( 'Submitting form', 'paid-memberships-pro' ) . '</p>';
984
+ ?>
985
+ <div class="put-goodbye-form-bg"></div>
986
+ <style type="text/css">
987
+ .put-form-active .put-goodbye-form-bg {
988
+ background: rgba(0, 0, 0, .5);
989
+ position: fixed;
990
+ top: 0;
991
+ left: 0;
992
+ width: 100%;
993
+ height: 100%;
994
+ }
995
+
996
+ .put-goodbye-form-wrapper {
997
+ position: relative;
998
+ z-index: 999;
999
+ display: none;
1000
+ }
1001
+
1002
+ .put-form-active .put-goodbye-form-wrapper {
1003
+ display: block;
1004
+ }
1005
+
1006
+ .put-goodbye-form {
1007
+ display: none;
1008
+ }
1009
+
1010
+ .put-form-active .put-goodbye-form {
1011
+ position: absolute;
1012
+ bottom: 30px;
1013
+ left: 0;
1014
+ max-width: 400px;
1015
+ background: #fff;
1016
+ white-space: normal;
1017
+ }
1018
+
1019
+ .put-goodbye-form-head {
1020
+ background: #0073aa;
1021
+ color: #fff;
1022
+ padding: 8px 18px;
1023
+ }
1024
+
1025
+ .put-goodbye-form-body {
1026
+ padding: 8px 18px;
1027
+ color: #444;
1028
+ }
1029
+
1030
+ .deactivating-spinner {
1031
+ display: none;
1032
+ }
1033
+
1034
+ .deactivating-spinner .spinner {
1035
+ float: none;
1036
+ margin: 4px 4px 0 18px;
1037
+ vertical-align: bottom;
1038
+ visibility: visible;
1039
+ }
1040
+
1041
+ .put-goodbye-form-footer {
1042
+ padding: 8px 18px;
1043
+ }
1044
+ </style>
1045
+ <script>
1046
+ jQuery( document ).ready( function ( $ ) {
1047
+ $( "#put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>" ).on( "click", function () {
1048
+ // We'll send the user to this deactivation link when they've completed or dismissed the form
1049
+ var url = document.getElementById( "put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>" );
1050
+ $( 'body' ).toggleClass( 'put-form-active' );
1051
+ $( "#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>" ).fadeIn();
1052
+ $( "#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>" ).html( '<?php echo $html; ?>' + '<div class="put-goodbye-form-footer"><p><a id="put-submit-form" class="button primary" href="#"><?php _e( 'Submit and Deactivate', 'paid-memberships-pro' ); ?></a>&nbsp;<a class="secondary button" href="' + url + '"><?php _e( 'Just Deactivate', 'paid-memberships-pro' ); ?></a></p></div>' );
1053
+ $( '#put-submit-form' ).on( 'click', function ( e ) {
1054
+ // As soon as we click, the body of the form should disappear
1055
+ $( "#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-body" ).fadeOut();
1056
+ $( "#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-footer" ).fadeOut();
1057
+ // Fade in spinner
1058
+ $( "#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .deactivating-spinner" ).fadeIn();
1059
+ e.preventDefault();
1060
+ var values = new Array();
1061
+ $.each( $( "input[name='put-goodbye-options[]']:checked" ), function () {
1062
+ values.push( $( this ).val() );
1063
+ } );
1064
+ var details = $( '#put-goodbye-reasons' ).val();
1065
+ var data = {
1066
+ 'action' : 'goodbye_form',
1067
+ 'values' : values,
1068
+ 'details' : details,
1069
+ 'security' : "<?php echo wp_create_nonce( 'wisdom_goodbye_form' ); ?>",
1070
+ 'dataType' : "json"
1071
+ }
1072
+ $.post( ajaxurl, data, function ( response ) {
1073
+ // Redirect to original deactivation URL
1074
+ window.location.href = url;
1075
+ } );
1076
+ } );
1077
+ // If we click outside the form, the form will close
1078
+ $( '.put-goodbye-form-bg' ).on( 'click', function () {
1079
+ $( "#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>" ).fadeOut();
1080
+ $( 'body' ).removeClass( 'put-form-active' );
1081
+ } );
1082
+ } );
1083
+ } );
1084
+ </script>
1085
+ <?php }
1086
+
1087
+ /**
1088
+ * AJAX callback when the form is submitted
1089
+ *
1090
+ * @since 1.0.0
1091
+ */
1092
+ public function goodbye_form_callback() {
1093
+ check_ajax_referer( 'wisdom_goodbye_form', 'security' );
1094
+ if ( isset( $_POST['values'] ) ) {
1095
+ $values = json_encode( wp_unslash( $_POST['values'] ) );
1096
+ update_option( 'wisdom_deactivation_reason_' . $this->plugin_name, $values );
1097
+ }
1098
+ if ( isset( $_POST['details'] ) ) {
1099
+ $details = sanitize_text_field( $_POST['details'] );
1100
+ update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details );
1101
+ }
1102
+ $this->do_tracking(); // Run this straightaway
1103
+ echo 'success';
1104
+ wp_die();
1105
+ }
1106
+
1107
+ }
classes/class.memberorder.php CHANGED
@@ -232,6 +232,12 @@
232
  return $this->is_renewal;
233
  }
234
 
 
 
 
 
 
 
235
  // Check the DB.
236
  $sqlQuery = "SELECT `id`
237
  FROM $wpdb->pmpro_membership_orders
@@ -754,12 +760,15 @@
754
  if(empty($this->gateway_environment))
755
  $this->gateway_environment = pmpro_getOption("gateway_environment");
756
 
757
- if(empty($this->datetime) && empty($this->timestamp))
758
- $this->datetime = date("Y-m-d H:i:s", time());
759
- elseif(empty($this->datetime) && !empty($this->timestamp) && is_numeric($this->timestamp))
 
760
  $this->datetime = date("Y-m-d H:i:s", $this->timestamp); //get datetime from timestamp
761
- elseif(empty($this->datetime) && !empty($this->timestamp))
762
  $this->datetime = $this->timestamp; //must have a datetime in it
 
 
763
 
764
  if(empty($this->notes))
765
  $this->notes = "";
@@ -1184,4 +1193,35 @@
1184
 
1185
  return apply_filters( 'pmpro_test_order_data', $this );
1186
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1187
  } // End of Class
232
  return $this->is_renewal;
233
  }
234
 
235
+ // Can't tell if this is a renewal without a timestamp.
236
+ if ( empty( $this->timestamp ) ) {
237
+ $this->is_renewal = false;
238
+ return $this->is_renewal;
239
+ }
240
+
241
  // Check the DB.
242
  $sqlQuery = "SELECT `id`
243
  FROM $wpdb->pmpro_membership_orders
760
  if(empty($this->gateway_environment))
761
  $this->gateway_environment = pmpro_getOption("gateway_environment");
762
 
763
+ if( empty( $this->datetime ) && empty( $this->timestamp ) ) {
764
+ $this->timestamp = time();
765
+ $this->datetime = date("Y-m-d H:i:s", $this->timestamp);
766
+ } elseif( empty( $this->datetime ) && ! empty( $this->timestamp ) && is_numeric( $this->timestamp ) ) {
767
  $this->datetime = date("Y-m-d H:i:s", $this->timestamp); //get datetime from timestamp
768
+ } elseif( empty( $this->datetime ) && ! empty( $this->timestamp ) ) {
769
  $this->datetime = $this->timestamp; //must have a datetime in it
770
+ $this->timestamp = strtotime( $this->datetime ); //fixing the timestamp
771
+ }
772
 
773
  if(empty($this->notes))
774
  $this->notes = "";
1193
 
1194
  return apply_filters( 'pmpro_test_order_data', $this );
1195
  }
1196
+
1197
+ /**
1198
+ * Does this order have any billing address fields set?
1199
+ * @since 2.8
1200
+ * @return bool True if ANY billing address field is non-empty.
1201
+ * False if ALL billing address fields are empty.
1202
+ */
1203
+ function has_billing_address() {
1204
+ // This is sometimes set.
1205
+ if ( ! empty( $this->Address1 ) ) {
1206
+ return true;
1207
+ }
1208
+
1209
+ // Avoid a warning if no billing object at all.
1210
+ if ( empty( $this->billing ) ) {
1211
+ return false;
1212
+ }
1213
+
1214
+ // Check billing fields.
1215
+ if ( ! empty( $this->billing->name )
1216
+ || ! empty( $this->billing->street )
1217
+ || ! empty( $this->billing->city )
1218
+ || ! empty( $this->billing->state )
1219
+ || ! empty( $this->billing->country )
1220
+ || ! empty( $this->billing->zip )
1221
+ || ! empty( $this->billing->phone ) ) {
1222
+ return true;
1223
+ }
1224
+
1225
+ return false;
1226
+ }
1227
  } // End of Class
classes/class.pmproemail.php CHANGED
@@ -241,6 +241,139 @@
241
 
242
  return $this->sendEmail();
243
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
244
 
245
  function sendCheckoutEmail($user = NULL, $invoice = NULL)
246
  {
241
 
242
  return $this->sendEmail();
243
  }
244
+
245
+ function sendRefundedEmail( $user = NULL, $invoice = NULL ) {
246
+ global $wpdb, $current_user;
247
+ if ( ! $user ) {
248
+ $user = $current_user;
249
+ }
250
+
251
+ if ( ! $user ) {
252
+ return false;
253
+ }
254
+
255
+ $membership_level = pmpro_getSpecificMembershipLevelForUser( $user->ID, $invoice->membership_id );
256
+ if ( ! empty( $membership_level ) ) {
257
+ $membership_level_id = $membership_level->id;
258
+ $membership_level_name = $membership_level->name;
259
+ } else {
260
+ $membership_level_id = '';
261
+ $membership_level_name = __( 'N/A', 'paid-memberships-pro' );
262
+ }
263
+
264
+ $this->email = $user->user_email;
265
+ $this->subject = sprintf(__( 'Your invoice for order #%s at %s has been REFUNDED', 'paid-memberships-pro' ), $invoice->code, get_option( 'blogname' ) );
266
+
267
+ $this->data = array(
268
+ 'user_login' => $user->user_login,
269
+ 'user_email' => $user->user_email,
270
+ 'display_name' => $user->display_name,
271
+ 'sitename' => get_option('blogname'),
272
+ 'siteemail' => pmpro_getOption('from_email'),
273
+ 'login_link' => pmpro_login_url(),
274
+ 'login_url' => pmpro_login_url(),
275
+ 'membership_id' => $membership_level_id,
276
+ 'membership_level_name' => $membership_level_name,
277
+ 'invoice_id' => $invoice->code,
278
+ 'invoice_total' => pmpro_formatPrice($invoice->total),
279
+ 'invoice_date' => date_i18n(get_option('date_format'), $invoice->getTimestamp()),
280
+ 'billing_name' => $invoice->billing->name,
281
+ 'billing_street' => $invoice->billing->street,
282
+ 'billing_city' => $invoice->billing->city,
283
+ 'billing_state' => $invoice->billing->state,
284
+ 'billing_zip' => $invoice->billing->zip,
285
+ 'billing_country' => $invoice->billing->country,
286
+ 'billing_phone' => $invoice->billing->phone,
287
+ 'cardtype' => $invoice->cardtype,
288
+ 'accountnumber' => hideCardNumber($invoice->accountnumber),
289
+ 'expirationmonth' => $invoice->expirationmonth,
290
+ 'expirationyear' => $invoice->expirationyear,
291
+ 'login_link' => pmpro_login_url(),
292
+ 'login_url' => pmpro_login_url(),
293
+ 'invoice_link' => pmpro_login_url( pmpro_url( 'invoice', '?invoice=' . $invoice->code ) ),
294
+ 'invoice_url' => pmpro_login_url( pmpro_url( 'invoice', '?invoice=' . $invoice->code ) )
295
+ );
296
+ $this->data['billing_address'] = pmpro_formatAddress(
297
+ $invoice->billing->name,
298
+ $invoice->billing->street,
299
+ "", //address 2
300
+ $invoice->billing->city,
301
+ $invoice->billing->state,
302
+ $invoice->billing->zip,
303
+ $invoice->billing->country,
304
+ $invoice->billing->phone
305
+ );
306
+
307
+ $this->template = apply_filters( 'pmpro_email_template', 'refund', $this );
308
+ return $this->sendEmail();
309
+ }
310
+
311
+ function sendRefundedAdminEmail( $user = NULL, $invoice = NULL ) {
312
+ global $wpdb, $current_user;
313
+ if ( ! $user ) {
314
+ $user = $current_user;
315
+ }
316
+
317
+ if ( ! $user ) {
318
+ return false;
319
+ }
320
+
321
+ $membership_level = pmpro_getSpecificMembershipLevelForUser( $user->ID, $invoice->membership_id );
322
+ if ( ! empty( $membership_level ) ) {
323
+ $membership_level_id = $membership_level->id;
324
+ $membership_level_name = $membership_level->name;
325
+ } else {
326
+ $membership_level_id = '';
327
+ $membership_level_name = __( 'N/A', 'paid-memberships-pro' );
328
+ }
329
+
330
+ $this->email = get_bloginfo( 'admin_email' );
331
+ $this->subject = sprintf(__( 'Invoice for order #%s at %s has been REFUNDED', 'paid-memberships-pro' ), $invoice->code, get_option( 'blogname' ) );
332
+
333
+ $this->data = array(
334
+ 'user_login' => $user->user_login,
335
+ 'user_email' => $user->user_email,
336
+ 'display_name' => $user->display_name,
337
+ 'sitename' => get_option('blogname'),
338
+ 'siteemail' => pmpro_getOption('from_email'),
339
+ 'login_link' => pmpro_login_url(),
340
+ 'login_url' => pmpro_login_url(),
341
+ 'membership_id' => $membership_level_id,
342
+ 'membership_level_name' => $membership_level_name,
343
+ 'invoice_id' => $invoice->code,
344
+ 'invoice_total' => pmpro_formatPrice($invoice->total),
345
+ 'invoice_date' => date_i18n(get_option('date_format'), $invoice->getTimestamp()),
346
+ 'billing_name' => $invoice->billing->name,
347
+ 'billing_street' => $invoice->billing->street,
348
+ 'billing_city' => $invoice->billing->city,
349
+ 'billing_state' => $invoice->billing->state,
350
+ 'billing_zip' => $invoice->billing->zip,
351
+ 'billing_country' => $invoice->billing->country,
352
+ 'billing_phone' => $invoice->billing->phone,
353
+ 'cardtype' => $invoice->cardtype,
354
+ 'accountnumber' => hideCardNumber($invoice->accountnumber),
355
+ 'expirationmonth' => $invoice->expirationmonth,
356
+ 'expirationyear' => $invoice->expirationyear,
357
+ 'login_link' => pmpro_login_url(),
358
+ 'login_url' => pmpro_login_url(),
359
+ 'invoice_link' => pmpro_login_url( pmpro_url( 'invoice', '?invoice=' . $invoice->code ) ),
360
+ 'invoice_url' => pmpro_login_url( pmpro_url( 'invoice', '?invoice=' . $invoice->code ) )
361
+ );
362
+ $this->data['billing_address'] = pmpro_formatAddress(
363
+ $invoice->billing->name,
364
+ $invoice->billing->street,
365
+ "", //address 2
366
+ $invoice->billing->city,
367
+ $invoice->billing->state,
368
+ $invoice->billing->zip,
369
+ $invoice->billing->country,
370
+ $invoice->billing->phone
371
+ );
372
+
373
+ $this->template = apply_filters( 'pmpro_email_template', 'refund_admin', $this );
374
+
375
+ return $this->sendEmail();
376
+ }
377
 
378
  function sendCheckoutEmail($user = NULL, $invoice = NULL)
379
  {
classes/gateways/class.pmprogateway_authorizenet.php CHANGED
@@ -43,7 +43,7 @@ class PMProGateway_authorizenet extends PMProGateway
43
  $morder->CVV2 = $authorizenet_cvv;
44
  return $morder;
45
  }
46
-
47
  /**
48
  * Make sure this gateway is in the gateways list
49
  *
@@ -112,7 +112,7 @@ class PMProGateway_authorizenet extends PMProGateway
112
  </tr>
113
  <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
114
  <th scope="row" valign="top">
115
- <label for="loginname"><?php _e('Login Name', 'paid-memberships-pro' );?>:</label>
116
  </th>
117
  <td>
118
  <input type="text" id="loginname" name="loginname" value="<?php echo esc_attr($values['loginname'])?>" class="regular-text code" />
@@ -120,7 +120,7 @@ class PMProGateway_authorizenet extends PMProGateway
120
  </tr>
121
  <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
122
  <th scope="row" valign="top">
123
- <label for="transactionkey"><?php _e('Transaction Key', 'paid-memberships-pro' );?>:</label>
124
  </th>
125
  <td>
126
  <input type="text" id="transactionkey" name="transactionkey" value="<?php echo esc_attr($values['transactionkey'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
@@ -128,10 +128,10 @@ class PMProGateway_authorizenet extends PMProGateway
128
  </tr>
129
  <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
130
  <th scope="row" valign="top">
131
- <label><?php _e('Silent Post URL', 'paid-memberships-pro' );?>:</label>
132
  </th>
133
  <td>
134
- <p><?php _e('To fully integrate with Authorize.net, be sure to set your Silent Post URL to', 'paid-memberships-pro' ); ?></p>
135
  <p><code><?php echo admin_url("admin-ajax.php") . "?action=authnet_silent_post";?></code></p>
136
  </td>
137
  </tr>
@@ -463,7 +463,7 @@ class PMProGateway_authorizenet extends PMProGateway
463
  //tax
464
  $order->subtotal = $amount;
465
  $tax = $order->getTax(true);
466
- $amount = pmpro_round_price((float)$order->subtotal + (float)$tax);
467
 
468
  //combine address
469
  $address = $order->Address1;
@@ -613,8 +613,8 @@ class PMProGateway_authorizenet extends PMProGateway
613
  $amount_tax = $order->getTaxForPrice($amount);
614
  $trial_tax = $order->getTaxForPrice($trialAmount);
615
 
616
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
617
- $trialAmount = pmpro_round_price((float)$trialAmount + (float)$trial_tax);
618
 
619
  //authorize.net doesn't support different periods between trial and actual
620
 
@@ -988,7 +988,7 @@ class PMProGateway_authorizenet extends PMProGateway
988
  $order->shorterror = $text;
989
  }
990
  }
991
-
992
  /**
993
  * This function takes the post_values and converts them to the proper format
994
  * for an http post. For example: "x_login=username&x_tran_key=a1B2c3D4"
@@ -1008,13 +1008,13 @@ class PMProGateway_authorizenet extends PMProGateway
1008
  * @param string $action being performed.
1009
  */
1010
  $post_values = apply_filters( 'pmpro_authorizenet_post_values', $post_values, $action );
1011
-
1012
  $post_string = '';
1013
  foreach( $post_values as $key => $value ) {
1014
  $post_string .= "$key=" . urlencode( str_replace("#", "%23", $value) ) . "&";
1015
  }
1016
  $post_string = rtrim( $post_string, "& " );
1017
-
1018
  return $post_string;
1019
  }
1020
 
43
  $morder->CVV2 = $authorizenet_cvv;
44
  return $morder;
45
  }
46
+
47
  /**
48
  * Make sure this gateway is in the gateways list
49
  *
112
  </tr>
113
  <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
114
  <th scope="row" valign="top">
115
+ <label for="loginname"><?php esc_html_e('Login Name', 'paid-memberships-pro' );?>:</label>
116
  </th>
117
  <td>
118
  <input type="text" id="loginname" name="loginname" value="<?php echo esc_attr($values['loginname'])?>" class="regular-text code" />
120
  </tr>
121
  <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
122
  <th scope="row" valign="top">
123
+ <label for="transactionkey"><?php esc_html_e('Transaction Key', 'paid-memberships-pro' );?>:</label>
124
  </th>
125
  <td>
126
  <input type="text" id="transactionkey" name="transactionkey" value="<?php echo esc_attr($values['transactionkey'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
128
  </tr>
129
  <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
130
  <th scope="row" valign="top">
131
+ <label><?php esc_html_e('Silent Post URL', 'paid-memberships-pro' );?>:</label>
132
  </th>
133
  <td>
134
+ <p><?php esc_html_e('To fully integrate with Authorize.net, be sure to set your Silent Post URL to', 'paid-memberships-pro' ); ?></p>
135
  <p><code><?php echo admin_url("admin-ajax.php") . "?action=authnet_silent_post";?></code></p>
136
  </td>
137
  </tr>
463
  //tax
464
  $order->subtotal = $amount;
465
  $tax = $order->getTax(true);
466
+ $amount = pmpro_round_price_as_string((float)$order->subtotal + (float)$tax);
467
 
468
  //combine address
469
  $address = $order->Address1;
613
  $amount_tax = $order->getTaxForPrice($amount);
614
  $trial_tax = $order->getTaxForPrice($trialAmount);
615
 
616
+ $amount = pmpro_round_price_as_string((float)$amount + (float)$amount_tax);
617
+ $trialAmount = pmpro_round_price_as_string((float)$trialAmount + (float)$trial_tax);
618
 
619
  //authorize.net doesn't support different periods between trial and actual
620
 
988
  $order->shorterror = $text;
989
  }
990
  }
991
+
992
  /**
993
  * This function takes the post_values and converts them to the proper format
994
  * for an http post. For example: "x_login=username&x_tran_key=a1B2c3D4"
1008
  * @param string $action being performed.
1009
  */
1010
  $post_values = apply_filters( 'pmpro_authorizenet_post_values', $post_values, $action );
1011
+
1012
  $post_string = '';
1013
  foreach( $post_values as $key => $value ) {
1014
  $post_string .= "$key=" . urlencode( str_replace("#", "%23", $value) ) . "&";
1015
  }
1016
  $post_string = rtrim( $post_string, "& " );
1017
+
1018
  return $post_string;
1019
  }
1020
 
classes/gateways/class.pmprogateway_braintree.php CHANGED
@@ -109,8 +109,15 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
109
  function loadBraintreeLibrary()
110
  {
111
  //load Braintree library if it hasn't been loaded already (usually by another plugin using Braintree)
112
- if(!class_exists("\Braintree"))
113
  require_once( PMPRO_DIR . "/includes/lib/Braintree/lib/Braintree.php");
 
 
 
 
 
 
 
114
  }
115
 
116
  /**
@@ -121,7 +128,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
121
  $cache_key = 'pmpro_braintree_plans_' . md5($this->gateway_environment . pmpro_getOption("braintree_merchantid") . pmpro_getOption("braintree_publickey") . pmpro_getOption("braintree_privatekey"));
122
 
123
  $plans = wp_cache_get( $cache_key,'pmpro_levels' );
124
-
125
  //check Braintree if no transient found
126
  if($plans === false) {
127
 
@@ -169,16 +176,16 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
169
  * @param $level_id
170
  */
171
  public static function pmpro_save_level_action( $level_id ) {
172
-
173
  $BT_Gateway = new PMProGateway_braintree();
174
-
175
  if ( isset( $BT_Gateway->gateway_environment ) ) {
176
  $cache_key = 'pmpro_braintree_plans_' . md5($BT_Gateway->gateway_environment . pmpro_getOption("braintree_merchantid") . pmpro_getOption("braintree_publickey") . pmpro_getOption("braintree_privatekey"));
177
-
178
  wp_cache_delete( $cache_key,'pmpro_levels' );
179
  }
180
  }
181
-
182
  /**
183
  * Search for a plan by id
184
  */
@@ -310,7 +317,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
310
  </tr>
311
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
312
  <th scope="row" valign="top">
313
- <label for="braintree_merchantid"><?php _e('Merchant ID', 'paid-memberships-pro' );?>:</label>
314
  </th>
315
  <td>
316
  <input type="text" id="braintree_merchantid" name="braintree_merchantid" value="<?php echo esc_attr($values['braintree_merchantid'])?>" class="regular-text code" />
@@ -318,7 +325,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
318
  </tr>
319
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
320
  <th scope="row" valign="top">
321
- <label for="braintree_publickey"><?php _e('Public Key', 'paid-memberships-pro' );?>:</label>
322
  </th>
323
  <td>
324
  <input type="text" id="braintree_publickey" name="braintree_publickey" value="<?php echo esc_attr($values['braintree_publickey'])?>" class="regular-text code" />
@@ -326,7 +333,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
326
  </tr>
327
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
328
  <th scope="row" valign="top">
329
- <label for="braintree_privatekey"><?php _e('Private Key', 'paid-memberships-pro' );?>:</label>
330
  </th>
331
  <td>
332
  <input type="text" id="braintree_privatekey" name="braintree_privatekey" value="<?php echo esc_attr($values['braintree_privatekey'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
@@ -334,7 +341,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
334
  </tr>
335
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
336
  <th scope="row" valign="top">
337
- <label for="braintree_encryptionkey"><?php _e('Client-Side Encryption Key', 'paid-memberships-pro' );?>:</label>
338
  </th>
339
  <td>
340
  <textarea id="braintree_encryptionkey" name="braintree_encryptionkey" autocomplete="off" rows="3" cols="50" class="large-text code pmpro-admin-secure-key"><?php echo esc_textarea($values['braintree_encryptionkey'])?></textarea>
@@ -342,10 +349,10 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
342
  </tr>
343
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
344
  <th scope="row" valign="top">
345
- <label><?php _e('Web Hook URL', 'paid-memberships-pro' );?>:</label>
346
  </th>
347
  <td>
348
- <p><?php _e('To fully integrate with Braintree, be sure to set your Web Hook URL to', 'paid-memberships-pro' );?></p>
349
  <p><code><?php
350
  //echo admin_url("admin-ajax.php") . "?action=braintree_webhook";
351
  echo add_query_arg( 'action', 'braintree_webhook', admin_url( 'admin-ajax.php' ) );
@@ -354,7 +361,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
354
  </tr>
355
  <?php
356
  }
357
-
358
  /**
359
  * Code added to checkout preheader.
360
  *
@@ -451,7 +458,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
451
  ?>
452
  <div id="pmpro_payment_information_fields" class="<?php echo pmpro_get_element_class( 'pmpro_checkout', 'pmpro_payment_information_fields' ); ?>" <?php if(!$pmpro_requirebilling || apply_filters("pmpro_hide_payment_information_fields", false) ) { ?>style="display: none;"<?php } ?>>
453
  <h3>
454
- <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-name' ); ?>"><?php _e('Payment Information', 'paid-memberships-pro' );?></span>
455
  <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-msg' ); ?>"><?php printf(__('We Accept %s', 'paid-memberships-pro' ), $pmpro_accepted_credit_cards_string);?></span>
456
  </h3>
457
  <?php $sslseal = pmpro_getOption("sslseal"); ?>
@@ -463,20 +470,20 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
463
  $pmpro_include_cardtype_field = apply_filters('pmpro_include_cardtype_field', true);
464
  if($pmpro_include_cardtype_field) { ?>
465
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-card-type', 'pmpro_payment-card-type' ); ?>">
466
- <label for="CardType"><?php _e('Card Type', 'paid-memberships-pro' );?></label>
467
  <select id="CardType" name="CardType" class="<?php echo pmpro_get_element_class( 'CardType' ); ?>">
468
  <?php foreach($pmpro_accepted_credit_cards as $cc) { ?>
469
- <option value="<?php echo $cc?>" <?php if($CardType == $cc) { ?>selected="selected"<?php } ?>><?php echo $cc?></option>
470
  <?php } ?>
471
  </select>
472
  </div>
473
  <?php } ?>
474
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-account-number', 'pmpro_payment-account-number' ); ?>">
475
- <label for="AccountNumber"><?php _e('Card Number', 'paid-memberships-pro' );?></label>
476
  <input id="AccountNumber" name="AccountNumber" class="<?php echo pmpro_get_element_class( 'input', 'AccountNumber' ); ?>" type="text" size="25" value="<?php echo esc_attr($AccountNumber)?>" data-encrypted-name="number" autocomplete="off" />
477
  </div>
478
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-expiration', 'pmpro_payment-expiration' ); ?>">
479
- <label for="ExpirationMonth"><?php _e('Expiration Date', 'paid-memberships-pro' );?></label>
480
  <select id="ExpirationMonth" name="ExpirationMonth" class="<?php echo pmpro_get_element_class( 'ExpirationMonth' ); ?>">
481
  <option value="01" <?php if($ExpirationMonth == "01") { ?>selected="selected"<?php } ?>>01</option>
482
  <option value="02" <?php if($ExpirationMonth == "02") { ?>selected="selected"<?php } ?>>02</option>
@@ -492,7 +499,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
492
  <option value="12" <?php if($ExpirationMonth == "12") { ?>selected="selected"<?php } ?>>12</option>
493
  </select>/<select id="ExpirationYear" name="ExpirationYear" class="<?php echo pmpro_get_element_class( 'ExpirationYear' ); ?>">
494
  <?php for($i = date_i18n("Y"); $i < date_i18n("Y") + 10; $i++) { ?>
495
- <option value="<?php echo $i?>" <?php if($ExpirationYear == $i) { ?>selected="selected"<?php } ?>><?php echo $i?></option>
496
  <?php } ?>
497
  </select>
498
  </div>
@@ -500,15 +507,15 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
500
  $pmpro_show_cvv = apply_filters("pmpro_show_cvv", true);
501
  if($pmpro_show_cvv) { ?>
502
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-cvv', 'pmpro_payment-cvv' ); ?>">
503
- <label for="CVV"><?php _e('CVV', 'paid-memberships-pro' );?></label>
504
- <input id="CVV" name="cvv" type="text" size="4" value="<?php if(!empty($_REQUEST['CVV'])) { echo esc_attr(sanitize_text_field($_REQUEST['CVV'])); }?>" class="<?php echo pmpro_get_element_class( 'input', 'CVV' ); ?>" data-encrypted-name="cvv" /> <small>(<a href="javascript:void(0);" onclick="javascript:window.open('<?php echo pmpro_https_filter(PMPRO_URL)?>/pages/popup-cvv.html','cvv','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=600, height=475');"><?php _e("what's this?", 'paid-memberships-pro' );?></a>)</small>
505
  </div>
506
  <?php } ?>
507
  <?php if($pmpro_show_discount_code) { ?>
508
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-discount-code', 'pmpro_payment-discount-code' ); ?>">
509
- <label for="discount_code"><?php _e('Discount Code', 'paid-memberships-pro' );?></label>
510
  <input class="<?php echo pmpro_get_element_class( 'input', 'discount_code' ); ?>" id="discount_code" name="discount_code" type="text" size="20" value="<?php echo esc_attr($discount_code)?>" />
511
- <input type="button" id="discount_code_button" name="discount_code_button" value="<?php _e('Apply', 'paid-memberships-pro' );?>" />
512
  <p id="discount_code_message" class="<?php echo pmpro_get_element_class( 'pmpro_message' ); ?>" style="display: none;"></p>
513
  </div>
514
  <?php } ?>
@@ -598,7 +605,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
598
  //tax
599
  $order->subtotal = $amount;
600
  $tax = $order->getTax(true);
601
- $amount = pmpro_round_price((float)$order->subtotal + (float)$tax);
602
 
603
  //create a customer
604
  $this->getCustomer($order);
@@ -611,10 +618,13 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
611
  //charge
612
  try
613
  {
614
- $response = Braintree_Transaction::sale(array(
615
- 'amount' => $amount,
616
- 'customerId' => $this->customer->id
617
- ));
 
 
 
618
  }
619
  catch (Exception $e)
620
  {
@@ -861,7 +871,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
861
  //figure out the amounts
862
  $amount = $order->PaymentAmount;
863
  $amount_tax = $order->getTaxForPrice($amount);
864
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
865
 
866
  /*
867
  There are two parts to the trial. Part 1 is simply the delay until the first payment
@@ -888,10 +898,10 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
888
 
889
  $start_ts = strtotime($order->ProfileStartDate, current_time("timestamp") );
890
  $now = strtotime( date('Y-m-d\T00:00:00', current_time('timestamp' ) ), current_time('timestamp' ) );
891
-
892
  //convert back to days
893
  $trial_period_days = ceil(abs( $now - $start_ts ) / 86400);
894
-
895
  //now add the actual trial set by the site
896
  if(!empty($order->TrialBillingCycles))
897
  {
@@ -909,7 +919,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
909
  //subscribe to the plan
910
  try
911
  {
912
-
913
  $details = array(
914
  'paymentMethodToken' => $this->customer->creditCards[0]->token,
915
  'planId' => $this->get_plan_id( $order->membership_id ),
@@ -970,7 +980,7 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
970
  return false; //couldn't find the customer
971
  }
972
  }
973
-
974
  /**
975
  * Cancel order and Braintree Subscription if applicable
976
  *
@@ -984,9 +994,9 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
984
  $order->error = __("Payment error: Please contact the webmaster (braintree-load-error)", 'paid-memberships-pro');
985
  return false;
986
  }
987
-
988
  if ( isset( $_POST['bt_payload']) && isset( $_POST['bt_payload']) ) {
989
-
990
  try {
991
  $webhookNotification = Braintree_WebhookNotification::parse( $_POST['bt_signature'], $_POST['bt_payload'] );
992
  if ( Braintree_WebhookNotification::SUBSCRIPTION_CANCELED === $webhookNotification->kind ) {
@@ -997,10 +1007,10 @@ use Braintree\WebhookNotification as Braintree_WebhookNotification;
997
  // Don't do anything
998
  }
999
  }
1000
-
1001
  // Always cancel, even if Braintree fails
1002
- $order->updateStatus("cancelled" );
1003
-
1004
  //require a subscription id
1005
  if(empty($order->subscription_transaction_id))
1006
  return false;
109
  function loadBraintreeLibrary()
110
  {
111
  //load Braintree library if it hasn't been loaded already (usually by another plugin using Braintree)
112
+ if ( ! class_exists( "\Braintree" ) ) {
113
  require_once( PMPRO_DIR . "/includes/lib/Braintree/lib/Braintree.php");
114
+ } else {
115
+ // Another plugin may have loaded the Braintree library already.
116
+ // Let's log the current Braintree Library info so that we know
117
+ // where to look if we need to troubleshoot library conflicts.
118
+ $previously_loaded_class = new \ReflectionClass( '\Braintree' );
119
+ pmpro_track_library_conflict( 'braintree', $previously_loaded_class->getFileName(), Braintree\Version::get() );
120
+ }
121
  }
122
 
123
  /**
128
  $cache_key = 'pmpro_braintree_plans_' . md5($this->gateway_environment . pmpro_getOption("braintree_merchantid") . pmpro_getOption("braintree_publickey") . pmpro_getOption("braintree_privatekey"));
129
 
130
  $plans = wp_cache_get( $cache_key,'pmpro_levels' );
131
+
132
  //check Braintree if no transient found
133
  if($plans === false) {
134
 
176
  * @param $level_id
177
  */
178
  public static function pmpro_save_level_action( $level_id ) {
179
+
180
  $BT_Gateway = new PMProGateway_braintree();
181
+
182
  if ( isset( $BT_Gateway->gateway_environment ) ) {
183
  $cache_key = 'pmpro_braintree_plans_' . md5($BT_Gateway->gateway_environment . pmpro_getOption("braintree_merchantid") . pmpro_getOption("braintree_publickey") . pmpro_getOption("braintree_privatekey"));
184
+
185
  wp_cache_delete( $cache_key,'pmpro_levels' );
186
  }
187
  }
188
+
189
  /**
190
  * Search for a plan by id
191
  */
317
  </tr>
318
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
319
  <th scope="row" valign="top">
320
+ <label for="braintree_merchantid"><?php esc_html_e('Merchant ID', 'paid-memberships-pro' );?>:</label>
321
  </th>
322
  <td>
323
  <input type="text" id="braintree_merchantid" name="braintree_merchantid" value="<?php echo esc_attr($values['braintree_merchantid'])?>" class="regular-text code" />
325
  </tr>
326
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
327
  <th scope="row" valign="top">
328
+ <label for="braintree_publickey"><?php esc_html_e('Public Key', 'paid-memberships-pro' );?>:</label>
329
  </th>
330
  <td>
331
  <input type="text" id="braintree_publickey" name="braintree_publickey" value="<?php echo esc_attr($values['braintree_publickey'])?>" class="regular-text code" />
333
  </tr>
334
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
335
  <th scope="row" valign="top">
336
+ <label for="braintree_privatekey"><?php esc_html_e('Private Key', 'paid-memberships-pro' );?>:</label>
337
  </th>
338
  <td>
339
  <input type="text" id="braintree_privatekey" name="braintree_privatekey" value="<?php echo esc_attr($values['braintree_privatekey'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
341
  </tr>
342
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
343
  <th scope="row" valign="top">
344
+ <label for="braintree_encryptionkey"><?php esc_html_e('Client-Side Encryption Key', 'paid-memberships-pro' );?>:</label>
345
  </th>
346
  <td>
347
  <textarea id="braintree_encryptionkey" name="braintree_encryptionkey" autocomplete="off" rows="3" cols="50" class="large-text code pmpro-admin-secure-key"><?php echo esc_textarea($values['braintree_encryptionkey'])?></textarea>
349
  </tr>
350
  <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
351
  <th scope="row" valign="top">
352
+ <label><?php esc_html_e('Web Hook URL', 'paid-memberships-pro' );?>:</label>
353
  </th>
354
  <td>
355
+ <p><?php esc_html_e('To fully integrate with Braintree, be sure to set your Web Hook URL to', 'paid-memberships-pro' );?></p>
356
  <p><code><?php
357
  //echo admin_url("admin-ajax.php") . "?action=braintree_webhook";
358
  echo add_query_arg( 'action', 'braintree_webhook', admin_url( 'admin-ajax.php' ) );
361
  </tr>
362
  <?php
363
  }
364
+
365
  /**
366
  * Code added to checkout preheader.
367
  *
458
  ?>
459
  <div id="pmpro_payment_information_fields" class="<?php echo pmpro_get_element_class( 'pmpro_checkout', 'pmpro_payment_information_fields' ); ?>" <?php if(!$pmpro_requirebilling || apply_filters("pmpro_hide_payment_information_fields", false) ) { ?>style="display: none;"<?php } ?>>
460
  <h3>
461
+ <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-name' ); ?>"><?php esc_html_e('Payment Information', 'paid-memberships-pro' );?></span>
462
  <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-msg' ); ?>"><?php printf(__('We Accept %s', 'paid-memberships-pro' ), $pmpro_accepted_credit_cards_string);?></span>
463
  </h3>
464
  <?php $sslseal = pmpro_getOption("sslseal"); ?>
470
  $pmpro_include_cardtype_field = apply_filters('pmpro_include_cardtype_field', true);
471
  if($pmpro_include_cardtype_field) { ?>
472
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-card-type', 'pmpro_payment-card-type' ); ?>">
473
+ <label for="CardType"><?php esc_html_e('Card Type', 'paid-memberships-pro' );?></label>
474
  <select id="CardType" name="CardType" class="<?php echo pmpro_get_element_class( 'CardType' ); ?>">
475
  <?php foreach($pmpro_accepted_credit_cards as $cc) { ?>
476
+ <option value="<?php echo esc_attr( $cc ); ?>" <?php if($CardType == $cc) { ?>selected="selected"<?php } ?>><?php echo esc_html( $cc ); ?></option>
477
  <?php } ?>
478
  </select>
479
  </div>
480
  <?php } ?>
481
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-account-number', 'pmpro_payment-account-number' ); ?>">
482
+ <label for="AccountNumber"><?php esc_html_e('Card Number', 'paid-memberships-pro' );?></label>
483
  <input id="AccountNumber" name="AccountNumber" class="<?php echo pmpro_get_element_class( 'input', 'AccountNumber' ); ?>" type="text" size="25" value="<?php echo esc_attr($AccountNumber)?>" data-encrypted-name="number" autocomplete="off" />
484
  </div>
485
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-expiration', 'pmpro_payment-expiration' ); ?>">
486
+ <label for="ExpirationMonth"><?php esc_html_e('Expiration Date', 'paid-memberships-pro' );?></label>
487
  <select id="ExpirationMonth" name="ExpirationMonth" class="<?php echo pmpro_get_element_class( 'ExpirationMonth' ); ?>">
488
  <option value="01" <?php if($ExpirationMonth == "01") { ?>selected="selected"<?php } ?>>01</option>
489
  <option value="02" <?php if($ExpirationMonth == "02") { ?>selected="selected"<?php } ?>>02</option>
499
  <option value="12" <?php if($ExpirationMonth == "12") { ?>selected="selected"<?php } ?>>12</option>
500
  </select>/<select id="ExpirationYear" name="ExpirationYear" class="<?php echo pmpro_get_element_class( 'ExpirationYear' ); ?>">
501
  <?php for($i = date_i18n("Y"); $i < date_i18n("Y") + 10; $i++) { ?>
502
+ <option value="<?php echo esc_attr( $i ); ?>" <?php if($ExpirationYear == $i) { ?>selected="selected"<?php } ?>><?php echo esc_html( $i ); ?></option>
503
  <?php } ?>
504
  </select>
505
  </div>
507
  $pmpro_show_cvv = apply_filters("pmpro_show_cvv", true);
508
  if($pmpro_show_cvv) { ?>
509
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-cvv', 'pmpro_payment-cvv' ); ?>">
510
+ <label for="CVV"><?php esc_html_e('CVV', 'paid-memberships-pro' );?></label>
511
+ <input id="CVV" name="cvv" type="text" size="4" value="<?php if(!empty($_REQUEST['CVV'])) { echo esc_attr(sanitize_text_field($_REQUEST['CVV'])); }?>" class="<?php echo pmpro_get_element_class( 'input', 'CVV' ); ?>" data-encrypted-name="cvv" /> <small>(<a href="javascript:void(0);" onclick="javascript:window.open('<?php echo pmpro_https_filter(PMPRO_URL)?>/pages/popup-cvv.html','cvv','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=600, height=475');"><?php esc_html_e("what's this?", 'paid-memberships-pro' );?></a>)</small>
512
  </div>
513
  <?php } ?>
514
  <?php if($pmpro_show_discount_code) { ?>
515
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-discount-code', 'pmpro_payment-discount-code' ); ?>">
516
+ <label for="discount_code"><?php esc_html_e('Discount Code', 'paid-memberships-pro' );?></label>
517
  <input class="<?php echo pmpro_get_element_class( 'input', 'discount_code' ); ?>" id="discount_code" name="discount_code" type="text" size="20" value="<?php echo esc_attr($discount_code)?>" />
518
+ <input type="button" id="discount_code_button" name="discount_code_button" value="<?php esc_attr_e('Apply', 'paid-memberships-pro' );?>" />
519
  <p id="discount_code_message" class="<?php echo pmpro_get_element_class( 'pmpro_message' ); ?>" style="display: none;"></p>
520
  </div>
521
  <?php } ?>
605
  //tax
606
  $order->subtotal = $amount;
607
  $tax = $order->getTax(true);
608
+ $amount = pmpro_round_price_as_string((float)$order->subtotal + (float)$tax);
609
 
610
  //create a customer
611
  $this->getCustomer($order);
618
  //charge
619
  try
620
  {
621
+ $braintree_sale_array = apply_filters( 'pmpro_braintree_transaction_sale_array', array(
622
+ 'amount' => $amount,
623
+ 'customerId' => $this->customer->id
624
+ )
625
+ );
626
+
627
+ $response = Braintree_Transaction::sale( $braintree_sale_array );
628
  }
629
  catch (Exception $e)
630
  {
871
  //figure out the amounts
872
  $amount = $order->PaymentAmount;
873
  $amount_tax = $order->getTaxForPrice($amount);
874
+ $amount = pmpro_round_price_as_string((float)$amount + (float)$amount_tax);
875
 
876
  /*
877
  There are two parts to the trial. Part 1 is simply the delay until the first payment
898
 
899
  $start_ts = strtotime($order->ProfileStartDate, current_time("timestamp") );
900
  $now = strtotime( date('Y-m-d\T00:00:00', current_time('timestamp' ) ), current_time('timestamp' ) );
901
+
902
  //convert back to days
903
  $trial_period_days = ceil(abs( $now - $start_ts ) / 86400);
904
+
905
  //now add the actual trial set by the site
906
  if(!empty($order->TrialBillingCycles))
907
  {
919
  //subscribe to the plan
920
  try
921
  {
922
+
923
  $details = array(
924
  'paymentMethodToken' => $this->customer->creditCards[0]->token,
925
  'planId' => $this->get_plan_id( $order->membership_id ),
980
  return false; //couldn't find the customer
981
  }
982
  }
983
+
984
  /**
985
  * Cancel order and Braintree Subscription if applicable
986
  *
994
  $order->error = __("Payment error: Please contact the webmaster (braintree-load-error)", 'paid-memberships-pro');
995
  return false;
996
  }
997
+
998
  if ( isset( $_POST['bt_payload']) && isset( $_POST['bt_payload']) ) {
999
+
1000
  try {
1001
  $webhookNotification = Braintree_WebhookNotification::parse( $_POST['bt_signature'], $_POST['bt_payload'] );
1002
  if ( Braintree_WebhookNotification::SUBSCRIPTION_CANCELED === $webhookNotification->kind ) {
1007
  // Don't do anything
1008
  }
1009
  }
1010
+
1011
  // Always cancel, even if Braintree fails
1012
+ $order->updateStatus("cancelled" );
1013
+
1014
  //require a subscription id
1015
  if(empty($order->subscription_transaction_id))
1016
  return false;
classes/gateways/class.pmprogateway_check.php CHANGED
@@ -99,16 +99,16 @@
99
  <tr class="pmpro_settings_divider gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
100
  <td colspan="2">
101
  <hr />
102
- <h3><?php _e('Pay by Check Settings', 'paid-memberships-pro' ); ?></h3>
103
  </td>
104
  </tr>
105
  <tr class="gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
106
  <th scope="row" valign="top">
107
- <label for="instructions"><?php _e('Instructions', 'paid-memberships-pro' );?></label>
108
  </th>
109
  <td>
110
  <textarea id="instructions" name="instructions" rows="3" cols="50" class="large-text"><?php echo wpautop( wp_unslash( $values['instructions'] ) ); ?></textarea>
111
- <p class="description"><?php _e('Who to write the check out to. Where to mail it. Shown on checkout, confirmation, and invoice pages.', 'paid-memberships-pro' );?></p>
112
  </td>
113
  </tr>
114
  <?php
99
  <tr class="pmpro_settings_divider gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
100
  <td colspan="2">
101
  <hr />
102
+ <h3><?php esc_html_e('Pay by Check Settings', 'paid-memberships-pro' ); ?></h3>
103
  </td>
104
  </tr>
105
  <tr class="gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
106
  <th scope="row" valign="top">
107
+ <label for="instructions"><?php esc_html_e('Instructions', 'paid-memberships-pro' );?></label>
108
  </th>
109
  <td>
110
  <textarea id="instructions" name="instructions" rows="3" cols="50" class="large-text"><?php echo wpautop( wp_unslash( $values['instructions'] ) ); ?></textarea>
111
+ <p class="description"><?php esc_html_e('Who to write the check out to. Where to mail it. Shown on checkout, confirmation, and invoice pages.', 'paid-memberships-pro' );?></p>
112
  </td>
113
  </tr>
114
  <?php
classes/gateways/class.pmprogateway_cybersource.php CHANGED
@@ -86,12 +86,12 @@
86
  </tr>
87
  <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
88
  <td colspan="2" style="padding: 0px;">
89
- <p class="pmpro_message"><?php _e('Note', 'paid-memberships-pro' );?>:</strong> <?php _e('This gateway option is in beta. Some functionality may not be available. Please contact Paid Memberships Pro with any issues you run into. <strong>Please be sure to upgrade Paid Memberships Pro to the latest versions when available.</strong>', 'paid-memberships-pro' );?></p>
90
  </td>
91
  </tr>
92
  <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
93
  <th scope="row" valign="top">
94
- <label for="cybersource_merchantid"><?php _e('Merchant ID', 'paid-memberships-pro' );?>:</label>
95
  </th>
96
  <td>
97
  <input type="text" id="cybersource_merchantid" name="cybersource_merchantid" value="<?php echo esc_attr($values['cybersource_merchantid'])?>" class="regular-text code" />
@@ -99,7 +99,7 @@
99
  </tr>
100
  <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
101
  <th scope="row" valign="top">
102
- <label for="cybersource_securitykey"><?php _e('Transaction Security Key', 'paid-memberships-pro' );?>:</label>
103
  </th>
104
  <td>
105
  <textarea id="cybersource_securitykey" name="cybersource_securitykey" autocomplete="off" rows="3" cols="50" class="large-text code pmpro-admin-secure-key"><?php echo esc_textarea($values['cybersource_securitykey']);?></textarea>
@@ -318,7 +318,7 @@
318
  $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
319
  return false;
320
  }
321
-
322
  //currency
323
  $purchaseTotals = new stdClass();
324
  $purchaseTotals->currency = $pmpro_currency;
@@ -343,7 +343,7 @@
343
  {
344
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
345
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
346
- return false;
347
  }
348
  catch(Exception $e)
349
  {
@@ -395,7 +395,7 @@
395
  {
396
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
397
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
398
- return false;
399
  }
400
  catch(Exception $e)
401
  {
@@ -433,7 +433,7 @@
433
  //tax
434
  $order->subtotal = $amount;
435
  $tax = $order->getTax(true);
436
- $amount = pmpro_round_price((float)$order->subtotal + (float)$tax);
437
  //combine address
438
  $address = $order->Address1;
439
  if(!empty($order->Address2))
@@ -505,7 +505,7 @@
505
  {
506
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
507
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
508
- return false;
509
  }
510
  catch(Exception $e)
511
  {
@@ -556,7 +556,7 @@
556
  //figure out the amounts
557
  $amount = $order->PaymentAmount;
558
  $amount_tax = $order->getTaxForPrice($amount);
559
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
560
  /*
561
  There are two parts to the trial. Part 1 is simply the delay until the first payment
562
  since we are doing the first payment as a separate transaction.
@@ -643,7 +643,7 @@
643
  $request->subscription = $subscription;
644
  //recurring info
645
  $recurringSubscriptionInfo = new stdClass();
646
- $recurringSubscriptionInfo->amount = number_format($amount, 2);
647
  $recurringSubscriptionInfo->startDate = $profile_start_date;
648
  $recurringSubscriptionInfo->frequency = $frequency;
649
  if(!empty($order->TotalBillingCycles))
@@ -695,7 +695,7 @@
695
  {
696
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
697
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
698
- return false;
699
  }
700
  catch(Exception $e)
701
  {
@@ -765,8 +765,8 @@
765
 
766
  if( empty($request->card->cardType) )
767
  {
768
- $order->error = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro", "paid-memberships-pro" );
769
- $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro", "paid-memberships-pro" );
770
  return false;
771
  }
772
 
@@ -779,7 +779,7 @@
779
  {
780
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
781
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
782
- return false;
783
  }
784
  catch(Exception $e)
785
  {
@@ -833,7 +833,7 @@
833
  {
834
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
835
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
836
- return false;
837
  }
838
  catch(Exception $e)
839
  {
@@ -920,7 +920,7 @@
920
  $error = $error_messages[$reply->reasonCode];
921
  else
922
  return __( "Unknown error.", "paid-memberships-pro" );
923
-
924
  // list invalid fields from reply
925
  if( isset($reply->invalidField) && !empty($reply->invalidField) )
926
  {
86
  </tr>
87
  <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
88
  <td colspan="2" style="padding: 0px;">
89
+ <p class="pmpro_message"><?php esc_html_e('Note', 'paid-memberships-pro' );?>:</strong> <?php _e('This gateway option is in beta. Some functionality may not be available. Please contact Paid Memberships Pro with any issues you run into. <strong>Please be sure to upgrade Paid Memberships Pro to the latest versions when available.</strong>', 'paid-memberships-pro' );?></p>
90
  </td>
91
  </tr>
92
  <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
93
  <th scope="row" valign="top">
94
+ <label for="cybersource_merchantid"><?php esc_html_e('Merchant ID', 'paid-memberships-pro' );?>:</label>
95
  </th>
96
  <td>
97
  <input type="text" id="cybersource_merchantid" name="cybersource_merchantid" value="<?php echo esc_attr($values['cybersource_merchantid'])?>" class="regular-text code" />
99
  </tr>
100
  <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
101
  <th scope="row" valign="top">
102
+ <label for="cybersource_securitykey"><?php esc_html_e('Transaction Security Key', 'paid-memberships-pro' );?>:</label>
103
  </th>
104
  <td>
105
  <textarea id="cybersource_securitykey" name="cybersource_securitykey" autocomplete="off" rows="3" cols="50" class="large-text code pmpro-admin-secure-key"><?php echo esc_textarea($values['cybersource_securitykey']);?></textarea>
318
  $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
319
  return false;
320
  }
321
+
322
  //currency
323
  $purchaseTotals = new stdClass();
324
  $purchaseTotals->currency = $pmpro_currency;
343
  {
344
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
345
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
346
+ return false;
347
  }
348
  catch(Exception $e)
349
  {
395
  {
396
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
397
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
398
+ return false;
399
  }
400
  catch(Exception $e)
401
  {
433
  //tax
434
  $order->subtotal = $amount;
435
  $tax = $order->getTax(true);
436
+ $amount = pmpro_round_price_as_string((float)$order->subtotal + (float)$tax);
437
  //combine address
438
  $address = $order->Address1;
439
  if(!empty($order->Address2))
505
  {
506
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
507
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
508
+ return false;
509
  }
510
  catch(Exception $e)
511
  {
556
  //figure out the amounts
557
  $amount = $order->PaymentAmount;
558
  $amount_tax = $order->getTaxForPrice($amount);
559
+ $amount = pmpro_round_price_as_string((float)$amount + (float)$amount_tax);
560
  /*
561
  There are two parts to the trial. Part 1 is simply the delay until the first payment
562
  since we are doing the first payment as a separate transaction.
643
  $request->subscription = $subscription;
644
  //recurring info
645
  $recurringSubscriptionInfo = new stdClass();
646
+ $recurringSubscriptionInfo->amount = $amount;
647
  $recurringSubscriptionInfo->startDate = $profile_start_date;
648
  $recurringSubscriptionInfo->frequency = $frequency;
649
  if(!empty($order->TotalBillingCycles))
695
  {
696
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
697
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
698
+ return false;
699
  }
700
  catch(Exception $e)
701
  {
765
 
766
  if( empty($request->card->cardType) )
767
  {
768
+ $order->error = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
769
+ $order->shorterror = __( "Error validating credit card type. Make sure your credit card number is correct and try again.", "paid-memberships-pro" );
770
  return false;
771
  }
772
 
779
  {
780
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
781
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
782
+ return false;
783
  }
784
  catch(Exception $e)
785
  {
833
  {
834
  $order->error = sprintf( __( 'Error communicating with Cybersource: %', 'paid-memberships-pro' ), $t->getMessage() );
835
  $order->shorterror = __( 'Error communicating with Cybersource.', 'paid-memberships-pro' );
836
+ return false;
837
  }
838
  catch(Exception $e)
839
  {
920
  $error = $error_messages[$reply->reasonCode];
921
  else
922
  return __( "Unknown error.", "paid-memberships-pro" );
923
+
924
  // list invalid fields from reply
925
  if( isset($reply->invalidField) && !empty($reply->invalidField) )
926
  {
classes/gateways/class.pmprogateway_payflowpro.php CHANGED
@@ -98,7 +98,7 @@
98
  </tr>
99
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
100
  <th scope="row" valign="top">
101
- <label for="payflow_partner"><?php _e('Partner', 'paid-memberships-pro' );?>:</label>
102
  </th>
103
  <td>
104
  <input type="text" id="payflow_partner" name="payflow_partner" value="<?php echo esc_attr($values['payflow_partner'])?>" class="regular-text code" />
@@ -106,7 +106,7 @@
106
  </tr>
107
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
108
  <th scope="row" valign="top">
109
- <label for="payflow_vendor"><?php _e('Vendor', 'paid-memberships-pro' );?>:</label>
110
  </th>
111
  <td>
112
  <input type="text" id="payflow_vendor" name="payflow_vendor" value="<?php echo esc_attr($values['payflow_vendor'])?>" class="regular-text code" />
@@ -114,7 +114,7 @@
114
  </tr>
115
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
116
  <th scope="row" valign="top">
117
- <label for="payflow_user"><?php _e('User', 'paid-memberships-pro' );?>:</label>
118
  </th>
119
  <td>
120
  <input type="text" id="payflow_user" name="payflow_user" value="<?php echo esc_attr($values['payflow_user'])?>" class="regular-text code" />
@@ -122,7 +122,7 @@
122
  </tr>
123
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
124
  <th scope="row" valign="top">
125
- <label for="payflow_pwd"><?php _e('Password', 'paid-memberships-pro' );?>:</label>
126
  </th>
127
  <td>
128
  <input type="password" id="payflow_pwd" name="payflow_pwd" value="<?php echo esc_attr($values['payflow_pwd'])?>" class="regular-text code" />
@@ -130,7 +130,7 @@
130
  </tr>
131
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
132
  <th scope="row" valign="top">
133
- <label><?php _e('IPN Handler', 'paid-memberships-pro' );?>:</label>
134
  </th>
135
  <td>
136
  <p class="description">
@@ -316,7 +316,7 @@
316
  $amount = $order->InitialPayment;
317
  $amount_tax = $order->getTaxForPrice($amount);
318
  $order->subtotal = $amount;
319
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
320
 
321
  //paypal profile stuff
322
  $nvpStr = "";
@@ -392,7 +392,7 @@
392
  //taxes on the amount
393
  $amount = $order->PaymentAmount;
394
  $amount_tax = $order->getTaxForPrice($amount);
395
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
396
 
397
  if($order->BillingPeriod == "Day")
398
  $payperiod = "DAYS";
98
  </tr>
99
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
100
  <th scope="row" valign="top">
101
+ <label for="payflow_partner"><?php esc_html_e('Partner', 'paid-memberships-pro' );?>:</label>
102
  </th>
103
  <td>
104
  <input type="text" id="payflow_partner" name="payflow_partner" value="<?php echo esc_attr($values['payflow_partner'])?>" class="regular-text code" />
106
  </tr>
107
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
108
  <th scope="row" valign="top">
109
+ <label for="payflow_vendor"><?php esc_html_e('Vendor', 'paid-memberships-pro' );?>:</label>
110
  </th>
111
  <td>
112
  <input type="text" id="payflow_vendor" name="payflow_vendor" value="<?php echo esc_attr($values['payflow_vendor'])?>" class="regular-text code" />
114
  </tr>
115
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
116
  <th scope="row" valign="top">
117
+ <label for="payflow_user"><?php esc_html_e('User', 'paid-memberships-pro' );?>:</label>
118
  </th>
119
  <td>
120
  <input type="text" id="payflow_user" name="payflow_user" value="<?php echo esc_attr($values['payflow_user'])?>" class="regular-text code" />
122
  </tr>
123
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
124
  <th scope="row" valign="top">
125
+ <label for="payflow_pwd"><?php esc_html_e('Password', 'paid-memberships-pro' );?>:</label>
126
  </th>
127
  <td>
128
  <input type="password" id="payflow_pwd" name="payflow_pwd" value="<?php echo esc_attr($values['payflow_pwd'])?>" class="regular-text code" />
130
  </tr>
131
  <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
132
  <th scope="row" valign="top">
133
+ <label><?php esc_html_e('IPN Handler', 'paid-memberships-pro' );?>:</label>
134
  </th>
135
  <td>
136
  <p class="description">
316
  $amount = $order->InitialPayment;
317
  $amount_tax = $order->getTaxForPrice($amount);
318
  $order->subtotal = $amount;
319
+ $amount = pmpro_round_price_as_string((float)$amount + (float)$amount_tax);
320
 
321
  //paypal profile stuff
322
  $nvpStr = "";
392
  //taxes on the amount
393
  $amount = $order->PaymentAmount;
394
  $amount_tax = $order->getTaxForPrice($amount);
395
+ $amount = pmpro_round_price_as_string((float)$amount + (float)$amount_tax);
396
 
397
  if($order->BillingPeriod == "Day")
398
  $payperiod = "DAYS";
classes/gateways/class.pmprogateway_paypal.php CHANGED
@@ -129,7 +129,7 @@
129
  <tr class="pmpro_settings_divider gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
130
  <td colspan="2">
131
  <hr />
132
- <h2 class="title"><?php _e('PayPal Settings', 'paid-memberships-pro' ); ?></h2>
133
  </td>
134
  </tr>
135
  <tr class="gateway gateway_paypalstandard" <?php if($gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
@@ -150,7 +150,7 @@
150
  </tr>
151
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
152
  <th scope="row" valign="top">
153
- <label for="gateway_email"><?php _e('Gateway Account Email', 'paid-memberships-pro' );?>:</label>
154
  </th>
155
  <td>
156
  <input type="text" id="gateway_email" name="gateway_email" value="<?php echo esc_attr($values['gateway_email'])?>" class="regular-text code" />
@@ -158,7 +158,7 @@
158
  </tr>
159
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
160
  <th scope="row" valign="top">
161
- <label for="apiusername"><?php _e('API Username', 'paid-memberships-pro' );?>:</label>
162
  </th>
163
  <td>
164
  <input type="text" id="apiusername" name="apiusername" value="<?php echo esc_attr($values['apiusername'])?>" class="regular-text code" />
@@ -166,7 +166,7 @@
166
  </tr>
167
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
168
  <th scope="row" valign="top">
169
- <label for="apipassword"><?php _e('API Password', 'paid-memberships-pro' );?>:</label>
170
  </th>
171
  <td>
172
  <input type="text" id="apipassword" name="apipassword" value="<?php echo esc_attr($values['apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
@@ -174,7 +174,7 @@
174
  </tr>
175
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
176
  <th scope="row" valign="top">
177
- <label for="apisignature"><?php _e('API Signature', 'paid-memberships-pro' );?>:</label>
178
  </th>
179
  <td>
180
  <input type="text" id="apisignature" name="apisignature" value="<?php echo esc_attr($values['apisignature'])?>" class="regular-text code" />
@@ -182,21 +182,21 @@
182
  </tr>
183
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
184
  <th scope="row" valign="top">
185
- <label for="paypalexpress_skip_confirmation"><?php _e('Confirmation Step', 'paid-memberships-pro' );?>:</label>
186
  </th>
187
  <td>
188
  <select id="paypalexpress_skip_confirmation" name="paypalexpress_skip_confirmation">
189
- <option value="0" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 0);?>>Require an extra confirmation after users return from PayPal Express.</option>
190
- <option value="1" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 1);?>>Skip the extra confirmation after users return from PayPal Express.</option>
191
  </select>
192
  </td>
193
  </tr>
194
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
195
  <th scope="row" valign="top">
196
- <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
197
  </th>
198
  <td>
199
- <p class="description"><?php _e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'paid-memberships-pro' );?></p>
200
  <p><code><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></code></p>
201
  </td>
202
  </tr>
@@ -278,7 +278,7 @@
278
  <?php if($gateway == "paypal" || $gateway == "paypalexpress" || $gateway == "paypalstandard") { ?>
279
  <span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
280
  <input type="hidden" name="submit-checkout" value="1" />
281
- <input type="image" id="pmpro_btn-submit-paypal" class="<?php echo pmpro_get_element_class( 'pmpro_btn-submit-checkout' ); ?>" value="<?php _e('Check Out with PayPal', 'paid-memberships-pro' );?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypalobjects.com/webstatic/en_US/i/buttons/checkout-logo-medium.png");?>" />
282
  </span>
283
  <?php } ?>
284
 
@@ -472,9 +472,11 @@
472
 
473
  //taxes on the amount
474
  $amount = $order->InitialPayment;
475
- $amount_tax = $order->getTaxForPrice($amount);
476
  $order->subtotal = $amount;
477
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
 
 
478
 
479
  //paypal profile stuff
480
  $nvpStr = "";
@@ -542,15 +544,17 @@
542
 
543
  //taxes on the amount
544
  $amount = $order->PaymentAmount;
545
- $amount_tax = $order->getTaxForPrice($amount);
546
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
 
 
547
 
548
  //paypal profile stuff
549
  $nvpStr = "";
550
 
551
  if(!empty($order->Token))
552
  $nvpStr .= "&TOKEN=" . $order->Token;
553
- $nvpStr .="&AMT=" . $order->PaymentAmount . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
554
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
555
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
556
  $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
@@ -565,7 +569,13 @@
565
  {
566
  $trial_amount = $order->TrialAmount;
567
  $trial_tax = $order->getTaxForPrice($trial_amount);
568
- $trial_amount = pmpro_round_price((float)$trial_amount + (float)$trial_tax);
 
 
 
 
 
 
569
 
570
  $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
571
  }
@@ -603,12 +613,12 @@
603
 
604
  // Set MAXFAILEDPAYMENTS so subscriptions are cancelled after 1 failed payment.
605
  $nvpStr .= "&MAXFAILEDPAYMENTS=1";
606
-
607
  $nvpStr = apply_filters("pmpro_create_recurring_payments_profile_nvpstr", $nvpStr, $order);
608
 
609
  //for debugging let's add this to the class object
610
  $this->nvpStr = $nvpStr;
611
-
612
  ///echo str_replace("&", "&<br />", $nvpStr);
613
  ///exit;
614
 
@@ -680,7 +690,7 @@
680
  return false;
681
  //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
682
  }
683
- }
684
 
685
  function cancel(&$order) {
686
  // Always cancel the order locally even if PayPal might fail
@@ -747,7 +757,7 @@
747
  return false;
748
  }
749
  }
750
-
751
  function getTransactionStatus(&$order) {
752
  $transaction_details = $order->Gateway->getTransactionDetailsByOrder( $order );
753
  if( false === $transaction_details ){
@@ -822,7 +832,7 @@
822
  return $this->getTransactionDetails( $order->payment_transaction_id );
823
  }
824
  }
825
-
826
  function getTransactionDetails($payment_transaction_id)
827
  {
828
  $nvpStr = "";
@@ -889,6 +899,16 @@
889
  }
890
  }
891
 
 
 
 
 
 
 
 
 
 
 
892
  return $httpParsedResponseAr;
893
  }
894
  }
129
  <tr class="pmpro_settings_divider gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
130
  <td colspan="2">
131
  <hr />
132
+ <h2 class="title"><?php esc_html_e('PayPal Settings', 'paid-memberships-pro' ); ?></h2>
133
  </td>
134
  </tr>
135
  <tr class="gateway gateway_paypalstandard" <?php if($gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
150
  </tr>
151
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
152
  <th scope="row" valign="top">
153
+ <label for="gateway_email"><?php esc_html_e('Gateway Account Email', 'paid-memberships-pro' );?>:</label>
154
  </th>
155
  <td>
156
  <input type="text" id="gateway_email" name="gateway_email" value="<?php echo esc_attr($values['gateway_email'])?>" class="regular-text code" />
158
  </tr>
159
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
160
  <th scope="row" valign="top">
161
+ <label for="apiusername"><?php esc_html_e('API Username', 'paid-memberships-pro' );?>:</label>
162
  </th>
163
  <td>
164
  <input type="text" id="apiusername" name="apiusername" value="<?php echo esc_attr($values['apiusername'])?>" class="regular-text code" />
166
  </tr>
167
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
168
  <th scope="row" valign="top">
169
+ <label for="apipassword"><?php esc_html_e('API Password', 'paid-memberships-pro' );?>:</label>
170
  </th>
171
  <td>
172
  <input type="text" id="apipassword" name="apipassword" value="<?php echo esc_attr($values['apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
174
  </tr>
175
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
176
  <th scope="row" valign="top">
177
+ <label for="apisignature"><?php esc_html_e('API Signature', 'paid-memberships-pro' );?>:</label>
178
  </th>
179
  <td>
180
  <input type="text" id="apisignature" name="apisignature" value="<?php echo esc_attr($values['apisignature'])?>" class="regular-text code" />
182
  </tr>
183
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
184
  <th scope="row" valign="top">
185
+ <label for="paypalexpress_skip_confirmation"><?php esc_html_e('Confirmation Step', 'paid-memberships-pro' );?>:</label>
186
  </th>
187
  <td>
188
  <select id="paypalexpress_skip_confirmation" name="paypalexpress_skip_confirmation">
189
+ <option value="0" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 0);?>><?php esc_html_e( 'Require an extra confirmation after users return from PayPal.', 'paid-memberships-pro' ) ?></option>
190
+ <option value="1" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 1);?>><?php esc_html_e( 'Skip the extra confirmation after users return from PayPal.', 'paid-memberships-pro' ) ?></option>
191
  </select>
192
  </td>
193
  </tr>
194
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
195
  <th scope="row" valign="top">
196
+ <label><?php esc_html_e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
197
  </th>
198
  <td>
199
+ <p class="description"><?php esc_html_e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'paid-memberships-pro' );?></p>
200
  <p><code><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></code></p>
201
  </td>
202
  </tr>
278
  <?php if($gateway == "paypal" || $gateway == "paypalexpress" || $gateway == "paypalstandard") { ?>
279
  <span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
280
  <input type="hidden" name="submit-checkout" value="1" />
281
+ <input type="image" id="pmpro_btn-submit-paypal" class="<?php echo pmpro_get_element_class( 'pmpro_btn-submit-checkout' ); ?>" value="<?php esc_attr_e('Check Out with PayPal', 'paid-memberships-pro' );?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypalobjects.com/webstatic/en_US/i/buttons/checkout-logo-medium.png");?>" />
282
  </span>
283
  <?php } ?>
284
 
472
 
473
  //taxes on the amount
474
  $amount = $order->InitialPayment;
475
+ $amount_tax = pmpro_round_price_as_string( $order->getTaxForPrice( $amount ) );
476
  $order->subtotal = $amount;
477
+
478
+ // Note: For the DoDirectPayment API call, it expects the AMT to be the total including taxes (unlike CreateRecurringPaymentsProfile).
479
+ $amount = pmpro_round_price_as_string( (float) $amount + (float) $amount_tax );
480
 
481
  //paypal profile stuff
482
  $nvpStr = "";
544
 
545
  //taxes on the amount
546
  $amount = $order->PaymentAmount;
547
+ $amount_tax = pmpro_round_price_as_string( $order->getTaxForPrice( $amount ) );
548
+
549
+ // Note: For the CreateRecurringPaymentsProfile API call, it expects the AMT to be the total excluding taxes.
550
+ $amount = pmpro_round_price_as_string( $amount );
551
 
552
  //paypal profile stuff
553
  $nvpStr = "";
554
 
555
  if(!empty($order->Token))
556
  $nvpStr .= "&TOKEN=" . $order->Token;
557
+ $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
558
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
559
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
560
  $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
569
  {
570
  $trial_amount = $order->TrialAmount;
571
  $trial_tax = $order->getTaxForPrice($trial_amount);
572
+
573
+ /*
574
+ * Note: For the CreateRecurringPaymentsProfile API call, it expects the TRIALAMT to be the total excluding taxes.
575
+ *
576
+ * However, there is no TRIALTAXAMT for trial periods so this is a workaround.
577
+ */
578
+ $trial_amount = pmpro_round_price_as_string( (float) $trial_amount + (float) $trial_tax );
579
 
580
  $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
581
  }
613
 
614
  // Set MAXFAILEDPAYMENTS so subscriptions are cancelled after 1 failed payment.
615
  $nvpStr .= "&MAXFAILEDPAYMENTS=1";
616
+
617
  $nvpStr = apply_filters("pmpro_create_recurring_payments_profile_nvpstr", $nvpStr, $order);
618
 
619
  //for debugging let's add this to the class object
620
  $this->nvpStr = $nvpStr;
621
+
622
  ///echo str_replace("&", "&<br />", $nvpStr);
623
  ///exit;
624
 
690
  return false;
691
  //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
692
  }
693
+ }
694
 
695
  function cancel(&$order) {
696
  // Always cancel the order locally even if PayPal might fail
757
  return false;
758
  }
759
  }
760
+
761
  function getTransactionStatus(&$order) {
762
  $transaction_details = $order->Gateway->getTransactionDetailsByOrder( $order );
763
  if( false === $transaction_details ){
832
  return $this->getTransactionDetails( $order->payment_transaction_id );
833
  }
834
  }
835
+
836
  function getTransactionDetails($payment_transaction_id)
837
  {
838
  $nvpStr = "";
899
  }
900
  }
901
 
902
+ /**
903
+ * Allow performing actions using the http post request's response.
904
+ *
905
+ * @since 2.8
906
+ *
907
+ * @param array $httpParsedResponseAr The parsed response.
908
+ * @param string $methodName_ The NVP API name.
909
+ */
910
+ do_action( 'pmpro_paypal_handle_http_post_response', $httpParsedResponseAr, $methodName_ );
911
+
912
  return $httpParsedResponseAr;
913
  }
914
  }
classes/gateways/class.pmprogateway_paypalexpress.php CHANGED
@@ -71,6 +71,7 @@
71
  add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button'));
72
  add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3);
73
  }
 
74
  }
75
 
76
  /**
@@ -169,7 +170,7 @@
169
  </tr>
170
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
171
  <th scope="row" valign="top">
172
- <label for="gateway_email"><?php _e('Gateway Account Email', 'paid-memberships-pro' );?>:</label>
173
  </th>
174
  <td>
175
  <input type="text" id="gateway_email" name="gateway_email" value="<?php echo esc_attr($values['gateway_email'])?>" class="regular-text code" />
@@ -177,7 +178,7 @@
177
  </tr>
178
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
179
  <th scope="row" valign="top">
180
- <label for="apiusername"><?php _e('API Username', 'paid-memberships-pro' );?>:</label>
181
  </th>
182
  <td>
183
  <input type="text" id="apiusername" name="apiusername" value="<?php echo esc_attr($values['apiusername'])?>" class="regular-text code" />
@@ -185,7 +186,7 @@
185
  </tr>
186
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
187
  <th scope="row" valign="top">
188
- <label for="apipassword"><?php _e('API Password', 'paid-memberships-pro' );?>:</label>
189
  </th>
190
  <td>
191
  <input type="text" id="apipassword" name="apipassword" value="<?php echo esc_attr($values['apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
@@ -193,7 +194,7 @@
193
  </tr>
194
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
195
  <th scope="row" valign="top">
196
- <label for="apisignature"><?php _e('API Signature', 'paid-memberships-pro' );?>:</label>
197
  </th>
198
  <td>
199
  <input type="text" id="apisignature" name="apisignature" value="<?php echo esc_attr($values['apisignature'])?>" class="regular-text code" />
@@ -201,22 +202,22 @@
201
  </tr>
202
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
203
  <th scope="row" valign="top">
204
- <label for="paypalexpress_skip_confirmation"><?php _e('Confirmation Step', 'paid-memberships-pro' );?>:</label>
205
  </th>
206
  <td>
207
  <select id="paypalexpress_skip_confirmation" name="paypalexpress_skip_confirmation">
208
- <option value="0" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 0);?>>Require an extra confirmation after users return from PayPal Express.</option>
209
- <option value="1" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 1);?>>Skip the extra confirmation after users return from PayPal Express.</option>
210
  </select>
211
  </td>
212
  </tr>
213
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
214
  <th scope="row" valign="top">
215
- <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
216
  </th>
217
  <td>
218
- <p class="description"><?php _e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'paid-memberships-pro' );?></p>
219
- <p><code><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></code></p>
220
  </td>
221
  </tr>
222
  <?php
@@ -332,7 +333,7 @@
332
 
333
  $morder = new MemberOrder();
334
  $morder->getMemberOrderByPayPalToken(sanitize_text_field($_REQUEST['token']));
335
-
336
  if( $morder->status === 'token' ){
337
  $morder->Token = $morder->paypal_token; $pmpro_paypal_token = $morder->paypal_token;
338
  if($morder->Token)
@@ -499,7 +500,7 @@
499
  ?>
500
  <span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
501
  <input type="hidden" name="submit-checkout" value="1" />
502
- <input type="image" id="pmpro_btn-submit-paypalexpress" class="<?php echo pmpro_get_element_class( 'pmpro_btn-submit-checkout' ); ?>" value="<?php _e('Check Out with PayPal', 'paid-memberships-pro' );?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypalobjects.com/webstatic/en_US/i/buttons/checkout-logo-medium.png");?>" />
503
  </span>
504
 
505
  <span id="pmpro_submit_span" <?php if(($gateway == "paypalexpress" || $gateway == "paypalstandard") && $pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
@@ -528,12 +529,9 @@
528
  //taxes on initial amount
529
  $initial_payment = $order->InitialPayment;
530
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
531
- $initial_payment = pmpro_round_price((float)$initial_payment + (float)$initial_payment_tax);
532
 
533
- //taxes on the amount
534
- $amount = $order->PaymentAmount;
535
- $amount_tax = $order->getTaxForPrice($amount);
536
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
537
 
538
  //paypal profile stuff
539
  $nvpStr = "";
@@ -555,7 +553,9 @@
555
  {
556
  $trial_amount = $order->TrialAmount;
557
  $trial_tax = $order->getTaxForPrice($trial_amount);
558
- $trial_amount = pmpro_round_price((float)$trial_amount + (float)$trial_tax);
 
 
559
 
560
  $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
561
  }
@@ -672,7 +672,9 @@
672
  $amount = $order->InitialPayment;
673
  $amount_tax = $order->getTaxForPrice($amount);
674
  $order->subtotal = $amount;
675
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
 
 
676
 
677
  //paypal profile stuff
678
  $nvpStr = "";
@@ -727,12 +729,16 @@
727
  //taxes on initial amount
728
  $initial_payment = $order->InitialPayment;
729
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
730
- $initial_payment = pmpro_round_price((float)$initial_payment + (float)$initial_payment_tax);
 
 
731
 
732
  //taxes on the amount
733
  $amount = $order->PaymentAmount;
734
- $amount_tax = $order->getTaxForPrice($amount);
735
- //$amount = pmpro_round_price((float)$amount + (float)$amount_tax);
 
 
736
 
737
  //paypal profile stuff
738
  $nvpStr = "";
@@ -740,7 +746,7 @@
740
  $nvpStr .= "&TOKEN=" . $order->Token;
741
  $nvpStr .="&INITAMT=" . $initial_payment . "&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
742
  if(!empty($amount_tax))
743
- $nvpStr .= "&TAXAMT=" . $amount_tax;
744
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
745
  $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
746
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
@@ -754,7 +760,13 @@
754
  {
755
  $trial_amount = $order->TrialAmount;
756
  $trial_tax = $order->getTaxForPrice($trial_amount);
757
- $trial_amount = pmpro_round_price((float)$trial_amount + (float)$trial_tax);
 
 
 
 
 
 
758
 
759
  $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
760
  }
@@ -884,7 +896,7 @@
884
  return false;
885
  }
886
  }
887
-
888
  function getTransactionStatus(&$order) {
889
  $transaction_details = $order->Gateway->getTransactionDetailsByOrder( $order );
890
  if( false === $transaction_details ){
@@ -915,7 +927,7 @@
915
  return $this->getTransactionDetails( $order->payment_transaction_id );
916
  }
917
  }
918
-
919
  /**
920
  * Try to recover the real payment_transaction_id when payment_transaction_id === subscription_transaction_id === I-xxxxxxxx.
921
  *
@@ -972,10 +984,10 @@
972
 
973
  // found the payment transaction id, it's the last one (the oldest)
974
  $payment_transaction_id = end( $transaction_ids );
975
-
976
  return $payment_transaction_id;
977
  }
978
-
979
  function getTransactionDetails($payment_transaction_id)
980
  {
981
  $nvpStr = "";
@@ -1066,10 +1078,78 @@
1066
  die( "Unable to complete $methodName_ request with $nvpStr_: " . $httpParsedResponseAr->get_error_message() );
1067
  }
1068
 
 
 
 
 
 
 
 
 
 
 
1069
  return $httpParsedResponseAr;
1070
  }
1071
-
1072
- /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1073
  * PAYPAL Function
1074
  * Send HTTP POST Request with uuid
1075
  *
@@ -1110,7 +1190,7 @@
1110
  if ( is_wp_error( $response ) ) {
1111
  return $response;
1112
  }
1113
-
1114
  //extract the response details
1115
  $httpParsedResponseAr = array();
1116
  parse_str(wp_remote_retrieve_body($response), $httpParsedResponseAr);
71
  add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button'));
72
  add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3);
73
  }
74
+ add_filter( 'pmpro_process_refund_paypalexpress', array('PMProGateway_paypalexpress', 'process_refund' ), 10, 2 );
75
  }
76
 
77
  /**
170
  </tr>
171
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
172
  <th scope="row" valign="top">
173
+ <label for="gateway_email"><?php esc_html_e('Gateway Account Email', 'paid-memberships-pro' );?>:</label>
174
  </th>
175
  <td>
176
  <input type="text" id="gateway_email" name="gateway_email" value="<?php echo esc_attr($values['gateway_email'])?>" class="regular-text code" />
178
  </tr>
179
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
180
  <th scope="row" valign="top">
181
+ <label for="apiusername"><?php esc_html_e('API Username', 'paid-memberships-pro' );?>:</label>
182
  </th>
183
  <td>
184
  <input type="text" id="apiusername" name="apiusername" value="<?php echo esc_attr($values['apiusername'])?>" class="regular-text code" />
186
  </tr>
187
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
188
  <th scope="row" valign="top">
189
+ <label for="apipassword"><?php esc_html_e('API Password', 'paid-memberships-pro' );?>:</label>
190
  </th>
191
  <td>
192
  <input type="text" id="apipassword" name="apipassword" value="<?php echo esc_attr($values['apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
194
  </tr>
195
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
196
  <th scope="row" valign="top">
197
+ <label for="apisignature"><?php esc_html_e('API Signature', 'paid-memberships-pro' );?>:</label>
198
  </th>
199
  <td>
200
  <input type="text" id="apisignature" name="apisignature" value="<?php echo esc_attr($values['apisignature'])?>" class="regular-text code" />
202
  </tr>
203
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
204
  <th scope="row" valign="top">
205
+ <label for="paypalexpress_skip_confirmation"><?php esc_html_e('Confirmation Step', 'paid-memberships-pro' );?>:</label>
206
  </th>
207
  <td>
208
  <select id="paypalexpress_skip_confirmation" name="paypalexpress_skip_confirmation">
209
+ <option value="0" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 0);?>><?php esc_html_e( 'Require an extra confirmation after users return from PayPal.', 'paid-memberships-pro' ) ?></option>
210
+ <option value="1" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 1);?>><?php esc_html_e( 'Skip the extra confirmation after users return from PayPal.', 'paid-memberships-pro' ) ?></option>
211
  </select>
212
  </td>
213
  </tr>
214
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
215
  <th scope="row" valign="top">
216
+ <label><?php esc_html_e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
217
  </th>
218
  <td>
219
+ <p class="description"><?php esc_html_e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'paid-memberships-pro' );?></p>
220
+ <p><code><?php echo esc_html( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );?></code></p>
221
  </td>
222
  </tr>
223
  <?php
333
 
334
  $morder = new MemberOrder();
335
  $morder->getMemberOrderByPayPalToken(sanitize_text_field($_REQUEST['token']));
336
+
337
  if( $morder->status === 'token' ){
338
  $morder->Token = $morder->paypal_token; $pmpro_paypal_token = $morder->paypal_token;
339
  if($morder->Token)
500
  ?>
501
  <span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
502
  <input type="hidden" name="submit-checkout" value="1" />
503
+ <input type="image" id="pmpro_btn-submit-paypalexpress" class="<?php echo pmpro_get_element_class( 'pmpro_btn-submit-checkout' ); ?>" value="<?php esc_attr_e('Check Out with PayPal', 'paid-memberships-pro' );?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypalobjects.com/webstatic/en_US/i/buttons/checkout-logo-medium.png");?>" />
504
  </span>
505
 
506
  <span id="pmpro_submit_span" <?php if(($gateway == "paypalexpress" || $gateway == "paypalstandard") && $pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
529
  //taxes on initial amount
530
  $initial_payment = $order->InitialPayment;
531
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
 
532
 
533
+ // Note: SetExpressCheckout expects this amount to be the total including tax.
534
+ $initial_payment = pmpro_round_price_as_string( (float) $initial_payment + (float) $initial_payment_tax );
 
 
535
 
536
  //paypal profile stuff
537
  $nvpStr = "";
553
  {
554
  $trial_amount = $order->TrialAmount;
555
  $trial_tax = $order->getTaxForPrice($trial_amount);
556
+
557
+ // Note: SetExpressCheckout expects this amount to be the total including tax.
558
+ $trial_amount = pmpro_round_price_as_string( (float) $trial_amount + (float) $trial_tax );
559
 
560
  $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
561
  }
672
  $amount = $order->InitialPayment;
673
  $amount_tax = $order->getTaxForPrice($amount);
674
  $order->subtotal = $amount;
675
+
676
+ // Note: DoExpressCheckoutPayment expects this amount to be the total including tax.
677
+ $amount = pmpro_round_price_as_string( (float) $amount + (float) $amount_tax );
678
 
679
  //paypal profile stuff
680
  $nvpStr = "";
729
  //taxes on initial amount
730
  $initial_payment = $order->InitialPayment;
731
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
732
+
733
+ // Note: CreateRecurringPaymentsProfile expects this amount to be the total including tax.
734
+ $initial_payment = pmpro_round_price_as_string( (float) $initial_payment + (float) $initial_payment_tax );
735
 
736
  //taxes on the amount
737
  $amount = $order->PaymentAmount;
738
+ $amount_tax = $order->getTaxForPrice( $amount );
739
+
740
+ // Note: CreateRecurringPaymentsProfile expects this amount to be the total excluding tax.
741
+ $amount = pmpro_round_price_as_string( $amount );
742
 
743
  //paypal profile stuff
744
  $nvpStr = "";
746
  $nvpStr .= "&TOKEN=" . $order->Token;
747
  $nvpStr .="&INITAMT=" . $initial_payment . "&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
748
  if(!empty($amount_tax))
749
+ $nvpStr .= "&TAXAMT=" . pmpro_round_price_as_string( $amount_tax );
750
  $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLOUTAMT=AddToNextBilling";
751
  $nvpStr .= "&NOTIFYURL=" . urlencode( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) );
752
  $nvpStr .= "&DESC=" . urlencode( apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name")) );
760
  {
761
  $trial_amount = $order->TrialAmount;
762
  $trial_tax = $order->getTaxForPrice($trial_amount);
763
+
764
+ /*
765
+ * Note: For the CreateRecurringPaymentsProfile API call, it expects the TRIALAMT to be the total excluding taxes.
766
+ *
767
+ * However, there is no TRIALTAXAMT for trial periods so this is a workaround.
768
+ */
769
+ $trial_amount = pmpro_round_price_as_string( (float) $trial_amount + (float) $trial_tax );
770
 
771
  $nvpStr .= "&TRIALBILLINGPERIOD=" . $order->TrialBillingPeriod . "&TRIALBILLINGFREQUENCY=" . $order->TrialBillingFrequency . "&TRIALAMT=" . $trial_amount;
772
  }
896
  return false;
897
  }
898
  }
899
+
900
  function getTransactionStatus(&$order) {
901
  $transaction_details = $order->Gateway->getTransactionDetailsByOrder( $order );
902
  if( false === $transaction_details ){
927
  return $this->getTransactionDetails( $order->payment_transaction_id );
928
  }
929
  }
930
+
931
  /**
932
  * Try to recover the real payment_transaction_id when payment_transaction_id === subscription_transaction_id === I-xxxxxxxx.
933
  *
984
 
985
  // found the payment transaction id, it's the last one (the oldest)
986
  $payment_transaction_id = end( $transaction_ids );
987
+
988
  return $payment_transaction_id;
989
  }
990
+
991
  function getTransactionDetails($payment_transaction_id)
992
  {
993
  $nvpStr = "";
1078
  die( "Unable to complete $methodName_ request with $nvpStr_: " . $httpParsedResponseAr->get_error_message() );
1079
  }
1080
 
1081
+ /**
1082
+ * Allow performing actions using the http post request's response.
1083
+ *
1084
+ * @since 2.8
1085
+ *
1086
+ * @param array $httpParsedResponseAr The parsed response.
1087
+ * @param string $methodName_ The NVP API name.
1088
+ */
1089
+ do_action( 'pmpro_paypal_handle_http_post_response', $httpParsedResponseAr, $methodName_ );
1090
+
1091
  return $httpParsedResponseAr;
1092
  }
1093
+
1094
+ /**
1095
+ * Refunds an order (only supports full amounts)
1096
+ *
1097
+ * @param bool $succes Status of the refund (default: false)
1098
+ * @param object $morder The Member Order Object
1099
+ * @since 2.8
1100
+ *
1101
+ * @return bool Status of the processed refund
1102
+ */
1103
+ public static function process_refund( $success, $morder ){
1104
+
1105
+ //need a transaction id
1106
+ if ( empty( $morder->payment_transaction_id ) ) {
1107
+ return false;
1108
+ }
1109
+
1110
+ $transaction_id = $morder->payment_transaction_id;
1111
+
1112
+ //Get the real transaction ID
1113
+ if ( $transaction_id === $morder->subscription_transaction_id ) {
1114
+ $transaction_id = $morder->Gateway->getRealPaymentTransactionId( $morder );
1115
+ }
1116
+
1117
+ $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', '&TRANSACTIONID='.$transaction_id );
1118
+
1119
+ if ( 'success' === strtolower( $httpParsedResponseAr['ACK'] ) ) {
1120
+
1121
+ $success = true;
1122
+
1123
+ $morder->status = 'refunded';
1124
+
1125
+ global $current_user;
1126
+
1127
+ // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund.
1128
+ $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Admin: Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) );
1129
+
1130
+ $user = get_user_by( 'id', $morder->user_id );
1131
+ //send an email to the member
1132
+ $myemail = new PMProEmail();
1133
+ $myemail->sendRefundedEmail( $user, $morder );
1134
+
1135
+ //send an email to the admin
1136
+ $myemail = new PMProEmail();
1137
+ $myemail->sendRefundedAdminEmail( $user, $morder );
1138
+
1139
+ } else {
1140
+ //The refund failed, so lets return the gateway message
1141
+
1142
+ // translators: %1$s is the Transaction ID. %1$s is the Gateway Error
1143
+ $morder->notes = trim( $morder->notes .' '. sprintf( __( 'Admin: There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s.', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ) );
1144
+ }
1145
+
1146
+ $morder->SaveOrder();
1147
+
1148
+ return $success;
1149
+
1150
+ }
1151
+
1152
+ /**
1153
  * PAYPAL Function
1154
  * Send HTTP POST Request with uuid
1155
  *
1190
  if ( is_wp_error( $response ) ) {
1191
  return $response;
1192
  }
1193
+
1194
  //extract the response details
1195
  $httpParsedResponseAr = array();
1196
  parse_str(wp_remote_retrieve_body($response), $httpParsedResponseAr);
classes/gateways/class.pmprogateway_paypalstandard.php CHANGED
@@ -130,7 +130,7 @@
130
  <tr class="pmpro_settings_divider gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
131
  <td colspan="2">
132
  <hr />
133
- <h3><?php _e('PayPal Settings', 'paid-memberships-pro' ); ?></h3>
134
  </td>
135
  </tr>
136
  <tr class="gateway gateway_paypalstandard" <?php if($gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
@@ -151,7 +151,7 @@
151
  </tr>
152
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
153
  <th scope="row" valign="top">
154
- <label for="gateway_email"><?php _e('Gateway Account Email', 'paid-memberships-pro' );?>:</label>
155
  </th>
156
  <td>
157
  <input type="text" id="gateway_email" name="gateway_email" size="60" value="<?php echo esc_attr($values['gateway_email'])?>" />
@@ -159,7 +159,7 @@
159
  </tr>
160
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
161
  <th scope="row" valign="top">
162
- <label for="apiusername"><?php _e('API Username', 'paid-memberships-pro' );?>:</label>
163
  </th>
164
  <td>
165
  <input type="text" id="apiusername" name="apiusername" size="60" value="<?php echo esc_attr($values['apiusername'])?>" />
@@ -167,7 +167,7 @@
167
  </tr>
168
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
169
  <th scope="row" valign="top">
170
- <label for="apipassword"><?php _e('API Password', 'paid-memberships-pro' );?>:</label>
171
  </th>
172
  <td>
173
  <input type="text" id="apipassword" name="apipassword" size="60" value="<?php echo esc_attr($values['apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
@@ -175,7 +175,7 @@
175
  </tr>
176
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
177
  <th scope="row" valign="top">
178
- <label for="apisignature"><?php _e('API Signature', 'paid-memberships-pro' );?>:</label>
179
  </th>
180
  <td>
181
  <input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($values['apisignature'])?>" />
@@ -183,10 +183,10 @@
183
  </tr>
184
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
185
  <th scope="row" valign="top">
186
- <label><?php _e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
187
  </th>
188
  <td>
189
- <p><?php _e('Here is your IPN URL for reference. You SHOULD NOT set this in your PayPal settings.', 'paid-memberships-pro' );?> <pre><?php echo add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') );?></pre></p>
190
  </td>
191
  </tr>
192
  <?php
@@ -238,12 +238,12 @@
238
  ?>
239
  <span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
240
  <input type="hidden" name="submit-checkout" value="1" />
241
- <input type="image" id="pmpro_btn-submit-paypalstandard" class="<?php echo pmpro_get_element_class( 'pmpro_btn-submit-checkout' ); ?>" value="<?php _e('Check Out with PayPal', 'paid-memberships-pro' );?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypalobjects.com/webstatic/en_US/i/buttons/checkout-logo-medium.png");?>" />
242
  </span>
243
 
244
  <span id="pmpro_submit_span" <?php if(($gateway == "paypalexpress" || $gateway == "paypalstandard") && $pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
245
  <input type="hidden" name="submit-checkout" value="1" />
246
- <input type="submit" id="pmpro_btn-submit" class="<?php echo pmpro_get_element_class( 'pmpro_btn pmpro_btn-submit-checkout', 'pmpro_btn-submit-checkout' ); ?>" value="<?php if($pmpro_requirebilling) { _e('Submit and Check Out', 'paid-memberships-pro' ); } else { _e('Submit and Confirm', 'paid-memberships-pro' );}?> &raquo;" />
247
  </span>
248
  <?php
249
 
@@ -315,12 +315,12 @@
315
  //taxes on initial amount
316
  $initial_payment = $order->InitialPayment;
317
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
318
- $initial_payment = pmpro_round_price((float)$initial_payment + (float)$initial_payment_tax);
319
 
320
  //taxes on the amount
321
  $amount = $order->PaymentAmount;
322
  $amount_tax = $order->getTaxForPrice($amount);
323
- $amount = pmpro_round_price((float)$amount + (float)$amount_tax);
324
 
325
  //build PayPal Redirect URL
326
  $environment = pmpro_getOption("gateway_environment");
@@ -353,10 +353,10 @@
353
  $paypal_args = array(
354
  'business' => pmpro_getOption("gateway_email"),
355
  'cmd' => '_xclick-subscriptions',
356
- 'a1' => number_format($initial_payment, 2, '.', ''),
357
  'p1' => $order->BillingFrequency,
358
  't1' => $period,
359
- 'a3' => number_format($amount, 2, '.', ''),
360
  'p3' => $order->BillingFrequency,
361
  't3' => $period,
362
  'item_name' => apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name") ),
@@ -391,7 +391,7 @@
391
  {
392
  $trial_amount = $order->TrialAmount;
393
  $trial_tax = $order->getTaxForPrice($trial_amount);
394
- $trial_amount = pmpro_round_price((float)$trial_amount + (float)$trial_tax);
395
 
396
  $paypal_args['a2'] = $trial_amount;
397
  $paypal_args['p2'] = $order->TrialBillingFrequency;
@@ -469,7 +469,7 @@
469
  $paypal_args = array(
470
  'business' => pmpro_getOption("gateway_email"),
471
  'cmd' => '_xclick',
472
- 'amount' => number_format($initial_payment, 2, '.', ''),
473
  'item_name' => apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name") ),
474
  'email' => $order->Email,
475
  'no_shipping' => '1',
@@ -656,6 +656,16 @@
656
  }
657
  }
658
 
 
 
 
 
 
 
 
 
 
 
659
  return $httpParsedResponseAr;
660
  }
661
  }
130
  <tr class="pmpro_settings_divider gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
131
  <td colspan="2">
132
  <hr />
133
+ <h3><?php esc_html_e('PayPal Settings', 'paid-memberships-pro' ); ?></h3>
134
  </td>
135
  </tr>
136
  <tr class="gateway gateway_paypalstandard" <?php if($gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
151
  </tr>
152
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
153
  <th scope="row" valign="top">
154
+ <label for="gateway_email"><?php esc_html_e('Gateway Account Email', 'paid-memberships-pro' );?>:</label>
155
  </th>
156
  <td>
157
  <input type="text" id="gateway_email" name="gateway_email" size="60" value="<?php echo esc_attr($values['gateway_email'])?>" />
159
  </tr>
160
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
161
  <th scope="row" valign="top">
162
+ <label for="apiusername"><?php esc_html_e('API Username', 'paid-memberships-pro' );?>:</label>
163
  </th>
164
  <td>
165
  <input type="text" id="apiusername" name="apiusername" size="60" value="<?php echo esc_attr($values['apiusername'])?>" />
167
  </tr>
168
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
169
  <th scope="row" valign="top">
170
+ <label for="apipassword"><?php esc_html_e('API Password', 'paid-memberships-pro' );?>:</label>
171
  </th>
172
  <td>
173
  <input type="text" id="apipassword" name="apipassword" size="60" value="<?php echo esc_attr($values['apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
175
  </tr>
176
  <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
177
  <th scope="row" valign="top">
178
+ <label for="apisignature"><?php esc_html_e('API Signature', 'paid-memberships-pro' );?>:</label>
179
  </th>
180
  <td>
181
  <input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($values['apisignature'])?>" />
183
  </tr>
184
  <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
185
  <th scope="row" valign="top">
186
+ <label><?php esc_html_e('IPN Handler URL', 'paid-memberships-pro' );?>:</label>
187
  </th>
188
  <td>
189
+ <p><?php esc_html_e('Here is your IPN URL for reference. You SHOULD NOT set this in your PayPal settings.', 'paid-memberships-pro' );?> <pre><?php echo esc_html( add_query_arg( 'action', 'ipnhandler', admin_url('admin-ajax.php') ) ); ?></pre></p>
190
  </td>
191
  </tr>
192
  <?php
238
  ?>
239
  <span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
240
  <input type="hidden" name="submit-checkout" value="1" />
241
+ <input type="image" id="pmpro_btn-submit-paypalstandard" class="<?php echo pmpro_get_element_class( 'pmpro_btn-submit-checkout' ); ?>" value="<?php esc_attr_e('Check Out with PayPal', 'paid-memberships-pro' );?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypalobjects.com/webstatic/en_US/i/buttons/checkout-logo-medium.png");?>" />
242
  </span>
243
 
244
  <span id="pmpro_submit_span" <?php if(($gateway == "paypalexpress" || $gateway == "paypalstandard") && $pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
245
  <input type="hidden" name="submit-checkout" value="1" />
246
+ <input type="submit" id="pmpro_btn-submit" class="<?php echo pmpro_get_element_class( 'pmpro_btn pmpro_btn-submit-checkout', 'pmpro_btn-submit-checkout' ); ?>" value="<?php if($pmpro_requirebilling) { _e('Submit and Check Out', 'paid-memberships-pro' ); } else { _e('Submit and Confirm', 'paid-memberships-pro' );}?> &raquo;" />
247
  </span>
248
  <?php
249
 
315
  //taxes on initial amount
316
  $initial_payment = $order->InitialPayment;
317
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
318
+ $initial_payment = pmpro_round_price_as_string( (float) $initial_payment + (float) $initial_payment_tax );
319
 
320
  //taxes on the amount
321
  $amount = $order->PaymentAmount;
322
  $amount_tax = $order->getTaxForPrice($amount);
323
+ $amount = pmpro_round_price_as_string( (float) $amount + (float) $amount_tax );
324
 
325
  //build PayPal Redirect URL
326
  $environment = pmpro_getOption("gateway_environment");
353
  $paypal_args = array(
354
  'business' => pmpro_getOption("gateway_email"),
355
  'cmd' => '_xclick-subscriptions',
356
+ 'a1' => $initial_payment,
357
  'p1' => $order->BillingFrequency,
358
  't1' => $period,
359
+ 'a3' => $amount,
360
  'p3' => $order->BillingFrequency,
361
  't3' => $period,
362
  'item_name' => apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name") ),
391
  {
392
  $trial_amount = $order->TrialAmount;
393
  $trial_tax = $order->getTaxForPrice($trial_amount);
394
+ $trial_amount = pmpro_round_price_as_string((float)$trial_amount + (float)$trial_tax);
395
 
396
  $paypal_args['a2'] = $trial_amount;
397
  $paypal_args['p2'] = $order->TrialBillingFrequency;
469
  $paypal_args = array(
470
  'business' => pmpro_getOption("gateway_email"),
471
  'cmd' => '_xclick',
472
+ 'amount' => $initial_payment,
473
  'item_name' => apply_filters( 'pmpro_paypal_level_description', substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127), $order->membership_level->name, $order, get_bloginfo("name") ),
474
  'email' => $order->Email,
475
  'no_shipping' => '1',
656
  }
657
  }
658
 
659
+ /**
660
+ * Allow performing actions using the http post request's response.
661
+ *
662
+ * @since 2.8
663
+ *
664
+ * @param array $httpParsedResponseAr The parsed response.
665
+ * @param string $methodName_ The NVP API name.
666
+ */
667
+ do_action( 'pmpro_paypal_handle_http_post_response', $httpParsedResponseAr, $methodName_ );
668
+
669
  return $httpParsedResponseAr;
670
  }
671
  }
classes/gateways/class.pmprogateway_stripe.php CHANGED
@@ -14,6 +14,7 @@ use Stripe\ApplePayDomain as Stripe_ApplePayDomain;
14
  use Stripe\WebhookEndpoint as Stripe_Webhook;
15
  use Stripe\StripeClient as Stripe_Client; // Used for deleting webhook as of 2.4
16
  use Stripe\Account as Stripe_Account;
 
17
 
18
  define( "PMPRO_STRIPE_API_VERSION", "2020-03-02" );
19
 
@@ -26,6 +27,7 @@ add_action( 'init', array( 'PMProGateway_stripe', 'init' ) );
26
  // loading plugin activation actions
27
  add_action( 'activate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_activation' ) );
28
  add_action( 'deactivate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_deactivation' ) );
 
29
 
30
  /**
31
  * PMProGateway_stripe Class
@@ -78,6 +80,12 @@ class PMProGateway_stripe extends PMProGateway {
78
  //load Stripe library if it hasn't been loaded already (usually by another plugin using Stripe)
79
  if ( ! class_exists( "Stripe\Stripe" ) ) {
80
  require_once( PMPRO_DIR . "/includes/lib/Stripe/init.php" );
 
 
 
 
 
 
81
  }
82
  }
83
 
@@ -119,7 +127,7 @@ class PMProGateway_stripe extends PMProGateway {
119
  'PMProGateway_stripe',
120
  'pmpro_cron_stripe_subscription_updates'
121
  ) );
122
-
123
  //AJAX services for creating/disabling webhooks
124
  add_action( 'wp_ajax_pmpro_stripe_create_webhook', array( 'PMProGateway_stripe', 'wp_ajax_pmpro_stripe_create_webhook' ) );
125
  add_action( 'wp_ajax_pmpro_stripe_delete_webhook', array( 'PMProGateway_stripe', 'wp_ajax_pmpro_stripe_delete_webhook' ) );
@@ -140,34 +148,42 @@ class PMProGateway_stripe extends PMProGateway {
140
  $current_gateway = pmpro_getGateway();
141
 
142
  // $_REQUEST['review'] here means the PayPal Express review pag
143
- if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) )
144
- {
145
- add_action( 'pmpro_after_checkout_preheader', array(
146
- 'PMProGateway_stripe',
147
- 'pmpro_checkout_after_preheader'
148
- ) );
149
-
150
- add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) );
151
- add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) );
152
- add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) );
153
  add_filter( 'pmpro_include_billing_address_fields', array(
154
  'PMProGateway_stripe',
155
  'pmpro_include_billing_address_fields'
156
  ) );
157
- add_filter( 'pmpro_include_cardtype_field', array(
158
- 'PMProGateway_stripe',
159
- 'pmpro_include_billing_address_fields'
160
- ) );
161
- add_filter( 'pmpro_include_payment_information_fields', array(
162
- 'PMProGateway_stripe',
163
- 'pmpro_include_payment_information_fields'
164
- ) );
165
 
166
- //make sure we clean up subs we will be cancelling after checkout before processing
167
- add_action( 'pmpro_checkout_before_processing', array(
168
- 'PMProGateway_stripe',
169
- 'pmpro_checkout_before_processing'
170
- ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  }
172
 
173
  add_action( 'pmpro_payment_option_fields', array( 'PMProGateway_stripe', 'pmpro_set_up_apple_pay' ), 10, 2 );
@@ -177,6 +193,8 @@ class PMProGateway_stripe extends PMProGateway {
177
  add_action( 'admin_init', array( 'PMProGateway_stripe', 'stripe_connect_save_options' ) );
178
  add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_show_errors' ) );
179
  add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) );
 
 
180
  }
181
 
182
  /**
@@ -247,6 +265,14 @@ class PMProGateway_stripe extends PMProGateway {
247
  'stripe_payment_request_button',
248
  );
249
 
 
 
 
 
 
 
 
 
250
  return $options;
251
  }
252
 
@@ -294,7 +320,7 @@ class PMProGateway_stripe extends PMProGateway {
294
  }
295
 
296
  ?>
297
- <tr class="pmpro_settings_divider gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
298
  <td colspan="2">
299
  <hr />
300
  <h2 class="pmpro_stripe_legacy_keys" <?php if( ! self::show_legacy_keys_settings() ) {?>style="display: none;"<?php }?>><?php esc_html_e( 'Stripe API Settings (Legacy)', 'paid-memberships-pro' ); ?></h2>
@@ -308,7 +334,7 @@ class PMProGateway_stripe extends PMProGateway {
308
  jQuery(document).ready(function(){
309
  jQuery('#pmpro_stripe_legacy_keys_toggle').click(function(e){
310
  var btn = jQuery('#pmpro_stripe_legacy_keys_toggle');
311
- var div = btn.closest('.pmpro_settings_divider');
312
  btn.parent().remove();
313
  jQuery('.pmpro_stripe_legacy_keys').show();
314
  jQuery('.pmpro_stripe_legacy_keys').addClass('gateway_stripe');
@@ -321,7 +347,7 @@ class PMProGateway_stripe extends PMProGateway {
321
  </tr>
322
  <tr class="gateway pmpro_stripe_legacy_keys <?php if ( self::show_legacy_keys_settings() ) { echo 'gateway_stripe'; } ?>" <?php if ( $gateway != "stripe" || ! self::show_legacy_keys_settings() ) { ?>style="display: none;"<?php } ?>>
323
  <th scope="row" valign="top">
324
- <label for="stripe_publishablekey"><?php _e( 'Publishable Key', 'paid-memberships-pro' ); ?>:</label>
325
  </th>
326
  <td>
327
  <input type="text" id="stripe_publishablekey" name="stripe_publishablekey" value="<?php echo esc_attr( $values['stripe_publishablekey'] ) ?>" class="regular-text code" />
@@ -329,7 +355,7 @@ class PMProGateway_stripe extends PMProGateway {
329
  $public_key_prefix = substr( $values['stripe_publishablekey'], 0, 3 );
330
  if ( ! empty( $values['stripe_publishablekey'] ) && $public_key_prefix != 'pk_' ) {
331
  ?>
332
- <p class="pmpro_red"><strong><?php _e( 'Your Publishable Key appears incorrect.', 'paid-memberships-pro' ); ?></strong></p>
333
  <?php
334
  }
335
  ?>
@@ -337,12 +363,12 @@ class PMProGateway_stripe extends PMProGateway {
337
  </tr>
338
  <tr class="gateway pmpro_stripe_legacy_keys <?php if ( self::show_legacy_keys_settings() ) { echo 'gateway_stripe'; } ?>" <?php if ( $gateway != "stripe" || ! self::show_legacy_keys_settings() ) { ?>style="display: none;"<?php } ?>>
339
  <th scope="row" valign="top">
340
- <label for="stripe_secretkey"><?php _e( 'Secret Key', 'paid-memberships-pro' ); ?>:</label>
341
  </th>
342
  <td>
343
  <input type="text" id="stripe_secretkey" name="stripe_secretkey" value="<?php echo esc_attr( $values['stripe_secretkey'] ) ?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
344
  </td>
345
- </tr>
346
  <tr class="gateway pmpro_stripe_legacy_keys <?php if ( self::show_legacy_keys_settings() ) { echo 'gateway_stripe'; } ?>" <?php if ( $gateway != "stripe" || ! self::show_legacy_keys_settings() ) { ?>style="display: none;"<?php } ?>>
347
  <th scope="row" valign="top">
348
  <label><?php esc_html_e( 'Webhook', 'paid-memberships-pro' ); ?>:</label>
@@ -350,32 +376,32 @@ class PMProGateway_stripe extends PMProGateway {
350
  <td>
351
  <?php if ( ! empty( $webhook ) && is_array( $webhook ) && self::show_legacy_keys_settings()) { ?>
352
  <button type="button" id="pmpro_stripe_create_webhook" class="button button-secondary" style="display: none;"><span class="dashicons dashicons-update-alt"></span> <?php _e( 'Create Webhook' ,'paid-memberships-pro' ); ?></button>
353
- <?php
354
  if ( 'disabled' === $webhook['status'] ) {
355
  // Check webhook status.
356
  ?>
357
  <div class="notice error inline">
358
- <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php _e( 'A webhook is set up in Stripe, but it is disabled.', 'paid-memberships-pro' ); ?> <a id="pmpro_stripe_rebuild_webhook" href="#">Rebuild Webhook</a></p>
359
  </div>
360
  <?php
361
  } elseif ( $webhook['api_version'] < PMPRO_STRIPE_API_VERSION ) {
362
  // Check webhook API version.
363
  ?>
364
  <div class="notice error inline">
365
- <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php _e( 'A webhook is set up in Stripe, but it is using an old API version.', 'paid-memberships-pro' ); ?> <a id="pmpro_stripe_rebuild_webhook" href="#"><?php _e( 'Rebuild Webhook', 'paid-memberships-pro' ); ?></a></p>
366
  </div>
367
  <?php
368
  } else {
369
  ?>
370
  <div class="notice notice-success inline">
371
- <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php _e( 'Your webhook is enabled.', 'paid-memberships-pro' ); ?> <a id="pmpro_stripe_delete_webhook" href="#"><?php _e( 'Disable Webhook', 'paid-memberships-pro' ); ?></a></p>
372
  </div>
373
  <?php
374
  }
375
  } elseif ( self::show_legacy_keys_settings() ) { ?>
376
  <button type="button" id="pmpro_stripe_create_webhook" class="button button-secondary"><span class="dashicons dashicons-update-alt"></span> <?php _e( 'Create Webhook' ,'paid-memberships-pro' ); ?></button>
377
  <div class="notice error inline">
378
- <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php _e('A webhook in Stripe is required to process recurring payments, manage failed payments, and synchronize cancellations.', 'paid-memberships-pro' );?></p>
379
  </div>
380
  <?php
381
  }
@@ -384,40 +410,40 @@ class PMProGateway_stripe extends PMProGateway {
384
  <code><?php echo self::get_site_webhook_url(); ?></code></p>
385
  </td>
386
  </tr>
387
- <tr class="pmpro_settings_divider gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
388
  <td colspan="2">
389
  <hr />
390
- <h2><?php esc_html_e( 'Other Stripe Settings', 'paid-memberships-pro' ); ?></h2>
391
  </td>
392
  </tr>
393
  <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
394
- <th><?php _e( 'Stripe API Version', 'paid-memberships-pro' ); ?>:</th>
395
  <td><code><?php echo PMPRO_STRIPE_API_VERSION; ?></code></td>
396
  </tr>
397
  <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
398
  <th scope="row" valign="top">
399
- <label for="stripe_billingaddress"><?php _e( 'Show Billing Address Fields', 'paid-memberships-pro' ); ?>:</label>
400
  </th>
401
  <td>
402
  <select id="stripe_billingaddress" name="stripe_billingaddress">
403
  <option value="0"
404
- <?php if ( empty( $values['stripe_billingaddress'] ) ) { ?>selected="selected"<?php } ?>><?php _e( 'No', 'paid-memberships-pro' ); ?></option>
405
  <option value="1"
406
- <?php if ( ! empty( $values['stripe_billingaddress'] ) ) { ?>selected="selected"<?php } ?>><?php _e( 'Yes', 'paid-memberships-pro' ); ?></option>
407
  </select>
408
- <p class="description"><?php _e( "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>", 'paid-memberships-pro' ); ?></p>
409
  </td>
410
  </tr>
411
  <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
412
  <th scope="row" valign="top">
413
- <label for="stripe_payment_request_button"><?php _e( 'Enable Payment Request Button', 'paid-memberships-pro' ); ?>:</label>
414
  </th>
415
  <td>
416
  <select id="stripe_payment_request_button" name="stripe_payment_request_button">
417
  <option value="0"
418
- <?php if ( empty( $values['stripe_payment_request_button'] ) ) { ?>selected="selected"<?php } ?>><?php _e( 'No', 'paid-memberships-pro' ); ?></option>
419
  <option value="1"
420
- <?php if ( ! empty( $values['stripe_payment_request_button'] ) ) { ?>selected="selected"<?php } ?>><?php _e( 'Yes', 'paid-memberships-pro' ); ?></option>
421
  </select>
422
  <?php
423
  $allowed_stripe_payment_button_html = array (
@@ -469,11 +495,97 @@ class PMProGateway_stripe extends PMProGateway {
469
  ),
470
  );
471
  echo '<tr class="gateway gateway_stripe"';
472
- if ( $gateway != "stripe" ) {
473
  echo ' style="display: none;"';
474
  }
475
  echo '><th>&nbsp;</th><td><p class="description">' . sprintf( wp_kses( __( 'Optional: Offer PayPal Express as an option at checkout using the <a target="_blank" href="%s" title="Paid Memberships Pro - Add PayPal Express Option at Checkout Add On">Add PayPal Express Add On</a>.', 'paid-memberships-pro' ), $allowed_appe_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-add-paypal-express-option-checkout/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=add-ons&utm_content=pmpro-add-paypal-express-option-checkout' ) . '</p></td></tr>';
476
- } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
477
  <?php
478
  }
479
 
@@ -482,10 +594,10 @@ class PMProGateway_stripe extends PMProGateway {
482
  */
483
  public static function wp_ajax_pmpro_stripe_create_webhook( $silent = false ) {
484
  $secretkey = sanitize_text_field( $_REQUEST['secretkey'] );
485
-
486
  $stripe = new PMProGateway_stripe();
487
  Stripe\Stripe::setApiKey( $secretkey );
488
-
489
  $update_webhook_response = $stripe::update_webhook_events();
490
 
491
  if ( empty( $update_webhook_response ) || is_wp_error( $update_webhook_response ) ) {
@@ -504,7 +616,7 @@ class PMProGateway_stripe extends PMProGateway {
504
  'response' => $update_webhook_response
505
  );
506
  }
507
-
508
  if ( $silent ) {
509
  return $r;
510
  } else {
@@ -512,16 +624,16 @@ class PMProGateway_stripe extends PMProGateway {
512
  exit;
513
  }
514
  }
515
-
516
  /**
517
  * AJAX callback to disable webhooks.
518
  */
519
  public static function wp_ajax_pmpro_stripe_delete_webhook( $silent = false ) {
520
  $secretkey = sanitize_text_field( $_REQUEST['secretkey'] );
521
-
522
  $stripe = new PMProGateway_stripe();
523
  Stripe\Stripe::setApiKey( $secretkey );
524
-
525
  $webhook = self::does_webhook_exist();
526
 
527
  $r = array(
@@ -625,32 +737,28 @@ class PMProGateway_stripe extends PMProGateway {
625
  global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail;
626
 
627
  //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required.
628
- unset( $fields['CVV'] );
629
 
630
  //if using stripe lite, remove some fields from the required array
631
  if ( $pmpro_stripe_lite ) {
632
- //some fields to remove
633
- $remove = array(
634
- 'bfirstname',
635
- 'blastname',
636
- 'baddress1',
637
- 'bcity',
638
- 'bstate',
639
- 'bzipcode',
640
- 'bphone',
641
- 'bcountry',
642
- 'CardType'
643
- );
644
- //if a user is logged in, don't require bemail either
645
- if ( ! empty( $current_user->user_email ) ) {
646
- $remove[] = 'bemail';
647
- $bemail = $current_user->user_email;
648
- $bconfirmemail = $bemail;
649
- }
650
- //remove the fields
651
- foreach ( $remove as $field ) {
652
- unset( $fields[ $field ] );
653
- }
654
  }
655
 
656
  return $fields;
@@ -744,8 +852,8 @@ class PMProGateway_stripe extends PMProGateway {
744
  <div id="pmpro_payment_information_fields" class="<?php echo pmpro_get_element_class( 'pmpro_checkout', 'pmpro_payment_information_fields' ); ?>"
745
  <?php if ( ! $pmpro_requirebilling || apply_filters( "pmpro_hide_payment_information_fields", false ) ) { ?>style="display: none;"<?php } ?>>
746
  <h3>
747
- <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-name' ); ?>"><?php _e( 'Payment Information', 'paid-memberships-pro' ); ?></span>
748
- <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-msg' ); ?>"><?php printf( __( 'We Accept %s', 'paid-memberships-pro' ), $pmpro_accepted_credit_cards_string ); ?></span>
749
  </h3>
750
  <?php $sslseal = pmpro_getOption( "sslseal" ); ?>
751
  <?php if ( ! empty( $sslseal ) ) { ?>
@@ -765,11 +873,11 @@ class PMProGateway_stripe extends PMProGateway {
765
  $pmpro_include_cardtype_field = apply_filters( 'pmpro_include_cardtype_field', false );
766
  if ( $pmpro_include_cardtype_field ) { ?>
767
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-card-type', 'pmpro_payment-card-type' ); ?>">
768
- <label for="CardType"><?php _e( 'Card Type', 'paid-memberships-pro' ); ?></label>
769
  <select id="CardType" class="<?php echo pmpro_get_element_class( 'CardType' ); ?>">
770
  <?php foreach ( $pmpro_accepted_credit_cards as $cc ) { ?>
771
- <option value="<?php echo $cc ?>"
772
- <?php if ( $CardType == $cc ) { ?>selected="selected"<?php } ?>><?php echo $cc ?></option>
773
  <?php } ?>
774
  </select>
775
  </div>
@@ -778,29 +886,29 @@ class PMProGateway_stripe extends PMProGateway {
778
  value="<?php echo esc_attr( $CardType ); ?>"/>
779
  <?php } ?>
780
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-account-number', 'pmpro_payment-account-number' ); ?>">
781
- <label for="AccountNumber"><?php _e( 'Card Number', 'paid-memberships-pro' ); ?></label>
782
  <div id="AccountNumber"></div>
783
  </div>
784
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-expiration', 'pmpro_payment-expiration' ); ?>">
785
- <label for="Expiry"><?php _e( 'Expiration Date', 'paid-memberships-pro' ); ?></label>
786
  <div id="Expiry"></div>
787
  </div>
788
  <?php
789
  $pmpro_show_cvv = apply_filters( "pmpro_show_cvv", true );
790
  if ( $pmpro_show_cvv ) { ?>
791
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-cvv', 'pmpro_payment-cvv' ); ?>">
792
- <label for="CVV"><?php _e( 'CVC', 'paid-memberships-pro' ); ?></label>
793
  <div id="CVV"></div>
794
  </div>
795
  <?php } ?>
796
  <?php if ( $pmpro_show_discount_code ) { ?>
797
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-discount-code', 'pmpro_payment-discount-code' ); ?>">
798
- <label for="discount_code"><?php _e( 'Discount Code', 'paid-memberships-pro' ); ?></label>
799
  <input class="<?php echo pmpro_get_element_class( 'input pmpro_alter_price', 'discount_code' ); ?>"
800
  id="discount_code" name="discount_code" type="text" size="10"
801
  value="<?php echo esc_attr( $discount_code ) ?>"/>
802
  <input type="button" id="discount_code_button" name="discount_code_button"
803
- value="<?php _e( 'Apply', 'paid-memberships-pro' ); ?>"/>
804
  <p id="discount_code_message" class="<?php echo pmpro_get_element_class( 'pmpro_message' ); ?>" style="display: none;"></p>
805
  </div>
806
  <?php } ?>
@@ -955,6 +1063,23 @@ class PMProGateway_stripe extends PMProGateway {
955
  wp_clear_scheduled_hook( 'pmpro_cron_stripe_subscription_updates' );
956
  }
957
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
958
  /**
959
  * Cron job for subscription updates.
960
  *
@@ -1124,10 +1249,10 @@ class PMProGateway_stripe extends PMProGateway {
1124
  if ( ! empty( $subscription ) ) {
1125
  $customer = $order->Gateway->get_customer_for_user( $user_id );
1126
  if ( ! $customer->delinquent && ! empty ( $subscription->current_period_end ) ) {
1127
- $offset = get_option( 'gmt_offset' );
1128
  $timestamp = $subscription->current_period_end + ( $offset * 3600 );
1129
  } elseif ( $customer->delinquent && ! empty( $subscription->current_period_start ) ) {
1130
- $offset = get_option( 'gmt_offset' );
1131
  $timestamp = $subscription->current_period_start + ( $offset * 3600 );
1132
  } else {
1133
  $timestamp = null; // shouldn't really get here
@@ -1149,9 +1274,9 @@ class PMProGateway_stripe extends PMProGateway {
1149
  if ( empty( $payment_option_values['stripe_payment_request_button'] ) ) {
1150
  // We don't want to unregister domain or remove file in case
1151
  // other plugins are using it.
1152
- return;
1153
  }
1154
-
1155
  // Make sure that Apple Pay is set up.
1156
  // TODO: Apple Pay API functions don't seem to work with
1157
  // test API keys. Need to figure this out.
@@ -1179,7 +1304,7 @@ class PMProGateway_stripe extends PMProGateway {
1179
  if ( ! isset( $_REQUEST['pmpro_stripe_connected'] ) || ! isset( $_REQUEST['pmpro_stripe_connected_environment'] ) ) {
1180
  return false;
1181
  }
1182
-
1183
  // Change current gateway to Stripe
1184
  pmpro_setOption( 'gateway', 'stripe' );
1185
  pmpro_setOption( 'gateway_environment', $_REQUEST['pmpro_stripe_connected_environment'] );
@@ -1210,7 +1335,7 @@ class PMProGateway_stripe extends PMProGateway {
1210
  pmpro_setOption( 'sandbox_stripe_connect_secretkey', $_REQUEST['pmpro_stripe_access_token'] );
1211
  pmpro_setOption( 'sandbox_stripe_connect_publishablekey', $_REQUEST['pmpro_stripe_publishable_key'] );
1212
  }
1213
-
1214
 
1215
  // Delete option for user API key.
1216
  delete_option( 'pmpro_stripe_secretkey' );
@@ -1287,7 +1412,7 @@ class PMProGateway_stripe extends PMProGateway {
1287
  * @return bool Whether the site is using legacy Stripe keys.
1288
  */
1289
  public static function using_legacy_keys() {
1290
- $r = ! empty( pmpro_getOption( 'stripe_secretkey' ) ) && ! empty( pmpro_getOption( 'stripe_publishablekey' ) );
1291
  return $r;
1292
  }
1293
 
@@ -1305,14 +1430,14 @@ class PMProGateway_stripe extends PMProGateway {
1305
 
1306
  if ( $gateway_environment === 'live' ) {
1307
  // Return whether Stripe is connected for live gateway environment.
1308
- return (
1309
  pmpro_getOption( 'live_stripe_connect_user_id' ) &&
1310
  pmpro_getOption( 'live_stripe_connect_secretkey' ) &&
1311
  pmpro_getOption( 'live_stripe_connect_publishablekey' )
1312
  );
1313
  } else {
1314
  // Return whether Stripe is connected for sandbox gateway environment.
1315
- return (
1316
  pmpro_getOption( 'sandbox_stripe_connect_user_id' ) &&
1317
  pmpro_getOption( 'sandbox_stripe_connect_secretkey' ) &&
1318
  pmpro_getOption( 'sandbox_stripe_connect_publishablekey' )
@@ -1366,6 +1491,295 @@ class PMProGateway_stripe extends PMProGateway {
1366
  return true;
1367
  }
1368
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1369
  /****************************************
1370
  ************ PUBLIC METHODS ************
1371
  ****************************************/
@@ -1375,6 +1789,11 @@ class PMProGateway_stripe extends PMProGateway {
1375
  * @since 1.4
1376
  */
1377
  public function process( &$order ) {
 
 
 
 
 
1378
  $payment_transaction_id = '';
1379
  $subscription_transaction_id = '';
1380
 
@@ -1421,7 +1840,7 @@ class PMProGateway_stripe extends PMProGateway {
1421
  $payment_method = $this->get_payment_method( $order );
1422
  if ( empty( $payment_method ) ) {
1423
  // There was an issue getting the payment method.
1424
- $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' );
1425
  $order->shorterror = $order->error;
1426
  return false;
1427
  }
@@ -1463,7 +1882,7 @@ class PMProGateway_stripe extends PMProGateway {
1463
  }
1464
  $order->stripe_subscription = $subscription;
1465
  $setup_intent = $subscription->pending_setup_intent;
1466
-
1467
  if ( ! empty( $setup_intent->status ) && 'requires_action' === $setup_intent->status ) {
1468
  // We will need to reload the page to authenticate, so save the subscription ID in the setup intent
1469
  // so that we don't lose it.
@@ -1476,7 +1895,7 @@ class PMProGateway_stripe extends PMProGateway {
1476
  $order->stripe_setup_intent = $setup_intent;
1477
  $order->errorcode = true;
1478
  $order->error = __( 'Customer authentication is required to finish setting up your subscription. Please complete the verification steps issued by your payment provider.', 'paid-memberships-pro' );
1479
-
1480
  return false;
1481
  }
1482
 
@@ -1607,7 +2026,7 @@ class PMProGateway_stripe extends PMProGateway {
1607
  ! empty( $user->pmpro_bcity ) &&
1608
  ! empty( $user->pmpro_bstate ) &&
1609
  ! empty( $user->pmpro_bzipcode ) &&
1610
- ! empty( $user->pmpro_bcountry )
1611
  ) {
1612
  // We have an address in user meta and there is
1613
  // no address in Stripe. May as well send it.
@@ -1650,7 +2069,7 @@ class PMProGateway_stripe extends PMProGateway {
1650
  */
1651
  public function getSubscriptionStatus( &$order ) {
1652
  $subscription = $this->get_subscription( $order->subscription_transaction_id );
1653
-
1654
  if ( ! empty( $subscription ) ) {
1655
  return $subscription->status;
1656
  } else {
@@ -1674,7 +2093,7 @@ class PMProGateway_stripe extends PMProGateway {
1674
  $payment_method = $this->get_payment_method( $order );
1675
  if ( empty( $payment_method ) ) {
1676
  // There was an issue getting the payment method.
1677
- $order->error = __( "Error retrieving payment method.", 'paid-memberships-pro' );
1678
  $order->shorterror = $order->error;
1679
  return false;
1680
  }
@@ -1749,6 +2168,26 @@ class PMProGateway_stripe extends PMProGateway {
1749
  }
1750
  }
1751
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1752
 
1753
  /****************************************
1754
  *********** PRIVATE METHODS ************
@@ -1762,7 +2201,7 @@ class PMProGateway_stripe extends PMProGateway {
1762
  * @param array $values Current settings.
1763
  * @param string $gateway currently being shown.
1764
  */
1765
- private function show_connect_payment_option_fields( $livemode = true, $values, $gateway ) {
1766
  $gateway_environment = $this->gateway_environment;
1767
 
1768
  $stripe_legacy_key = $values['stripe_publishablekey'];
@@ -1787,7 +2226,7 @@ class PMProGateway_stripe extends PMProGateway {
1787
  <h2>
1788
  <?php esc_html_e( 'Stripe Connect Settings', 'paid-memberships-pro' ); ?>
1789
  <span class="pmpro_gateway-mode pmpro_gateway-mode-<?php echo $environment2; ?> <?php esc_attr_e( $connection_selector ); ?>">
1790
- <?php
1791
  echo ( $livemode ? esc_html__( 'Live Mode:', 'paid-memberships-pro' ) : esc_html__( 'Test Mode:', 'paid-memberships-pro' ) ) . ' ';
1792
  if ( self::has_connect_credentials( $environment ) ) {
1793
  esc_html_e( 'Connected', 'paid-memberships-pro' );
@@ -1867,7 +2306,7 @@ class PMProGateway_stripe extends PMProGateway {
1867
  } else {
1868
  esc_html_e( 'Note: You are using the free Stripe payment gateway integration. This includes an additional 1% fee for payment processing. This fee is removed by activating a premium PMPro license.', 'paid-memberships-pro');
1869
  }
1870
- echo ' <a href="https://www.paidmembershipspro.com/gateway/stripe/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=gateways&utm_content=stripe-fees#tab-fees" target="_blank">' . esc_html( 'Learn More &raquo;', 'paid-memberships-pro' ) . '</a>';
1871
  ?>
1872
  </p>
1873
  <input type='hidden' name='<?php echo $environment; ?>_stripe_connect_user_id' id='<?php echo $environment; ?>_stripe_connect_user_id' value='<?php echo esc_attr( $values[ $environment . '_stripe_connect_user_id'] ) ?>'/>
@@ -2035,7 +2474,7 @@ class PMProGateway_stripe extends PMProGateway {
2035
  ! empty( $order->billing->city ) &&
2036
  ! empty( $order->billing->state ) &&
2037
  ! empty( $order->billing->zip ) &&
2038
- ! empty( $order->billing->country )
2039
  ) {
2040
  // We collected a billing address at checkout.
2041
  // Send it to Stripe.
@@ -2053,7 +2492,7 @@ class PMProGateway_stripe extends PMProGateway {
2053
  ! empty( $user->pmpro_bcity ) &&
2054
  ! empty( $user->pmpro_bstate ) &&
2055
  ! empty( $user->pmpro_bzipcode ) &&
2056
- ! empty( $user->pmpro_bcountry )
2057
  ) {
2058
  // We have an address in user meta and there is
2059
  // no address in Stripe. May as well send it.
@@ -2111,6 +2550,9 @@ class PMProGateway_stripe extends PMProGateway {
2111
  }
2112
  add_action( "user_register", "pmpro_user_register_stripe_customerid" );
2113
  }
 
 
 
2114
  }
2115
 
2116
  /**
@@ -2154,7 +2596,7 @@ class PMProGateway_stripe extends PMProGateway {
2154
  return $customer;
2155
  }
2156
 
2157
- /**
2158
  * Convert a price to a positive integer in cents (or 0 for a free price)
2159
  * representing how much to charge. This is how Stripe wants us to send price amounts.
2160
  *
@@ -2162,19 +2604,13 @@ class PMProGateway_stripe extends PMProGateway {
2162
  * @return integer
2163
  */
2164
  private function convert_price_to_unit_amount( $price ) {
2165
- global $pmpro_currencies, $pmpro_currency;
2166
- $currency_unit_multiplier = 100; // ie 100 cents per USD.
2167
 
2168
- // Account for zero-decimal currencies like the Japanese Yen.
2169
- if (
2170
- is_array( $pmpro_currencies[ $pmpro_currency ] ) &&
2171
- isset( $pmpro_currencies[ $pmpro_currency ]['decimals'] ) &&
2172
- $pmpro_currencies[ $pmpro_currency ]['decimals'] == 0
2173
- ) {
2174
- $currency_unit_multiplier = 1;
2175
  }
2176
 
2177
- return intval( $price * $currency_unit_multiplier );
2178
  }
2179
 
2180
  /**
@@ -2302,9 +2738,17 @@ class PMProGateway_stripe extends PMProGateway {
2302
  $currency = pmpro_get_currency();
2303
 
2304
  $is_recurring = ! empty( $cycle_period ) && ! empty( $cycle_number );
2305
- $unit_amount = intval( $amount * pow( 10, intval( $currency['decimals'] ) ) );
 
 
2306
  $cycle_period = strtolower( $cycle_period );
2307
 
 
 
 
 
 
 
2308
  $price_search_args = array(
2309
  'product' => $product_id,
2310
  'type' => $is_recurring ? 'recurring' : 'one_time',
@@ -2317,31 +2761,34 @@ class PMProGateway_stripe extends PMProGateway {
2317
 
2318
  try {
2319
  $prices = Stripe_Price::all( $price_search_args );
2320
-
2321
- foreach ( $prices as $price ) {
2322
- // Check whether price is the same. If not, continue.
2323
- if ( intval( $price->unit_amount ) !== intval( $unit_amount ) ) {
2324
- continue;
2325
- }
2326
- // Check if recurring structure is the same. If not, continue.
2327
- if ( $is_recurring && ( empty( $price->recurring->interval_count ) || intval( $price->recurring->interval_count ) !== intval( $cycle_number ) ) ) {
2328
- continue;
2329
- }
2330
- return $price;
2331
- }
2332
  } catch (\Throwable $th) {
2333
  // There was an error listing prices.
2334
- return $th->getMessage();
2335
  } catch (\Exception $e) {
2336
  // There was an error listing prices.
2337
  return $e->getMessage();
2338
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2339
 
2340
  // Create a new Price.
2341
  $price_args = array(
2342
  'product' => $product_id,
2343
  'currency' => strtolower( $pmpro_currency ),
2344
- 'unit_amount' => $unit_amount
2345
  );
2346
  if ( $is_recurring ) {
2347
  $price_args['recurring'] = array(
@@ -2349,6 +2796,9 @@ class PMProGateway_stripe extends PMProGateway {
2349
  'interval_count' => $cycle_number
2350
  );
2351
  }
 
 
 
2352
 
2353
  try {
2354
  $price = Stripe_Price::create( $price_args );
@@ -2372,9 +2822,10 @@ class PMProGateway_stripe extends PMProGateway {
2372
  * @since 2.7.0.
2373
  *
2374
  * @param MemberOrder $order to calculate trial period days for.
 
2375
  * @return int trial period days.
2376
  */
2377
- private function calculate_trial_period_days( $order ) {
2378
  // Use a trial period to set the first recurring payment date.
2379
  if ( $order->BillingPeriod == "Year" ) {
2380
  $trial_period_days = $order->BillingFrequency * 365; //annual
@@ -2395,7 +2846,9 @@ class PMProGateway_stripe extends PMProGateway {
2395
  $order->ProfileStartDate = date_i18n( "Y-m-d\TH:i:s", strtotime( "+ " . $trial_period_days . " Day", current_time( "timestamp" ) ) );
2396
 
2397
  //filter the start date
2398
- $order->ProfileStartDate = apply_filters( "pmpro_profile_start_date", $order->ProfileStartDate, $order );
 
 
2399
 
2400
  //convert back to days
2401
  $trial_period_days = ceil( abs( strtotime( date_i18n( "Y-m-d\TH:i:s" ), current_time( "timestamp" ) ) - strtotime( $order->ProfileStartDate, current_time( "timestamp" ) ) ) / 86400 );
@@ -2435,7 +2888,7 @@ class PMProGateway_stripe extends PMProGateway {
2435
  $subscription_params = array(
2436
  'customer' => $customer_id,
2437
  'items' => array(
2438
- array( 'price' => $price ),
2439
  ),
2440
  'trial_period_days' => $trial_period_days,
2441
  'expand' => array(
@@ -2646,7 +3099,7 @@ class PMProGateway_stripe extends PMProGateway {
2646
  $current_month = date_i18n( 'm' );
2647
  ?>
2648
  <h3><?php esc_html_e( 'Subscription Updates', 'paid-memberships-pro' ); ?></h3>
2649
- <p><?php esc_html_e( 'Subscription updates will be deprecated in a future version of PMPro, though your existing subscription updates will still trigger as expected. We now instead reccomend updating the subscription directly in Stripe.', 'paid-memberships-pro' ); ?></p>
2650
  <table class="form-table">
2651
  <input type='hidden' name='pmpro_subscription_updates_visible' value='1' />
2652
  <tr>
@@ -2735,14 +3188,12 @@ class PMProGateway_stripe extends PMProGateway {
2735
  <?php
2736
  }
2737
 
2738
-
2739
-
2740
  /****************************************
2741
  ******* METHODS BECOMING PRIVATE *******
2742
  ****************************************/
2743
  /**
2744
  * Get available webhooks
2745
- *
2746
  * @since 2.4
2747
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2748
  */
@@ -2766,13 +3217,13 @@ class PMProGateway_stripe extends PMProGateway {
2766
  } catch (\Exception $e) {
2767
  $webhooks = $e->getMessage();
2768
  }
2769
-
2770
  return $webhooks;
2771
  }
2772
 
2773
  /**
2774
  * Get current webhook URL for website to compare.
2775
- *
2776
  * @since 2.4
2777
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2778
  */
@@ -2784,24 +3235,34 @@ class PMProGateway_stripe extends PMProGateway {
2784
 
2785
  /**
2786
  * List of current enabled events required for PMPro to work.
2787
- *
2788
  * @since 2.4
2789
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2790
  */
2791
  public static function webhook_events() {
2792
  // Show deprecation warning if called publically.
2793
  pmpro_method_should_be_private( '2.7.0' );
2794
- return apply_filters( 'pmpro_stripe_webhook_events', array(
 
2795
  'invoice.payment_succeeded',
2796
  'invoice.payment_action_required',
2797
  'customer.subscription.deleted',
2798
- 'charge.failed'
2799
- ) );
 
 
 
 
 
 
 
 
 
2800
  }
2801
 
2802
  /**
2803
  * Create webhook with relevant events
2804
- *
2805
  * @since 2.4
2806
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2807
  */
@@ -2826,12 +3287,12 @@ class PMProGateway_stripe extends PMProGateway {
2826
  //throw $th;
2827
  return new WP_Error( 'error', $e->getMessage() );
2828
  }
2829
-
2830
  }
2831
 
2832
  /**
2833
  * See if a webhook is registered with Stripe.
2834
- *
2835
  * @since 2.4
2836
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2837
  */
@@ -2845,7 +3306,7 @@ class PMProGateway_stripe extends PMProGateway {
2845
  }
2846
 
2847
  $webhooks = self::get_webhooks();
2848
-
2849
  $webhook_id = false;
2850
  if ( ! empty( $webhooks ) && ! empty( $webhooks['data'] ) ) {
2851
 
@@ -2879,7 +3340,7 @@ class PMProGateway_stripe extends PMProGateway {
2879
 
2880
  /**
2881
  * Get a list of events that are missing between the created existing webhook and required webhook events for Paid Memberships Pro.
2882
- *
2883
  * @since 2.4
2884
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2885
  */
@@ -2893,7 +3354,7 @@ class PMProGateway_stripe extends PMProGateway {
2893
  // No missing events if webhook event is "All Events" selected.
2894
  if ( is_array( $webhook_events ) && $webhook_events[0] === '*' ) {
2895
  return false;
2896
- }
2897
 
2898
  if ( count( array_diff( $pmpro_webhook_events, $webhook_events ) ) ) {
2899
  $events = array_unique( array_merge( $pmpro_webhook_events, $webhook_events ) );
@@ -2908,7 +3369,7 @@ class PMProGateway_stripe extends PMProGateway {
2908
 
2909
  /**
2910
  * Update required webhook enabled events.
2911
- *
2912
  * @since 2.4
2913
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2914
  */
@@ -2928,17 +3389,17 @@ class PMProGateway_stripe extends PMProGateway {
2928
  if ( ! isset( $webhook['enabled_events'] ) ) {
2929
  return;
2930
  }
2931
-
2932
  $events = self::check_missing_webhook_events( $webhook['enabled_events'] );
2933
-
2934
  if ( $events ) {
2935
 
2936
  try {
2937
- $update = Stripe_Webhook::update(
2938
  $webhook['webhook_id'],
2939
  ['enabled_events' => $events ]
2940
  );
2941
-
2942
  if ( $update ) {
2943
  return $update;
2944
  }
@@ -2949,14 +3410,14 @@ class PMProGateway_stripe extends PMProGateway {
2949
  //throw $th;
2950
  return new WP_Error( 'error', $e->getMessage() );
2951
  }
2952
-
2953
  }
2954
-
2955
  }
2956
 
2957
  /**
2958
  * Delete an existing webhook.
2959
- *
2960
  * @since 2.4
2961
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
2962
  */
@@ -2970,7 +3431,7 @@ class PMProGateway_stripe extends PMProGateway {
2970
  if ( is_array( $webhook_id ) ) {
2971
  $webhook_id = $webhook_id['webhook_id'];
2972
  }
2973
-
2974
  try {
2975
  $stripe = new Stripe_Client( $secretkey );
2976
  $delete = $stripe->webhookEndpoints->delete( $webhook_id, [] );
@@ -3115,29 +3576,29 @@ class PMProGateway_stripe extends PMProGateway {
3115
 
3116
  // get customer
3117
  $customer = $this->update_customer_at_checkout( $order );
3118
-
3119
  if ( empty( $customer ) ) {
3120
  return false;
3121
  }
3122
-
3123
  // get all subscriptions
3124
  if ( ! empty( $customer->subscriptions ) ) {
3125
  $subscriptions = $customer->subscriptions->all();
3126
  }
3127
-
3128
  foreach( $subscriptions as $subscription ) {
3129
  // check if cancelled or expired
3130
  if ( in_array( $subscription->status, array( 'canceled', 'incomplete', 'incomplete_expired' ) ) ) {
3131
  continue;
3132
  }
3133
-
3134
  // check if we have a related order for it
3135
  $one_order = new MemberOrder();
3136
  $one_order->getLastMemberOrderBySubscriptionTransactionID( $subscription->id );
3137
  if ( empty( $one_order ) || empty( $one_order->id ) ) {
3138
  continue;
3139
  }
3140
-
3141
  // update the payment method
3142
  $subscription->default_payment_method = $customer->invoice_settings->default_payment_method;
3143
  $subscription->save();
@@ -3410,7 +3871,7 @@ class PMProGateway_stripe extends PMProGateway {
3410
 
3411
  /**
3412
  * Register domain with Apple Pay.
3413
- *
3414
  * @since 2.4
3415
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3416
  */
@@ -3429,7 +3890,7 @@ class PMProGateway_stripe extends PMProGateway {
3429
 
3430
  /**
3431
  * See if domain is registered with Apple Pay.
3432
- *
3433
  * @since 2.4
3434
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3435
  */
@@ -3522,7 +3983,6 @@ class PMProGateway_stripe extends PMProGateway {
3522
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3523
  *
3524
  * @param array $params to be sent to Stripe.
3525
- * @param bool $add_percent true if percentage should be added, false if actual amount.
3526
  * @return array params with application fee if applicable.
3527
  */
3528
  public static function add_application_fee_amount( $params ) {
@@ -3564,7 +4024,7 @@ class PMProGateway_stripe extends PMProGateway {
3564
  pmpro_method_should_be_private( '2.7.0' );
3565
  $secretkey = '';
3566
  if ( self::using_legacy_keys() ) {
3567
- $secretkey = pmpro_getOption( 'stripe_secretkey' );
3568
  } else {
3569
  $secretkey = pmpro_getOption( 'gateway_environment' ) === 'live'
3570
  ? pmpro_getOption( 'live_stripe_connect_secretkey' )
@@ -3584,7 +4044,7 @@ class PMProGateway_stripe extends PMProGateway {
3584
  pmpro_method_should_be_private( '2.7.0' );
3585
  $publishablekey = '';
3586
  if ( self::using_legacy_keys() ) {
3587
- $publishablekey = pmpro_getOption( 'stripe_publishablekey' );
3588
  } else {
3589
  $publishablekey = pmpro_getOption( 'gateway_environment' ) === 'live'
3590
  ? pmpro_getOption( 'live_stripe_connect_publishablekey' )
@@ -3657,7 +4117,7 @@ class PMProGateway_stripe extends PMProGateway {
3657
 
3658
  return ( empty( $num_problem_orders ) );
3659
  }
3660
-
3661
  /**
3662
  * Get the date the last webhook was processed.
3663
  * @param environment The gateway environment (live or sandbox) to check for.
@@ -3818,7 +4278,7 @@ class PMProGateway_stripe extends PMProGateway {
3818
  //need to remember the user updates to save later
3819
  global $pmpro_stripe_updates;
3820
  $pmpro_stripe_updates = $new_user_updates;
3821
-
3822
  if( ! function_exists( 'pmpro_user_register_stripe_updates' ) ) {
3823
  function pmpro_user_register_stripe_updates( $user_id ) {
3824
  global $pmpro_stripe_updates;
@@ -4269,6 +4729,91 @@ class PMProGateway_stripe extends PMProGateway {
4269
  return $this->refund( $order, $transaction_id );
4270
  }
4271
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4272
  /**
4273
  * Refund a payment or invoice
4274
  *
@@ -4448,7 +4993,7 @@ class PMProGateway_stripe extends PMProGateway {
4448
  $amount_tax = $order->getTaxForPrice( $amount );
4449
  $amount = pmpro_round_price( (float) $amount + (float) $amount_tax );
4450
 
4451
-
4452
  $trial_period_days = $this->calculate_trial_period_days( $order );
4453
  // Save $trial_period_days to order for now too.
4454
  $order->TrialPeriodDays = $trial_period_days;
@@ -4481,6 +5026,4 @@ class PMProGateway_stripe extends PMProGateway {
4481
 
4482
  return $order->plan;
4483
  }
4484
-
4485
-
4486
  }
14
  use Stripe\WebhookEndpoint as Stripe_Webhook;
15
  use Stripe\StripeClient as Stripe_Client; // Used for deleting webhook as of 2.4
16
  use Stripe\Account as Stripe_Account;
17
+ use Stripe\Checkout\Session as Stripe_Checkout_Session;
18
 
19
  define( "PMPRO_STRIPE_API_VERSION", "2020-03-02" );
20
 
27
  // loading plugin activation actions
28
  add_action( 'activate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_activation' ) );
29
  add_action( 'deactivate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_deactivation' ) );
30
+ add_filter( 'pmpro_registered_crons', array( 'PMProGateway_stripe', 'register_cron' ) );
31
 
32
  /**
33
  * PMProGateway_stripe Class
80
  //load Stripe library if it hasn't been loaded already (usually by another plugin using Stripe)
81
  if ( ! class_exists( "Stripe\Stripe" ) ) {
82
  require_once( PMPRO_DIR . "/includes/lib/Stripe/init.php" );
83
+ } else {
84
+ // Another plugin may have loaded the Stripe library already.
85
+ // Let's log the current Stripe Library info so that we know
86
+ // where to look if we need to troubleshoot library conflicts.
87
+ $previously_loaded_class = new \ReflectionClass( 'Stripe\Stripe' );
88
+ pmpro_track_library_conflict( 'stripe', $previously_loaded_class->getFileName(), Stripe\Stripe::VERSION );
89
  }
90
  }
91
 
127
  'PMProGateway_stripe',
128
  'pmpro_cron_stripe_subscription_updates'
129
  ) );
130
+
131
  //AJAX services for creating/disabling webhooks
132
  add_action( 'wp_ajax_pmpro_stripe_create_webhook', array( 'PMProGateway_stripe', 'wp_ajax_pmpro_stripe_create_webhook' ) );
133
  add_action( 'wp_ajax_pmpro_stripe_delete_webhook', array( 'PMProGateway_stripe', 'wp_ajax_pmpro_stripe_delete_webhook' ) );
148
  $current_gateway = pmpro_getGateway();
149
 
150
  // $_REQUEST['review'] here means the PayPal Express review pag
151
+ if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) {
 
 
 
 
 
 
 
 
 
152
  add_filter( 'pmpro_include_billing_address_fields', array(
153
  'PMProGateway_stripe',
154
  'pmpro_include_billing_address_fields'
155
  ) );
 
 
 
 
 
 
 
 
156
 
157
+ if ( ! self::using_stripe_checkout() ) {
158
+ // On-site checkout flow.
159
+ add_action( 'pmpro_after_checkout_preheader', array(
160
+ 'PMProGateway_stripe',
161
+ 'pmpro_checkout_after_preheader'
162
+ ) );
163
+ add_filter( 'pmpro_include_cardtype_field', array(
164
+ 'PMProGateway_stripe',
165
+ 'pmpro_include_billing_address_fields'
166
+ ) );
167
+ add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) );
168
+ add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) );
169
+ add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) );
170
+ add_filter( 'pmpro_include_payment_information_fields', array(
171
+ 'PMProGateway_stripe',
172
+ 'pmpro_include_payment_information_fields'
173
+ ) );
174
+
175
+ //make sure we clean up subs we will be cancelling after checkout before processing
176
+ add_action( 'pmpro_checkout_before_processing', array(
177
+ 'PMProGateway_stripe',
178
+ 'pmpro_checkout_before_processing'
179
+ ) );
180
+ } else {
181
+ // Checkout flow for Stripe Checkout.
182
+ add_filter('pmpro_include_payment_information_fields', array('PMProGateway_stripe', 'show_stripe_checkout_pending_warning'));
183
+ add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2);
184
+ add_filter('pmprommpu_gateway_supports_multiple_level_checkout', '__return_false', 10, 2);
185
+ add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_billing_preheader_stripe_checkout' ) );
186
+ }
187
  }
188
 
189
  add_action( 'pmpro_payment_option_fields', array( 'PMProGateway_stripe', 'pmpro_set_up_apple_pay' ), 10, 2 );
193
  add_action( 'admin_init', array( 'PMProGateway_stripe', 'stripe_connect_save_options' ) );
194
  add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_show_errors' ) );
195
  add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) );
196
+
197
+ add_filter( 'pmpro_process_refund_stripe', array( 'PMProGateway_stripe', 'process_refund' ), 10, 2 );
198
  }
199
 
200
  /**
265
  'stripe_payment_request_button',
266
  );
267
 
268
+ if ( self::stripe_checkout_beta_enabled() ) {
269
+ $options[] = 'stripe_payment_flow'; // 'onsite' or 'checkout'
270
+ $options[] = 'stripe_update_billing_flow'; // 'onsite' or 'portal'
271
+ $options[] = 'stripe_checkout_billing_address'; //'auto' or 'required'
272
+ $options[] = 'stripe_tax'; // 'no', 'inclusive', 'exclusive'
273
+ $options[] = 'stripe_tax_id_collection_enabled'; // '0', '1'
274
+ }
275
+
276
  return $options;
277
  }
278
 
320
  }
321
 
322
  ?>
323
+ <tr class="pmpro_settings_divider gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
324
  <td colspan="2">
325
  <hr />
326
  <h2 class="pmpro_stripe_legacy_keys" <?php if( ! self::show_legacy_keys_settings() ) {?>style="display: none;"<?php }?>><?php esc_html_e( 'Stripe API Settings (Legacy)', 'paid-memberships-pro' ); ?></h2>
334
  jQuery(document).ready(function(){
335
  jQuery('#pmpro_stripe_legacy_keys_toggle').click(function(e){
336
  var btn = jQuery('#pmpro_stripe_legacy_keys_toggle');
337
+ var div = btn.closest('.pmpro_settings_divider');
338
  btn.parent().remove();
339
  jQuery('.pmpro_stripe_legacy_keys').show();
340
  jQuery('.pmpro_stripe_legacy_keys').addClass('gateway_stripe');
347
  </tr>
348
  <tr class="gateway pmpro_stripe_legacy_keys <?php if ( self::show_legacy_keys_settings() ) { echo 'gateway_stripe'; } ?>" <?php if ( $gateway != "stripe" || ! self::show_legacy_keys_settings() ) { ?>style="display: none;"<?php } ?>>
349
  <th scope="row" valign="top">
350
+ <label for="stripe_publishablekey"><?php esc_html_e( 'Publishable Key', 'paid-memberships-pro' ); ?>:</label>
351
  </th>
352
  <td>
353
  <input type="text" id="stripe_publishablekey" name="stripe_publishablekey" value="<?php echo esc_attr( $values['stripe_publishablekey'] ) ?>" class="regular-text code" />
355
  $public_key_prefix = substr( $values['stripe_publishablekey'], 0, 3 );
356
  if ( ! empty( $values['stripe_publishablekey'] ) && $public_key_prefix != 'pk_' ) {
357
  ?>
358
+ <p class="pmpro_red"><strong><?php esc_html_e( 'Your Publishable Key appears incorrect.', 'paid-memberships-pro' ); ?></strong></p>
359
  <?php
360
  }
361
  ?>
363
  </tr>
364
  <tr class="gateway pmpro_stripe_legacy_keys <?php if ( self::show_legacy_keys_settings() ) { echo 'gateway_stripe'; } ?>" <?php if ( $gateway != "stripe" || ! self::show_legacy_keys_settings() ) { ?>style="display: none;"<?php } ?>>
365
  <th scope="row" valign="top">
366
+ <label for="stripe_secretkey"><?php esc_html_e( 'Secret Key', 'paid-memberships-pro' ); ?>:</label>
367
  </th>
368
  <td>
369
  <input type="text" id="stripe_secretkey" name="stripe_secretkey" value="<?php echo esc_attr( $values['stripe_secretkey'] ) ?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
370
  </td>
371
+ </tr>
372
  <tr class="gateway pmpro_stripe_legacy_keys <?php if ( self::show_legacy_keys_settings() ) { echo 'gateway_stripe'; } ?>" <?php if ( $gateway != "stripe" || ! self::show_legacy_keys_settings() ) { ?>style="display: none;"<?php } ?>>
373
  <th scope="row" valign="top">
374
  <label><?php esc_html_e( 'Webhook', 'paid-memberships-pro' ); ?>:</label>
376
  <td>
377
  <?php if ( ! empty( $webhook ) && is_array( $webhook ) && self::show_legacy_keys_settings()) { ?>
378
  <button type="button" id="pmpro_stripe_create_webhook" class="button button-secondary" style="display: none;"><span class="dashicons dashicons-update-alt"></span> <?php _e( 'Create Webhook' ,'paid-memberships-pro' ); ?></button>
379
+ <?php
380
  if ( 'disabled' === $webhook['status'] ) {
381
  // Check webhook status.
382
  ?>
383
  <div class="notice error inline">
384
+ <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php esc_html_e( 'A webhook is set up in Stripe, but it is disabled.', 'paid-memberships-pro' ); ?> <a id="pmpro_stripe_rebuild_webhook" href="#"><?php esc_html_e( 'Rebuild Webhook', 'paid-memberships-pro' ); ?></a></p>
385
  </div>
386
  <?php
387
  } elseif ( $webhook['api_version'] < PMPRO_STRIPE_API_VERSION ) {
388
  // Check webhook API version.
389
  ?>
390
  <div class="notice error inline">
391
+ <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php esc_html_e( 'A webhook is set up in Stripe, but it is using an old API version.', 'paid-memberships-pro' ); ?> <a id="pmpro_stripe_rebuild_webhook" href="#"><?php esc_html_e( 'Rebuild Webhook', 'paid-memberships-pro' ); ?></a></p>
392
  </div>
393
  <?php
394
  } else {
395
  ?>
396
  <div class="notice notice-success inline">
397
+ <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php esc_html_e( 'Your webhook is enabled.', 'paid-memberships-pro' ); ?> <a id="pmpro_stripe_delete_webhook" href="#"><?php esc_html_e( 'Disable Webhook', 'paid-memberships-pro' ); ?></a></p>
398
  </div>
399
  <?php
400
  }
401
  } elseif ( self::show_legacy_keys_settings() ) { ?>
402
  <button type="button" id="pmpro_stripe_create_webhook" class="button button-secondary"><span class="dashicons dashicons-update-alt"></span> <?php _e( 'Create Webhook' ,'paid-memberships-pro' ); ?></button>
403
  <div class="notice error inline">
404
+ <p id="pmpro_stripe_webhook_notice" class="pmpro_stripe_webhook_notice"><?php esc_html_e('A webhook in Stripe is required to process recurring payments, manage failed payments, and synchronize cancellations.', 'paid-memberships-pro' );?></p>
405
  </div>
406
  <?php
407
  }
410
  <code><?php echo self::get_site_webhook_url(); ?></code></p>
411
  </td>
412
  </tr>
413
+ <tr class="pmpro_settings_divider gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
414
  <td colspan="2">
415
  <hr />
416
+ <h2><?php esc_html_e( 'Other Stripe Settings', 'paid-memberships-pro' ); ?></h2>
417
  </td>
418
  </tr>
419
  <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
420
+ <th><?php esc_html_e( 'Stripe API Version', 'paid-memberships-pro' ); ?>:</th>
421
  <td><code><?php echo PMPRO_STRIPE_API_VERSION; ?></code></td>
422
  </tr>
423
  <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
424
  <th scope="row" valign="top">
425
+ <label for="stripe_billingaddress"><?php esc_html_e( 'Show Billing Address Fields', 'paid-memberships-pro' ); ?>:</label>
426
  </th>
427
  <td>
428
  <select id="stripe_billingaddress" name="stripe_billingaddress">
429
  <option value="0"
430
+ <?php if ( empty( $values['stripe_billingaddress'] ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'No', 'paid-memberships-pro' ); ?></option>
431
  <option value="1"
432
+ <?php if ( ! empty( $values['stripe_billingaddress'] ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Yes', 'paid-memberships-pro' ); ?></option>
433
  </select>
434
+ <p class="description"><?php echo wp_kses_post( __( "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>", 'paid-memberships-pro' ) ); ?></p>
435
  </td>
436
  </tr>
437
  <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
438
  <th scope="row" valign="top">
439
+ <label for="stripe_payment_request_button"><?php esc_html_e( 'Enable Payment Request Button', 'paid-memberships-pro' ); ?>:</label>
440
  </th>
441
  <td>
442
  <select id="stripe_payment_request_button" name="stripe_payment_request_button">
443
  <option value="0"
444
+ <?php if ( empty( $values['stripe_payment_request_button'] ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'No', 'paid-memberships-pro' ); ?></option>
445
  <option value="1"
446
+ <?php if ( ! empty( $values['stripe_payment_request_button'] ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Yes', 'paid-memberships-pro' ); ?></option>
447
  </select>
448
  <?php
449
  $allowed_stripe_payment_button_html = array (
495
  ),
496
  );
497
  echo '<tr class="gateway gateway_stripe"';
498
+ if ( $gateway != "stripe" ) {
499
  echo ' style="display: none;"';
500
  }
501
  echo '><th>&nbsp;</th><td><p class="description">' . sprintf( wp_kses( __( 'Optional: Offer PayPal Express as an option at checkout using the <a target="_blank" href="%s" title="Paid Memberships Pro - Add PayPal Express Option at Checkout Add On">Add PayPal Express Add On</a>.', 'paid-memberships-pro' ), $allowed_appe_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-add-paypal-express-option-checkout/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=add-ons&utm_content=pmpro-add-paypal-express-option-checkout' ) . '</p></td></tr>';
502
+ }
503
+ if ( ! self::stripe_checkout_beta_enabled() ) {
504
+ // Don't show Stripe Checkout settings if the beta is not enabled.
505
+ return;
506
+ }
507
+ ?>
508
+ <tr class="pmpro_settings_divider gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
509
+ <td colspan="2">
510
+ <hr />
511
+ <h2><?php esc_html_e( 'Stripe Checkout Settings (Beta)', 'paid-memberships-pro' ); ?></h2>
512
+ <div class="notice notice-large notice-warning inline">
513
+ <p>
514
+ <strong><?php esc_html_e( 'Stripe Checkout is currently in beta and not recommended for use on live sites.', 'paid-memberships-pro' ); ?></strong><br />
515
+ <?php esc_html_e( 'Stripe Checkout is a secure, Stripe-hosted payment page that lets you collect payments quickly. The offsite, conversion-optimized payment form works across devices, removes friction with real-time card validation, and has built-in error messaging. This gateway option relies heavily on the webhooks sent by Stripe. Your Stripe webhooks must be properly configured before enabling Stripe Checkout.', 'paid-memberships-pro' );
516
+ ?></p>
517
+ </div>
518
+ </td>
519
+ </tr>
520
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
521
+ <th scope="row" valign="top">
522
+ <label for="stripe_payment_flow"><?php esc_html_e( 'Payment Flow', 'paid-memberships-pro' ); ?>:</label>
523
+ </th>
524
+ <td>
525
+ <select id="stripe_payment_flow" name="stripe_payment_flow">
526
+ <option value="onsite" <?php selected( $values['stripe_payment_flow'], 'onsite' ); ?>><?php esc_html_e( 'Accept payments on this site', 'paid-memberships-pro' ); ?></option>
527
+ <option value="checkout" <?php selected( $values['stripe_payment_flow'], 'checkout' ); ?>><?php esc_html_e( 'Accept payments in Stripe (Stripe Checkout)', 'paid-memberships-pro' ); ?></option>
528
+ </select>
529
+ <p class="description"><?php esc_html_e( 'Embed the payment information fields on your Membership Checkout page or use the Stripe-hosted payment page (Stripe Checkout).', 'paid-memberships-pro' ); ?>
530
+ </td>
531
+ </tr>
532
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
533
+ <th scope="row" valign="top">
534
+ <label for="stripe_update_billing_flow"><?php esc_html_e( 'Update Billing Flow', 'paid-memberships-pro' ); ?>:</label>
535
+ </th>
536
+ <td>
537
+ <select id="stripe_update_billing_flow" name="stripe_update_billing_flow">
538
+ <option value="onsite"><?php esc_html_e( 'Update billing on this site', 'paid-memberships-pro' ); ?></option>
539
+ <option value="portal" <?php if ( $values['stripe_update_billing_flow'] === 'portal' ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Update billing in the Stripe Customer Portal', 'paid-memberships-pro' ); ?></option>
540
+ </select>
541
+ <p class="description"><?php esc_html_e( 'Embed the billing information fields on your Membership Billing page or use the Stripe Customer Portal hosted by Stripe.', 'paid-memberships-pro' ); ?></p>
542
+ </td>
543
+ </tr>
544
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
545
+ <th scope="row" valign="top">
546
+ <label for="stripe_checkout_billing_address"><?php esc_html_e( 'Collect Billing Address in Stripe Checkout', 'paid-memberships-pro' ); ?>:</label>
547
+ </th>
548
+ <td>
549
+ <select id="stripe_checkout_billing_address" name="stripe_checkout_billing_address">
550
+ <option value="auto"><?php esc_html_e( 'Only when necessary', 'paid-memberships-pro' ); ?></option>
551
+ <option value="required" <?php if ( 'required' === $values['stripe_checkout_billing_address'] ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Always', 'paid-memberships-pro' ); ?></option>
552
+ </select>
553
+ </td>
554
+ </tr>
555
+ <tr class="gateway gateway_stripe" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
556
+ <th scope="row" valign="top">
557
+ <label for="stripe_tax"><?php esc_html_e( 'Stripe Tax', 'paid-memberships-pro' ); ?>:</label>
558
+ </th>
559
+ <td>
560
+ <select id="stripe_tax" name="stripe_tax">
561
+ <option value="no"><?php esc_html_e( 'Do not calculate tax', 'paid-memberships-pro' ); ?></option>
562
+ <option value="inclusive" <?php if ( $values['stripe_tax'] === 'inclusive' ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Membership price includes tax', 'paid-memberships-pro' ); ?></option>
563
+ <option value="exclusive" <?php if ( $values['stripe_tax'] === 'exclusive' ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Calculate tax on top of membership price', 'paid-memberships-pro' ); ?></option>
564
+ </select>
565
+ <?php
566
+ $allowed_stripe_tax_description_html = array (
567
+ 'a' => array (
568
+ 'href' => array(),
569
+ 'target' => array(),
570
+ 'title' => array(),
571
+ ),
572
+ );
573
+ ?>
574
+ <p class="description"><?php echo sprintf( wp_kses( __( 'Stripe Tax is only available when using Stripe Checkout (the Stripe-hosted payment page). You must <a target="_blank" href="%s">activate Stripe Tax</a> in your Stripe dashboard. <a target="_blank" href="%s">More information about Stripe Tax »</a>', 'paid-memberships-pro' ), $allowed_stripe_tax_description_html ), 'https://stripe.com/tax', 'https://dashboard.stripe.com/settings/tax/activate' ); ?></p>
575
+ </td>
576
+ </tr>
577
+ <tr class="gateway gateway_stripe gateway_stripe_checkout_fields" <?php if ( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
578
+ <th scope="row" valign="top">
579
+ <label for="stripe_tax_id_collection_enabled"><?php esc_html_e( 'Collect Tax IDs', 'paid-memberships-pro' ); ?>:</label>
580
+ </th>
581
+ <td>
582
+ <select id="stripe_tax_id_collection_enabled" name="stripe_tax_id_collection_enabled">
583
+ <option value="0"><?php esc_html_e( 'No, do not collect tax IDs.', 'paid-memberships-pro' ); ?></option>
584
+ <option value="1" <?php if ( ! empty( $values['stripe_tax_id_collection_enabled'] ) ) { ?>selected="selected"<?php } ?>><?php esc_html_e( 'Yes, collect tax IDs.', 'paid-memberships-pro' ); ?></option>
585
+ </select>
586
+ <p class="description"><?php esc_html_e( 'Tax IDs are only collected if you have enabled Stripe Tax. Stripe only performs automatic validation for ABN, EU VAT, and GB VAT numbers. You must verify that provided tax IDs are valid during the Session for all other numbers.', 'paid-memberships-pro' ); ?></p>
587
+ </td>
588
+ </tr>
589
  <?php
590
  }
591
 
594
  */
595
  public static function wp_ajax_pmpro_stripe_create_webhook( $silent = false ) {
596
  $secretkey = sanitize_text_field( $_REQUEST['secretkey'] );
597
+
598
  $stripe = new PMProGateway_stripe();
599
  Stripe\Stripe::setApiKey( $secretkey );
600
+
601
  $update_webhook_response = $stripe::update_webhook_events();
602
 
603
  if ( empty( $update_webhook_response ) || is_wp_error( $update_webhook_response ) ) {
616
  'response' => $update_webhook_response
617
  );
618
  }
619
+
620
  if ( $silent ) {
621
  return $r;
622
  } else {
624
  exit;
625
  }
626
  }
627
+
628
  /**
629
  * AJAX callback to disable webhooks.
630
  */
631
  public static function wp_ajax_pmpro_stripe_delete_webhook( $silent = false ) {
632
  $secretkey = sanitize_text_field( $_REQUEST['secretkey'] );
633
+
634
  $stripe = new PMProGateway_stripe();
635
  Stripe\Stripe::setApiKey( $secretkey );
636
+
637
  $webhook = self::does_webhook_exist();
638
 
639
  $r = array(
737
  global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail;
738
 
739
  //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required.
740
+ $remove = [ 'CVV' ];
741
 
742
  //if using stripe lite, remove some fields from the required array
743
  if ( $pmpro_stripe_lite ) {
744
+ $remove = array_merge( $remove, [ 'bfirstname', 'blastname', 'baddress', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry', 'CardType' ] );
745
+ }
746
+
747
+ // If a user is logged in, don't require bemail either
748
+ if ( ! empty( $current_user->user_email ) ) {
749
+ $remove = array_merge( $remove, [ 'bemail' ] );
750
+ $bemail = $current_user->user_email;
751
+ $bconfirmemail = $bemail;
752
+ }
753
+
754
+ // If using Stripe Checkout, don't require card information.
755
+ if ( self::using_stripe_checkout() ) {
756
+ $remove = array_merge( $remove, [ 'CardType', 'AccountNumber', 'ExpirationMonth', 'ExpirationYear', 'CVV' ] );
757
+ }
758
+
759
+ // Remove the fields.
760
+ foreach ( $remove as $field ) {
761
+ unset( $fields[ $field ] );
 
 
 
 
762
  }
763
 
764
  return $fields;
852
  <div id="pmpro_payment_information_fields" class="<?php echo pmpro_get_element_class( 'pmpro_checkout', 'pmpro_payment_information_fields' ); ?>"
853
  <?php if ( ! $pmpro_requirebilling || apply_filters( "pmpro_hide_payment_information_fields", false ) ) { ?>style="display: none;"<?php } ?>>
854
  <h3>
855
+ <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-name' ); ?>"><?php esc_html_e( 'Payment Information', 'paid-memberships-pro' ); ?></span>
856
+ <span class="<?php echo pmpro_get_element_class( 'pmpro_checkout-h3-msg' ); ?>"><?php printf( esc_html__( 'We Accept %s', 'paid-memberships-pro' ), $pmpro_accepted_credit_cards_string ); ?></span>
857
  </h3>
858
  <?php $sslseal = pmpro_getOption( "sslseal" ); ?>
859
  <?php if ( ! empty( $sslseal ) ) { ?>
873
  $pmpro_include_cardtype_field = apply_filters( 'pmpro_include_cardtype_field', false );
874
  if ( $pmpro_include_cardtype_field ) { ?>
875
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-card-type', 'pmpro_payment-card-type' ); ?>">
876
+ <label for="CardType"><?php esc_html_e( 'Card Type', 'paid-memberships-pro' ); ?></label>
877
  <select id="CardType" class="<?php echo pmpro_get_element_class( 'CardType' ); ?>">
878
  <?php foreach ( $pmpro_accepted_credit_cards as $cc ) { ?>
879
+ <option value="<?php echo esc_attr( $cc ) ?>"
880
+ <?php if ( $CardType === $cc ) { ?>selected="selected"<?php } ?>><?php echo esc_html( $cc ); ?></option>
881
  <?php } ?>
882
  </select>
883
  </div>
886
  value="<?php echo esc_attr( $CardType ); ?>"/>
887
  <?php } ?>
888
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-account-number', 'pmpro_payment-account-number' ); ?>">
889
+ <label for="AccountNumber"><?php esc_html_e( 'Card Number', 'paid-memberships-pro' ); ?></label>
890
  <div id="AccountNumber"></div>
891
  </div>
892
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-expiration', 'pmpro_payment-expiration' ); ?>">
893
+ <label for="Expiry"><?php esc_html_e( 'Expiration Date', 'paid-memberships-pro' ); ?></label>
894
  <div id="Expiry"></div>
895
  </div>
896
  <?php
897
  $pmpro_show_cvv = apply_filters( "pmpro_show_cvv", true );
898
  if ( $pmpro_show_cvv ) { ?>
899
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-cvv', 'pmpro_payment-cvv' ); ?>">
900
+ <label for="CVV"><?php esc_html_e( 'CVC', 'paid-memberships-pro' ); ?></label>
901
  <div id="CVV"></div>
902
  </div>
903
  <?php } ?>
904
  <?php if ( $pmpro_show_discount_code ) { ?>
905
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout-field pmpro_payment-discount-code', 'pmpro_payment-discount-code' ); ?>">
906
+ <label for="discount_code"><?php esc_html_e( 'Discount Code', 'paid-memberships-pro' ); ?></label>
907
  <input class="<?php echo pmpro_get_element_class( 'input pmpro_alter_price', 'discount_code' ); ?>"
908
  id="discount_code" name="discount_code" type="text" size="10"
909
  value="<?php echo esc_attr( $discount_code ) ?>"/>
910
  <input type="button" id="discount_code_button" name="discount_code_button"
911
+ value="<?php esc_attr_e( 'Apply', 'paid-memberships-pro' ); ?>"/>
912
  <p id="discount_code_message" class="<?php echo pmpro_get_element_class( 'pmpro_message' ); ?>" style="display: none;"></p>
913
  </div>
914
  <?php } ?>
1063
  wp_clear_scheduled_hook( 'pmpro_cron_stripe_subscription_updates' );
1064
  }
1065
 
1066
+ /**
1067
+ * Register the cron we need for Stripe subscription updates.
1068
+ *
1069
+ * @since 2.8
1070
+ *
1071
+ * @param array $crons The list of registered crons for Paid Memberships Pro.
1072
+ *
1073
+ * @return array The list of registered crons for Paid Memberships Pro.
1074
+ */
1075
+ public static function register_cron( $crons ) {
1076
+ $crons['pmpro_cron_stripe_subscription_updates'] = [
1077
+ 'interval' => 'daily',
1078
+ ];
1079
+
1080
+ return $crons;
1081
+ }
1082
+
1083
  /**
1084
  * Cron job for subscription updates.
1085
  *
1249
  if ( ! empty( $subscription ) ) {
1250
  $customer = $order->Gateway->get_customer_for_user( $user_id );
1251
  if ( ! $customer->delinquent && ! empty ( $subscription->current_period_end ) ) {
1252
+ $offset = get_option( 'gmt_offset' );
1253
  $timestamp = $subscription->current_period_end + ( $offset * 3600 );
1254
  } elseif ( $customer->delinquent && ! empty( $subscription->current_period_start ) ) {
1255
+ $offset = get_option( 'gmt_offset' );
1256
  $timestamp = $subscription->current_period_start + ( $offset * 3600 );
1257
  } else {
1258
  $timestamp = null; // shouldn't really get here
1274
  if ( empty( $payment_option_values['stripe_payment_request_button'] ) ) {
1275
  // We don't want to unregister domain or remove file in case
1276
  // other plugins are using it.
1277
+ return;
1278
  }
1279
+
1280
  // Make sure that Apple Pay is set up.
1281
  // TODO: Apple Pay API functions don't seem to work with
1282
  // test API keys. Need to figure this out.
1304
  if ( ! isset( $_REQUEST['pmpro_stripe_connected'] ) || ! isset( $_REQUEST['pmpro_stripe_connected_environment'] ) ) {
1305
  return false;
1306
  }
1307
+
1308
  // Change current gateway to Stripe
1309
  pmpro_setOption( 'gateway', 'stripe' );
1310
  pmpro_setOption( 'gateway_environment', $_REQUEST['pmpro_stripe_connected_environment'] );
1335
  pmpro_setOption( 'sandbox_stripe_connect_secretkey', $_REQUEST['pmpro_stripe_access_token'] );
1336
  pmpro_setOption( 'sandbox_stripe_connect_publishablekey', $_REQUEST['pmpro_stripe_publishable_key'] );
1337
  }
1338
+
1339
 
1340
  // Delete option for user API key.
1341
  delete_option( 'pmpro_stripe_secretkey' );
1412
  * @return bool Whether the site is using legacy Stripe keys.
1413
  */
1414
  public static function using_legacy_keys() {
1415
+ $r = ! empty( pmpro_getOption( 'stripe_secretkey' ) ) && ! empty( pmpro_getOption( 'stripe_publishablekey' ) );
1416
  return $r;
1417
  }
1418
 
1430
 
1431
  if ( $gateway_environment === 'live' ) {
1432
  // Return whether Stripe is connected for live gateway environment.
1433
+ return (
1434
  pmpro_getOption( 'live_stripe_connect_user_id' ) &&
1435
  pmpro_getOption( 'live_stripe_connect_secretkey' ) &&
1436
  pmpro_getOption( 'live_stripe_connect_publishablekey' )
1437
  );
1438
  } else {
1439
  // Return whether Stripe is connected for sandbox gateway environment.
1440
+ return (
1441
  pmpro_getOption( 'sandbox_stripe_connect_user_id' ) &&
1442
  pmpro_getOption( 'sandbox_stripe_connect_secretkey' ) &&
1443
  pmpro_getOption( 'sandbox_stripe_connect_publishablekey' )
1491
  return true;
1492
  }
1493
 
1494
+ /**
1495
+ * Check if the user has opted into the Stripe Checkout beta.
1496
+ *
1497
+ * @return bool
1498
+ */
1499
+ public static function stripe_checkout_beta_enabled() {
1500
+ return ( defined( 'PMPRO_STRIPE_CHECKOUT_BETA_ENABLED' ) && PMPRO_STRIPE_CHECKOUT_BETA_ENABLED );
1501
+ }
1502
+
1503
+ /**
1504
+ * Check if Stripe Checkout is being used.
1505
+ *
1506
+ * @return bool
1507
+ */
1508
+ public static function using_stripe_checkout() {
1509
+ // While Stripe Checkout is in beta, only enable it if the constant is set.
1510
+ if ( ! self::stripe_checkout_beta_enabled() ) {
1511
+ return false;
1512
+ }
1513
+
1514
+ return 'checkout' === pmpro_getOption( 'stripe_payment_flow' );
1515
+ }
1516
+
1517
+ /**
1518
+ * Show warning at checkout if Stripe Checkout is being used and
1519
+ * the last order is pending.
1520
+ *
1521
+ * @since 2.8
1522
+ *
1523
+ * @param bool $show Whether to show the default payment information fields.
1524
+ * @return bool
1525
+ */
1526
+ static function show_stripe_checkout_pending_warning($show)
1527
+ {
1528
+ global $gateway;
1529
+
1530
+ //show our submit buttons
1531
+ ?>
1532
+ <span id="pmpro_payment_information_fields" <?php if( $gateway != "stripe" ) { ?>style="display: none;"<?php } ?>>
1533
+ <?php
1534
+ // If the current user's last order is a pending Stripe order, warn them that they already have a pending order.
1535
+ $last_order = new MemberOrder();
1536
+ $last_order->getLastMemberOrder( get_current_user_id(), null, null, 'stripe' );
1537
+ if ( ! empty( $last_order->id ) && $last_order->status === 'pending' ) {
1538
+ ?>
1539
+ <p class="pmpro_error"><?php _e( 'Your previous order has not yet been processed. Submitting your payment again will cause a separate charge to be initiated.', 'paid-memberships-pro' ); ?></p>
1540
+ <?php
1541
+ }
1542
+
1543
+ ?>
1544
+ </span>
1545
+ <?php
1546
+
1547
+ //don't show the default submit button.
1548
+ return false;
1549
+ }
1550
+
1551
+ /**
1552
+ * Instead of changeing membership levels, send users to Stripe to pay.
1553
+ *
1554
+ * @since 2.8
1555
+ *
1556
+ * @param int $user_id ID of user who is checking out.
1557
+ * @param MemberOrder $morder MemberOrder object for this checkout.
1558
+ */
1559
+ static function pmpro_checkout_before_change_membership_level($user_id, $morder)
1560
+ {
1561
+ global $pmpro_level, $discount_code, $discount_code_id, $wpdb, $pmpro_currency;
1562
+
1563
+ //if no order, no need to pay
1564
+ if ( empty( $morder ) || $morder->gateway != 'stripe' ) {
1565
+ return;
1566
+ }
1567
+
1568
+ $morder->user_id = $user_id;
1569
+ $morder->status = 'token';
1570
+ $morder->saveOrder();
1571
+
1572
+ // Save some checkout information in the order so that we can access it when the payment is complete.
1573
+ // Save the request variables.
1574
+ $request_vars = $_REQUEST;
1575
+ unset( $request_vars['password'] );
1576
+ unset( $request_vars['password2'] );
1577
+ unset( $request_vars['password2_copy'] );
1578
+ update_pmpro_membership_order_meta( $morder->id, 'checkout_request_vars', $request_vars );
1579
+
1580
+ // Save the checkout level.
1581
+ $pmpro_level_arr = (array) $pmpro_level;
1582
+ update_pmpro_membership_order_meta( $morder->id, 'checkout_level', $pmpro_level_arr );
1583
+
1584
+ // Save the discount code.
1585
+ $pmpro_discount_code_arr = (array) $discount_code;
1586
+ update_pmpro_membership_order_meta( $morder->id, 'checkout_discount_code', $pmpro_discount_code_arr );
1587
+
1588
+ // Time to send the user to pay with Stripe!
1589
+ $stripe = new PMProGateway_stripe();
1590
+
1591
+ // Let's first get the customer to charge.
1592
+ $customer = $stripe->update_customer_at_checkout( $morder );
1593
+ if ( empty( $customer ) ) {
1594
+ // There was an issue creating/updating the Stripe customer.
1595
+ // $order will have an error message.
1596
+ pmpro_setMessage( __( 'Could not get customer. ', 'paid-memberships-pro' ) . $morder->error, 'pmpro_error', true );
1597
+ return;
1598
+ }
1599
+
1600
+ // Next, let's get the product being purchased.
1601
+ $product_id = $stripe->get_product_id_for_level( $morder->membership_id );
1602
+ if ( empty( $product_id ) ) {
1603
+ // Something went wrong getting the product ID or creating the product.
1604
+ // Show the user a general error message.
1605
+ pmpro_setMessage( __( 'Could not get product ID.', 'paid-memberships-pro' ), 'pmpro_error', true );
1606
+ return;
1607
+ }
1608
+
1609
+ // Then, we need to build the line items array to charge.
1610
+ $line_items = array();
1611
+
1612
+ // Used to calculate Stripe Connect fees.
1613
+ $application_fee_percentage = self::get_application_fee_percentage();
1614
+
1615
+ // First, let's handle the initial payment.
1616
+ if ( ! empty( $morder->InitialPayment ) ) {
1617
+ $initial_subtotal = $morder->InitialPayment;
1618
+ $initial_tax = $morder->getTaxForPrice( $initial_subtotal );
1619
+ $initial_payment_amount = pmpro_round_price( (float) $initial_subtotal + (float) $initial_tax );
1620
+ $initial_payment_price = $stripe->get_price_for_product( $product_id, $initial_payment_amount );
1621
+ if ( is_string( $initial_payment_price ) ) {
1622
+ // There was an error getting the price.
1623
+ pmpro_setMessage( __( 'Could not get price for initial payment. ', 'paid-memberships-pro' ) . $initial_payment_price, 'pmpro_error', true );
1624
+ return;
1625
+ }
1626
+ $line_items[] = array(
1627
+ 'price' => $initial_payment_price->id,
1628
+ 'quantity' => 1,
1629
+ );
1630
+ if ( ! empty( $application_fee_percentage ) ) {
1631
+ $application_fee = floor( $initial_payment_price->unit_amount * $application_fee_percentage / 100 );
1632
+ if ( ! empty( $application_fee ) ) {
1633
+ $payment_intent_data = array(
1634
+ 'application_fee_amount' => $application_fee,
1635
+ );
1636
+ }
1637
+ }
1638
+ }
1639
+
1640
+ // Now, let's handle the recurring payments.
1641
+ if ( pmpro_isLevelRecurring( $morder->membership_level ) ) {
1642
+ $recurring_subtotal = $morder->PaymentAmount;
1643
+ $recurring_tax = $morder->getTaxForPrice( $recurring_subtotal );
1644
+ $recurring_payment_amount = pmpro_round_price( (float) $recurring_subtotal + (float) $recurring_tax );
1645
+ $recurring_payment_price = $stripe->get_price_for_product( $product_id, $recurring_payment_amount, $morder->BillingPeriod, $morder->BillingFrequency );
1646
+ if ( is_string( $recurring_payment_price ) ) {
1647
+ // There was an error getting the price.
1648
+ pmpro_setMessage( __( 'Could not get price for recurring payment. ', 'paid-memberships-pro' ) . $recurring_payment_price, 'pmpro_error', true );
1649
+ return;
1650
+ }
1651
+ $line_items[] = array(
1652
+ 'price' => $recurring_payment_price->id,
1653
+ 'quantity' => 1,
1654
+ );
1655
+ $subscription_data = array();
1656
+
1657
+ // Check if we can combine initial and recurring payments.
1658
+ $filtered_trial_period_days = $stripe->calculate_trial_period_days( $morder );
1659
+ if (
1660
+ empty( $order->TrialBillingCycles ) && // Check if there is a trial period.
1661
+ $filtered_trial_period_days === $stripe->calculate_trial_period_days( $morder, false ) && // Check if the trial period is the same as the filtered trial period.
1662
+ ( ! empty( $initial_payment_amount ) && $initial_payment_amount === $recurring_payment_amount ) // Check if the initial payment and recurring payment prices are the same.
1663
+ ) {
1664
+ // We can combine the initial payment and the recurring payment.
1665
+ array_shift( $line_items );
1666
+ $payment_intent_data = null;
1667
+ } else {
1668
+ // We need to set the trial period days and send initial and recurring payments as separate line items.
1669
+ $subscription_data['trial_period_days'] = $filtered_trial_period_days;
1670
+ }
1671
+
1672
+ // Add application fee for Stripe Connect.
1673
+ $application_fee_percentage = self::get_application_fee_percentage();
1674
+ if ( ! empty( $application_fee_percentage ) ) {
1675
+ $subscription_data['application_fee_percent'] = $application_fee_percentage;
1676
+ }
1677
+ }
1678
+
1679
+ // Set up tax and billing addres collection.
1680
+ $automatic_tax = ( ! empty( pmpro_getOption( 'stripe_tax' ) ) && 'no' !== pmpro_getOption( 'stripe_tax' ) ) ? array(
1681
+ 'enabled' => true,
1682
+ ) : array(
1683
+ 'enabled' => false,
1684
+ );
1685
+ $tax_id_collection = ! empty( pmpro_getOption( 'stripe_tax_id_collection_enabled' ) ) ? array(
1686
+ 'enabled' => true,
1687
+ ) : array(
1688
+ 'enabled' => false,
1689
+ );
1690
+ $billing_address_collection = pmpro_getOption( 'stripe_checkout_billing_address' ) ?: 'auto';
1691
+
1692
+ // And let's send 'em to Stripe!
1693
+ $checkout_session_params = array(
1694
+ 'customer' => $customer->id,
1695
+ 'line_items' => $line_items,
1696
+ 'mode' => isset( $subscription_data ) ? 'subscription' : 'payment',
1697
+ 'automatic_tax' => $automatic_tax,
1698
+ 'tax_id_collection' => $tax_id_collection,
1699
+ 'billing_address_collection' => $billing_address_collection,
1700
+ 'customer_update' => array(
1701
+ 'address' => 'auto',
1702
+ 'name' => 'auto'
1703
+ ),
1704
+ 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ),
1705
+ 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ),
1706
+ );
1707
+ if ( ! empty( $subscription_data ) ) {
1708
+ $checkout_session_params['subscription_data'] = $subscription_data;
1709
+ } elseif ( ! empty( $payment_intent_data ) ) {
1710
+ $checkout_session_params['payment_intent_data'] = $payment_intent_data;
1711
+ }
1712
+
1713
+ try {
1714
+ $checkout_session = Stripe_Checkout_Session::create( $checkout_session_params );
1715
+ } catch ( Throwable $th ) {
1716
+ // Error creating checkout session.
1717
+ pmpro_setMessage( __( 'Could not create checkout session. ', 'paid-memberships-pro' ) . $th->getMessage(), 'pmpro_error', true );
1718
+ return;
1719
+ } catch ( Exception $e ) {
1720
+ // Error creating checkout session.
1721
+ pmpro_setMessage( __( 'Could not create checkout session. ', 'paid-memberships-pro' ) . $e->getMessage(), 'pmpro_error', true );
1722
+ return;
1723
+ }
1724
+
1725
+ // Save so that we can confirm the payment later.
1726
+ update_pmpro_membership_order_meta( $morder->id, 'stripe_checkout_session_id', $checkout_session->id );
1727
+ wp_redirect( $checkout_session->url );
1728
+ exit;
1729
+ }
1730
+
1731
+ /**
1732
+ * If using Stripe Checkout, either redirect the user to the Stripe Customer
1733
+ * portal or set up our update billing page with the onsite payment fields.
1734
+ *
1735
+ * @since 2.8
1736
+ */
1737
+ public static function pmpro_billing_preheader_stripe_checkout() {
1738
+ if ( 'portal' === pmpro_getOption( 'stripe_update_billing_flow' ) ) {
1739
+ // Send user to Stripe Customer Portal.
1740
+ $user_order = new MemberOrder();
1741
+ $user_order->getLastMemberOrder( null, array( 'success', 'pending' ) );
1742
+
1743
+ // Check whether the user's most recent order is a Stripe subscription.
1744
+ if ( empty( $user_order->gateway ) || 'stripe' !== $user_order->gateway ) {
1745
+ $error = __( 'Last order was not charged with Stripe.', 'paid-memberships-pro' );
1746
+ }
1747
+
1748
+ if ( empty( $error ) ) {
1749
+ $stripe = new PMProGateway_stripe();
1750
+ $customer = $stripe->get_customer_for_user( $user_order->user_id );
1751
+ if ( empty( $customer->id ) ) {
1752
+ $error = __( 'Could not get Stripe customer for user.', 'paid-memberships-pro' );
1753
+ }
1754
+ }
1755
+
1756
+ if ( empty( $error ) ) {
1757
+ $customer_portal_url = $stripe->get_customer_portal_url( $customer->id );
1758
+ if ( ! empty( $customer_portal_url ) ) {
1759
+ wp_redirect( $customer_portal_url );
1760
+ exit;
1761
+ }
1762
+ $error = __( 'Could not get Customer Portal URL. This feature may not be set up in Stripe.', 'paid-memberships-pro' );
1763
+ }
1764
+
1765
+ // There must have been an error while getting the customer portal URL. Show an error and let user update
1766
+ // their billing info onsite.
1767
+ pmpro_setMessage( $error . ' ' . __( 'Please contact the site administrator.', 'paid-memberships-pro' ), 'pmpro_alert', true );
1768
+ }
1769
+ // Disable Stripe Checkout functionality for the rest of this page load.
1770
+ add_filter( 'pmpro_include_cardtype_field', array(
1771
+ 'PMProGateway_stripe',
1772
+ 'pmpro_include_billing_address_fields'
1773
+ ), 15 );
1774
+ add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ), 15 );
1775
+ add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ), 15 );
1776
+ add_filter( 'pmpro_include_payment_information_fields', array(
1777
+ 'PMProGateway_stripe',
1778
+ 'pmpro_include_payment_information_fields'
1779
+ ), 15 );
1780
+ add_filter( 'option_pmpro_stripe_payment_flow', '__return_false' ); // Disable Stripe Checkout for rest of page load.
1781
+ }
1782
+
1783
  /****************************************
1784
  ************ PUBLIC METHODS ************
1785
  ****************************************/
1789
  * @since 1.4
1790
  */
1791
  public function process( &$order ) {
1792
+ if ( self::using_stripe_checkout() ) {
1793
+ // If using Stripe Checkout, we will try to collect the payment later.
1794
+ return true;
1795
+ }
1796
+
1797
  $payment_transaction_id = '';
1798
  $subscription_transaction_id = '';
1799
 
1840
  $payment_method = $this->get_payment_method( $order );
1841
  if ( empty( $payment_method ) ) {
1842
  // There was an issue getting the payment method.
1843
+ $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' : ' ' . $order->error;
1844
  $order->shorterror = $order->error;
1845
  return false;
1846
  }
1882
  }
1883
  $order->stripe_subscription = $subscription;
1884
  $setup_intent = $subscription->pending_setup_intent;
1885
+
1886
  if ( ! empty( $setup_intent->status ) && 'requires_action' === $setup_intent->status ) {
1887
  // We will need to reload the page to authenticate, so save the subscription ID in the setup intent
1888
  // so that we don't lose it.
1895
  $order->stripe_setup_intent = $setup_intent;
1896
  $order->errorcode = true;
1897
  $order->error = __( 'Customer authentication is required to finish setting up your subscription. Please complete the verification steps issued by your payment provider.', 'paid-memberships-pro' );
1898
+
1899
  return false;
1900
  }
1901
 
2026
  ! empty( $user->pmpro_bcity ) &&
2027
  ! empty( $user->pmpro_bstate ) &&
2028
  ! empty( $user->pmpro_bzipcode ) &&
2029
+ ! empty( $user->pmpro_bcountry )
2030
  ) {
2031
  // We have an address in user meta and there is
2032
  // no address in Stripe. May as well send it.
2069
  */
2070
  public function getSubscriptionStatus( &$order ) {
2071
  $subscription = $this->get_subscription( $order->subscription_transaction_id );
2072
+
2073
  if ( ! empty( $subscription ) ) {
2074
  return $subscription->status;
2075
  } else {
2093
  $payment_method = $this->get_payment_method( $order );
2094
  if ( empty( $payment_method ) ) {
2095
  // There was an issue getting the payment method.
2096
+ $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' : ' ' . $order->error;
2097
  $order->shorterror = $order->error;
2098
  return false;
2099
  }
2168
  }
2169
  }
2170
 
2171
+ /**
2172
+ * Get the URL for a customer's Stripe Customer Portal.
2173
+ *
2174
+ * @since 2.8
2175
+ *
2176
+ * @param string $customer_id Customer to get the URL for.
2177
+ * @return string URL for customer portal, or empty String if not found.
2178
+ */
2179
+ public function get_customer_portal_url( $customer_id ) {
2180
+ try {
2181
+ $session = \Stripe\BillingPortal\Session::create([
2182
+ 'customer' => $customer_id,
2183
+ 'return_url' => pmpro_url( 'account' ),
2184
+ ]);
2185
+ return $session->url;
2186
+ } catch ( Exception $e ) {
2187
+ return '';
2188
+ }
2189
+ }
2190
+
2191
 
2192
  /****************************************
2193
  *********** PRIVATE METHODS ************
2201
  * @param array $values Current settings.
2202
  * @param string $gateway currently being shown.
2203
  */
2204
+ private function show_connect_payment_option_fields( $livemode, $values, $gateway ) {
2205
  $gateway_environment = $this->gateway_environment;
2206
 
2207
  $stripe_legacy_key = $values['stripe_publishablekey'];
2226
  <h2>
2227
  <?php esc_html_e( 'Stripe Connect Settings', 'paid-memberships-pro' ); ?>
2228
  <span class="pmpro_gateway-mode pmpro_gateway-mode-<?php echo $environment2; ?> <?php esc_attr_e( $connection_selector ); ?>">
2229
+ <?php
2230
  echo ( $livemode ? esc_html__( 'Live Mode:', 'paid-memberships-pro' ) : esc_html__( 'Test Mode:', 'paid-memberships-pro' ) ) . ' ';
2231
  if ( self::has_connect_credentials( $environment ) ) {
2232
  esc_html_e( 'Connected', 'paid-memberships-pro' );
2306
  } else {
2307
  esc_html_e( 'Note: You are using the free Stripe payment gateway integration. This includes an additional 1% fee for payment processing. This fee is removed by activating a premium PMPro license.', 'paid-memberships-pro');
2308
  }
2309
+ echo ' <a href="https://www.paidmembershipspro.com/gateway/stripe/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=gateways&utm_content=stripe-fees#tab-fees" target="_blank" rel="noopener noreferrer">' . esc_html__( 'Learn More &raquo;', 'paid-memberships-pro' ) . '</a>';
2310
  ?>
2311
  </p>
2312
  <input type='hidden' name='<?php echo $environment; ?>_stripe_connect_user_id' id='<?php echo $environment; ?>_stripe_connect_user_id' value='<?php echo esc_attr( $values[ $environment . '_stripe_connect_user_id'] ) ?>'/>
2474
  ! empty( $order->billing->city ) &&
2475
  ! empty( $order->billing->state ) &&
2476
  ! empty( $order->billing->zip ) &&
2477
+ ! empty( $order->billing->country )
2478
  ) {
2479
  // We collected a billing address at checkout.
2480
  // Send it to Stripe.
2492
  ! empty( $user->pmpro_bcity ) &&
2493
  ! empty( $user->pmpro_bstate ) &&
2494
  ! empty( $user->pmpro_bzipcode ) &&
2495
+ ! empty( $user->pmpro_bcountry )
2496
  ) {
2497
  // We have an address in user meta and there is
2498
  // no address in Stripe. May as well send it.
2550
  }
2551
  add_action( "user_register", "pmpro_user_register_stripe_customerid" );
2552
  }
2553
+ } else {
2554
+ // User already exists. Update their Stripe customer ID.
2555
+ update_user_meta( $user_id, 'pmpro_stripe_customerid', $customer->id );
2556
  }
2557
 
2558
  /**
2596
  return $customer;
2597
  }
2598
 
2599
+ /**
2600
  * Convert a price to a positive integer in cents (or 0 for a free price)
2601
  * representing how much to charge. This is how Stripe wants us to send price amounts.
2602
  *
2604
  * @return integer
2605
  */
2606
  private function convert_price_to_unit_amount( $price ) {
2607
+ $price_info = pmpro_get_price_info( $price );
 
2608
 
2609
+ if ( ! $price_info ) {
2610
+ return 0;
 
 
 
 
 
2611
  }
2612
 
2613
+ return $price_info['amount_flat'];
2614
  }
2615
 
2616
  /**
2738
  $currency = pmpro_get_currency();
2739
 
2740
  $is_recurring = ! empty( $cycle_period ) && ! empty( $cycle_number );
2741
+
2742
+ $unit_amount = $this->convert_price_to_unit_amount( $amount );
2743
+
2744
  $cycle_period = strtolower( $cycle_period );
2745
 
2746
+ // Only for use with Stripe Checkout.
2747
+ $tax_behavior = pmpro_getOption( 'stripe_tax' );
2748
+ if ( ! self::using_stripe_checkout() || empty( $tax_behavior ) ) {
2749
+ $tax_behavior = 'no';
2750
+ }
2751
+
2752
  $price_search_args = array(
2753
  'product' => $product_id,
2754
  'type' => $is_recurring ? 'recurring' : 'one_time',
2761
 
2762
  try {
2763
  $prices = Stripe_Price::all( $price_search_args );
 
 
 
 
 
 
 
 
 
 
 
 
2764
  } catch (\Throwable $th) {
2765
  // There was an error listing prices.
2766
+ return $th->getMessage();;
2767
  } catch (\Exception $e) {
2768
  // There was an error listing prices.
2769
  return $e->getMessage();
2770
  }
2771
+ foreach ( $prices as $price ) {
2772
+ // Check whether price is the same. If not, continue.
2773
+ if ( intval( $price->unit_amount ) !== intval( $unit_amount ) ) {
2774
+ continue;
2775
+ }
2776
+ // Check if recurring structure is the same. If not, continue.
2777
+ if ( $is_recurring && ( empty( $price->recurring->interval_count ) || intval( $price->recurring->interval_count ) !== intval( $cycle_number ) ) ) {
2778
+ continue;
2779
+ }
2780
+ // Check if tax is enabled and set up correctly. If not, continue.
2781
+ if ( 'no' !== $tax_behavior && $price->tax_behavior !== $tax_behavior ) {
2782
+ continue;
2783
+ }
2784
+ return $price;
2785
+ }
2786
 
2787
  // Create a new Price.
2788
  $price_args = array(
2789
  'product' => $product_id,
2790
  'currency' => strtolower( $pmpro_currency ),
2791
+ 'unit_amount' => $unit_amount,
2792
  );
2793
  if ( $is_recurring ) {
2794
  $price_args['recurring'] = array(
2796
  'interval_count' => $cycle_number
2797
  );
2798
  }
2799
+ if ( 'no' !== $tax_behavior ) {
2800
+ $price_args['tax_behavior'] = $tax_behavior;
2801
+ }
2802
 
2803
  try {
2804
  $price = Stripe_Price::create( $price_args );
2822
  * @since 2.7.0.
2823
  *
2824
  * @param MemberOrder $order to calculate trial period days for.
2825
+ * @param bool $filtered whether to filter the result.
2826
  * @return int trial period days.
2827
  */
2828
+ private function calculate_trial_period_days( $order, $filtered = true ) {
2829
  // Use a trial period to set the first recurring payment date.
2830
  if ( $order->BillingPeriod == "Year" ) {
2831
  $trial_period_days = $order->BillingFrequency * 365; //annual
2846
  $order->ProfileStartDate = date_i18n( "Y-m-d\TH:i:s", strtotime( "+ " . $trial_period_days . " Day", current_time( "timestamp" ) ) );
2847
 
2848
  //filter the start date
2849
+ if ( $filtered ) {
2850
+ $order->ProfileStartDate = apply_filters( "pmpro_profile_start_date", $order->ProfileStartDate, $order );
2851
+ }
2852
 
2853
  //convert back to days
2854
  $trial_period_days = ceil( abs( strtotime( date_i18n( "Y-m-d\TH:i:s" ), current_time( "timestamp" ) ) - strtotime( $order->ProfileStartDate, current_time( "timestamp" ) ) ) / 86400 );
2888
  $subscription_params = array(
2889
  'customer' => $customer_id,
2890
  'items' => array(
2891
+ array( 'price' => $price->id ),
2892
  ),
2893
  'trial_period_days' => $trial_period_days,
2894
  'expand' => array(
3099
  $current_month = date_i18n( 'm' );
3100
  ?>
3101
  <h3><?php esc_html_e( 'Subscription Updates', 'paid-memberships-pro' ); ?></h3>
3102
+ <p><?php esc_html_e( 'Subscription updates will be deprecated in a future version of PMPro, though your existing subscription updates will still trigger as expected. We now instead recommend updating the subscription directly in Stripe.', 'paid-memberships-pro' ); ?></p>
3103
  <table class="form-table">
3104
  <input type='hidden' name='pmpro_subscription_updates_visible' value='1' />
3105
  <tr>
3188
  <?php
3189
  }
3190
 
 
 
3191
  /****************************************
3192
  ******* METHODS BECOMING PRIVATE *******
3193
  ****************************************/
3194
  /**
3195
  * Get available webhooks
3196
+ *
3197
  * @since 2.4
3198
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3199
  */
3217
  } catch (\Exception $e) {
3218
  $webhooks = $e->getMessage();
3219
  }
3220
+
3221
  return $webhooks;
3222
  }
3223
 
3224
  /**
3225
  * Get current webhook URL for website to compare.
3226
+ *
3227
  * @since 2.4
3228
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3229
  */
3235
 
3236
  /**
3237
  * List of current enabled events required for PMPro to work.
3238
+ *
3239
  * @since 2.4
3240
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3241
  */
3242
  public static function webhook_events() {
3243
  // Show deprecation warning if called publically.
3244
  pmpro_method_should_be_private( '2.7.0' );
3245
+
3246
+ $events = array(
3247
  'invoice.payment_succeeded',
3248
  'invoice.payment_action_required',
3249
  'customer.subscription.deleted',
3250
+ 'charge.failed',
3251
+ 'charge.refunded',
3252
+ );
3253
+
3254
+ if ( self::using_stripe_checkout() ) {
3255
+ $events[] = 'checkout.session.completed';
3256
+ $events[] = 'checkout.session.async_payment_succeeded';
3257
+ $events[] = 'checkout.session.async_payment_failed';
3258
+ }
3259
+
3260
+ return apply_filters( 'pmpro_stripe_webhook_events', $events );
3261
  }
3262
 
3263
  /**
3264
  * Create webhook with relevant events
3265
+ *
3266
  * @since 2.4
3267
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3268
  */
3287
  //throw $th;
3288
  return new WP_Error( 'error', $e->getMessage() );
3289
  }
3290
+
3291
  }
3292
 
3293
  /**
3294
  * See if a webhook is registered with Stripe.
3295
+ *
3296
  * @since 2.4
3297
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3298
  */
3306
  }
3307
 
3308
  $webhooks = self::get_webhooks();
3309
+
3310
  $webhook_id = false;
3311
  if ( ! empty( $webhooks ) && ! empty( $webhooks['data'] ) ) {
3312
 
3340
 
3341
  /**
3342
  * Get a list of events that are missing between the created existing webhook and required webhook events for Paid Memberships Pro.
3343
+ *
3344
  * @since 2.4
3345
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3346
  */
3354
  // No missing events if webhook event is "All Events" selected.
3355
  if ( is_array( $webhook_events ) && $webhook_events[0] === '*' ) {
3356
  return false;
3357
+ }
3358
 
3359
  if ( count( array_diff( $pmpro_webhook_events, $webhook_events ) ) ) {
3360
  $events = array_unique( array_merge( $pmpro_webhook_events, $webhook_events ) );
3369
 
3370
  /**
3371
  * Update required webhook enabled events.
3372
+ *
3373
  * @since 2.4
3374
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3375
  */
3389
  if ( ! isset( $webhook['enabled_events'] ) ) {
3390
  return;
3391
  }
3392
+
3393
  $events = self::check_missing_webhook_events( $webhook['enabled_events'] );
3394
+
3395
  if ( $events ) {
3396
 
3397
  try {
3398
+ $update = Stripe_Webhook::update(
3399
  $webhook['webhook_id'],
3400
  ['enabled_events' => $events ]
3401
  );
3402
+
3403
  if ( $update ) {
3404
  return $update;
3405
  }
3410
  //throw $th;
3411
  return new WP_Error( 'error', $e->getMessage() );
3412
  }
3413
+
3414
  }
3415
+
3416
  }
3417
 
3418
  /**
3419
  * Delete an existing webhook.
3420
+ *
3421
  * @since 2.4
3422
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3423
  */
3431
  if ( is_array( $webhook_id ) ) {
3432
  $webhook_id = $webhook_id['webhook_id'];
3433
  }
3434
+
3435
  try {
3436
  $stripe = new Stripe_Client( $secretkey );
3437
  $delete = $stripe->webhookEndpoints->delete( $webhook_id, [] );
3576
 
3577
  // get customer
3578
  $customer = $this->update_customer_at_checkout( $order );
3579
+
3580
  if ( empty( $customer ) ) {
3581
  return false;
3582
  }
3583
+
3584
  // get all subscriptions
3585
  if ( ! empty( $customer->subscriptions ) ) {
3586
  $subscriptions = $customer->subscriptions->all();
3587
  }
3588
+
3589
  foreach( $subscriptions as $subscription ) {
3590
  // check if cancelled or expired
3591
  if ( in_array( $subscription->status, array( 'canceled', 'incomplete', 'incomplete_expired' ) ) ) {
3592
  continue;
3593
  }
3594
+
3595
  // check if we have a related order for it
3596
  $one_order = new MemberOrder();
3597
  $one_order->getLastMemberOrderBySubscriptionTransactionID( $subscription->id );
3598
  if ( empty( $one_order ) || empty( $one_order->id ) ) {
3599
  continue;
3600
  }
3601
+
3602
  // update the payment method
3603
  $subscription->default_payment_method = $customer->invoice_settings->default_payment_method;
3604
  $subscription->save();
3871
 
3872
  /**
3873
  * Register domain with Apple Pay.
3874
+ *
3875
  * @since 2.4
3876
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3877
  */
3890
 
3891
  /**
3892
  * See if domain is registered with Apple Pay.
3893
+ *
3894
  * @since 2.4
3895
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3896
  */
3983
  * @deprecated 2.7.0. Only deprecated for public use, will be changed to private non-static in a future version.
3984
  *
3985
  * @param array $params to be sent to Stripe.
 
3986
  * @return array params with application fee if applicable.
3987
  */
3988
  public static function add_application_fee_amount( $params ) {
4024
  pmpro_method_should_be_private( '2.7.0' );
4025
  $secretkey = '';
4026
  if ( self::using_legacy_keys() ) {
4027
+ $secretkey = pmpro_getOption( 'stripe_secretkey' );
4028
  } else {
4029
  $secretkey = pmpro_getOption( 'gateway_environment' ) === 'live'
4030
  ? pmpro_getOption( 'live_stripe_connect_secretkey' )
4044
  pmpro_method_should_be_private( '2.7.0' );
4045
  $publishablekey = '';
4046
  if ( self::using_legacy_keys() ) {
4047
+ $publishablekey = pmpro_getOption( 'stripe_publishablekey' );
4048
  } else {
4049
  $publishablekey = pmpro_getOption( 'gateway_environment' ) === 'live'
4050
  ? pmpro_getOption( 'live_stripe_connect_publishablekey' )
4117
 
4118
  return ( empty( $num_problem_orders ) );
4119
  }
4120
+
4121
  /**
4122
  * Get the date the last webhook was processed.
4123
  * @param environment The gateway environment (live or sandbox) to check for.
4278
  //need to remember the user updates to save later
4279
  global $pmpro_stripe_updates;
4280
  $pmpro_stripe_updates = $new_user_updates;
4281
+
4282
  if( ! function_exists( 'pmpro_user_register_stripe_updates' ) ) {
4283
  function pmpro_user_register_stripe_updates( $user_id ) {
4284
  global $pmpro_stripe_updates;
4729
  return $this->refund( $order, $transaction_id );
4730
  }
4731
 
4732
+ /**
4733
+ * Refunds an order (only supports full amounts)
4734
+ *
4735
+ * @param bool $success Status of the refund (default: false)
4736
+ * @param object $order The Member Order Object
4737
+ * @since 2.8
4738
+ *
4739
+ * @return bool Status of the processed refund
4740
+ */
4741
+ public static function process_refund( $success, $order ) {
4742
+
4743
+ //default to using the payment id from the order
4744
+ if ( !empty( $order->payment_transaction_id ) ) {
4745
+ $transaction_id = $order->payment_transaction_id;
4746
+ }
4747
+
4748
+ //need a transaction id
4749
+ if ( empty( $transaction_id ) ) {
4750
+ return false;
4751
+ }
4752
+
4753
+ //if an invoice ID is passed, get the charge/payment id
4754
+ if ( strpos( $transaction_id, "in_" ) !== false ) {
4755
+ $invoice = Stripe_Invoice::retrieve( $transaction_id );
4756
+
4757
+ if ( ! empty( $invoice ) && ! empty( $invoice->charge ) ) {
4758
+ $transaction_id = $invoice->charge;
4759
+ }
4760
+ }
4761
+
4762
+ $success = false;
4763
+
4764
+ //attempt refund
4765
+ try {
4766
+
4767
+ $secretkey = pmpro_getOption( 'stripe_secretkey' );
4768
+
4769
+ // If they are not using legacy keys, get Stripe Connect keys for the relevant environment.
4770
+ if ( ! self::using_legacy_keys() && empty( $secretkey ) ) {
4771
+ if ( pmpro_getOption( 'gateway_environment' ) === 'live' ) {
4772
+ $secretkey = pmpro_getOption( 'live_stripe_connect_secretkey' );
4773
+ } else {
4774
+ $secretkey = pmpro_getOption( 'sandbox_stripe_connect_secretkey' );
4775
+ }
4776
+ }
4777
+
4778
+ $client = new Stripe_Client( $secretkey );
4779
+ $refund = $client->refunds->create( [
4780
+ 'charge' => $transaction_id,
4781
+ ] );
4782
+
4783
+ //Make sure we're refunding an order that was successful
4784
+ if ( $refund->status != 'failed' ) {
4785
+ $order->status = 'refunded';
4786
+
4787
+ $success = true;
4788
+
4789
+ global $current_user;
4790
+
4791
+ $order->notes = trim( $order->notes.' '.sprintf( __('Admin: Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) );
4792
+
4793
+ $user = get_user_by( 'id', $order->user_id );
4794
+ //send an email to the member
4795
+ $myemail = new PMProEmail();
4796
+ $myemail->sendRefundedEmail( $user, $order );
4797
+
4798
+ //send an email to the admin
4799
+ $myemail = new PMProEmail();
4800
+ $myemail->sendRefundedAdminEmail( $user, $order );
4801
+
4802
+ } else {
4803
+ $order->notes = trim( $order->notes . ' ' . __('Admin: An error occured while attempting to process this refund.', 'paid-memberships-pro' ) );
4804
+ }
4805
+
4806
+ } catch ( \Throwable $e ) {
4807
+ $order->notes = trim( $order->notes . ' ' . __( 'Admin: There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() );
4808
+ } catch ( \Exception $e ) {
4809
+ $order->notes = trim( $order->notes . ' ' . __( 'Admin: There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() );
4810
+ }
4811
+
4812
+ $order->saveOrder();
4813
+
4814
+ return $success;
4815
+ }
4816
+
4817
  /**
4818
  * Refund a payment or invoice
4819
  *
4993
  $amount_tax = $order->getTaxForPrice( $amount );
4994
  $amount = pmpro_round_price( (float) $amount + (float) $amount_tax );
4995
 
4996
+
4997
  $trial_period_days = $this->calculate_trial_period_days( $order );
4998
  // Save $trial_period_days to order for now too.
4999
  $order->TrialPeriodDays = $trial_period_days;
5026
 
5027
  return $order->plan;
5028
  }
 
 
5029
  }
classes/gateways/class.pmprogateway_twocheckout.php CHANGED
@@ -9,8 +9,15 @@
9
  {
10
  function __construct($gateway = NULL)
11
  {
12
- if(!class_exists("Twocheckout"))
13
- require_once(dirname(__FILE__) . "/../../includes/lib/Twocheckout/Twocheckout.php");
 
 
 
 
 
 
 
14
 
15
  //set API connection vars
16
  Twocheckout::sellerId(pmpro_getOption('twocheckout_accountnumber'));
@@ -117,7 +124,7 @@
117
  </tr>
118
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
119
  <th scope="row" valign="top">
120
- <label for="twocheckout_apiusername"><?php _e('API Username', 'paid-memberships-pro' );?>:</label>
121
  </th>
122
  <td>
123
  <input type="text" id="twocheckout_apiusername" name="twocheckout_apiusername" value="<?php echo esc_attr($values['twocheckout_apiusername'])?>" class="regular-text code" />
@@ -126,7 +133,7 @@
126
  </tr>
127
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
128
  <th scope="row" valign="top">
129
- <label for="twocheckout_apipassword"><?php _e('API Password', 'paid-memberships-pro' );?>:</label>
130
  </th>
131
  <td>
132
  <input type="text" id="twocheckout_apipassword" name="twocheckout_apipassword" value="<?php echo esc_attr($values['twocheckout_apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
@@ -135,29 +142,29 @@
135
  </tr>
136
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
137
  <th scope="row" valign="top">
138
- <label for="twocheckout_accountnumber"><?php _e('Account Number', 'paid-memberships-pro' );?>:</label>
139
  </th>
140
  <td>
141
- <input type="text" name="twocheckout_accountnumber" value="<?php echo $values['twocheckout_accountnumber']?>" class="regular-text code" />
142
  <p class="description"><?php esc_html_e( 'Click on the profile icon in 2Checkout to find your Account Number.', 'paid-memberships-pro' ); ?></p>
143
  </td>
144
  </tr>
145
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
146
  <th scope="row" valign="top">
147
- <label for="twocheckout_secretword"><?php _e('Secret Word', 'paid-memberships-pro' );?>:</label>
148
  </th>
149
  <td>
150
- <input type="text" name="twocheckout_secretword" size="60" value="<?php echo $values['twocheckout_secretword']?>" />
151
- <p class="description"><?php _e('Go to Account &raquo; Site Management. Look under Checkout Options to find the Secret Word.', 'paid-memberships-pro' ); ?></p>
152
  </td>
153
  </tr>
154
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
155
  <th scope="row" valign="top">
156
- <label><?php _e('TwoCheckout INS URL', 'paid-memberships-pro' );?>:</label>
157
  </th>
158
  <td>
159
- <p><?php _e('To fully integrate with 2Checkout, be sure to use the following for your INS URL and Approved URL', 'paid-memberships-pro' );?></p>
160
- <p><code><?php echo admin_url("admin-ajax.php") . "?action=twocheckout-ins";?></code></p>
161
 
162
  </td>
163
  </tr>
@@ -289,11 +296,10 @@
289
 
290
  // Recurring membership
291
  if( pmpro_isLevelRecurring( $order->membership_level ) ) {
292
- $tco_args['li_0_startup_fee'] = number_format($initial_payment - $amount, 2, ".", ""); //negative amount for lower initial payments
293
- $recurring_payment = number_format($order->membership_level->billing_amount, 2, ".", "");
294
- $recurring_payment_tax = number_format($order->getTaxForPrice($recurring_payment), 2, ".", "");
295
- $recurring_payment = number_format(pmpro_round_price((float)$recurring_payment + (float)$recurring_payment_tax), 2, ".", "");
296
- $tco_args['li_0_price'] = number_format($recurring_payment, 2, ".", "");
297
 
298
  $tco_args['li_0_recurrence'] = ( $order->BillingFrequency == 1 ) ? $order->BillingFrequency . ' ' . $order->BillingPeriod : $order->BillingFrequency . ' ' . $order->BillingPeriod;
299
 
@@ -304,7 +310,7 @@
304
  }
305
  // Non-recurring membership
306
  else {
307
- $tco_args['li_0_price'] = number_format($initial_payment, 2, ".", "");
308
  }
309
 
310
  // Demo mode?
@@ -325,8 +331,8 @@
325
  if(!empty($order->TrialBillingPeriod)) {
326
  $trial_amount = $order->TrialAmount;
327
  $trial_tax = $order->getTaxForPrice($trial_amount);
328
- $trial_amount = pmpro_formatPrice(pmpro_round_price((float)$trial_amount + (float)$trial_tax), false, false);
329
- $tco_args['li_0_startup_fee'] = $trial_amount; // Negative trial amount
330
  }
331
 
332
  $ptpStr = '';
9
  {
10
  function __construct($gateway = NULL)
11
  {
12
+ if ( ! class_exists( "Twocheckout" ) ) {
13
+ require_once( dirname(__FILE__) . "/../../includes/lib/Twocheckout/Twocheckout.php" );
14
+ } else {
15
+ // Another plugin may have loaded the 2Checkout library already.
16
+ // Let's log the current 2Checkout Library info so that we know
17
+ // where to look if we need to troubleshoot library conflicts.
18
+ $previously_loaded_class = new \ReflectionClass( 'Twocheckout' );
19
+ pmpro_track_library_conflict( 'twocheckout', $previously_loaded_class->getFileName(), Twocheckout::VERSION );
20
+ }
21
 
22
  //set API connection vars
23
  Twocheckout::sellerId(pmpro_getOption('twocheckout_accountnumber'));
124
  </tr>
125
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
126
  <th scope="row" valign="top">
127
+ <label for="twocheckout_apiusername"><?php esc_html_e('API Username', 'paid-memberships-pro' );?>:</label>
128
  </th>
129
  <td>
130
  <input type="text" id="twocheckout_apiusername" name="twocheckout_apiusername" value="<?php echo esc_attr($values['twocheckout_apiusername'])?>" class="regular-text code" />
133
  </tr>
134
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
135
  <th scope="row" valign="top">
136
+ <label for="twocheckout_apipassword"><?php esc_html_e('API Password', 'paid-memberships-pro' );?>:</label>
137
  </th>
138
  <td>
139
  <input type="text" id="twocheckout_apipassword" name="twocheckout_apipassword" value="<?php echo esc_attr($values['twocheckout_apipassword'])?>" autocomplete="off" class="regular-text code pmpro-admin-secure-key" />
142
  </tr>
143
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
144
  <th scope="row" valign="top">
145
+ <label for="twocheckout_accountnumber"><?php esc_html_e('Account Number', 'paid-memberships-pro' );?>:</label>
146
  </th>
147
  <td>
148
+ <input type="text" name="twocheckout_accountnumber" value="<?php echo esc_attr( $values['twocheckout_accountnumber'] ) ?>" class="regular-text code" />
149
  <p class="description"><?php esc_html_e( 'Click on the profile icon in 2Checkout to find your Account Number.', 'paid-memberships-pro' ); ?></p>
150
  </td>
151
  </tr>
152
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
153
  <th scope="row" valign="top">
154
+ <label for="twocheckout_secretword"><?php esc_html_e('Secret Word', 'paid-memberships-pro' );?>:</label>
155
  </th>
156
  <td>
157
+ <input type="text" name="twocheckout_secretword" size="60" value="<?php echo esc_attr( $values['twocheckout_secretword'] ) ?>" />
158
+ <p class="description"><?php esc_html_e('Go to Account &raquo; Site Management. Look under Checkout Options to find the Secret Word.', 'paid-memberships-pro' ); ?></p>
159
  </td>
160
  </tr>
161
  <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
162
  <th scope="row" valign="top">
163
+ <label><?php esc_html_e('TwoCheckout INS URL', 'paid-memberships-pro' );?>:</label>
164
  </th>
165
  <td>
166
+ <p><?php esc_html_e('To fully integrate with 2Checkout, be sure to use the following for your INS URL and Approved URL', 'paid-memberships-pro' );?></p>
167
+ <p><code><?php echo esc_html( admin_url("admin-ajax.php?action=twocheckout-ins" ) ); ?></code></p>
168
 
169
  </td>
170
  </tr>
296
 
297
  // Recurring membership
298
  if( pmpro_isLevelRecurring( $order->membership_level ) ) {
299
+ $tco_args['li_0_startup_fee'] = pmpro_round_price_as_string( $initial_payment - $amount ); //negative amount for lower initial payments
300
+ $recurring_payment = (float) $order->membership_level->billing_amount;
301
+ $recurring_payment_tax = (float) $order->getTaxForPrice( $recurring_payment );
302
+ $tco_args['li_0_price'] = pmpro_round_price_as_string( $recurring_payment + $recurring_payment_tax );
 
303
 
304
  $tco_args['li_0_recurrence'] = ( $order->BillingFrequency == 1 ) ? $order->BillingFrequency . ' ' . $order->BillingPeriod : $order->BillingFrequency . ' ' . $order->BillingPeriod;
305
 
310
  }
311
  // Non-recurring membership
312
  else {
313
+ $tco_args['li_0_price'] = pmpro_round_price_as_string( $initial_payment );
314
  }
315
 
316
  // Demo mode?
331
  if(!empty($order->TrialBillingPeriod)) {
332
  $trial_amount = $order->TrialAmount;
333
  $trial_tax = $order->getTaxForPrice($trial_amount);
334
+ $trial_amount = (float) $trial_amount + (float) $trial_tax;
335
+ $tco_args['li_0_startup_fee'] = pmpro_round_price_as_string( $trial_amount ); // Negative trial amount
336
  }
337
 
338
  $ptpStr = '';
css/admin-rtl.css CHANGED
@@ -1,7 +1,3 @@
1
- .pmpro_admin {
2
- background: url(../images/Paid-Memberships-Pro_watermark.png) bottom left no-repeat !important;
3
- }
4
-
5
  .pmpro_admin .pmpro_banner h2 {
6
  float: right;
7
  }
@@ -29,7 +25,7 @@
29
  /* discount levels */
30
 
31
  /* pagination */
32
- div.pmpro_pagination {
33
  float: left;
34
  }
35
 
 
 
 
 
1
  .pmpro_admin .pmpro_banner h2 {
2
  float: right;
3
  }
25
  /* discount levels */
26
 
27
  /* pagination */
28
+ .pmpro_pagination {
29
  float: left;
30
  }
31
 
css/admin.css CHANGED
@@ -6,7 +6,7 @@
6
  border-bottom-width: 1px;
7
  }
8
 
9
- /* icon */
10
  #wp-admin-bar-paid-memberships-pro .ab-item .ab-icon:before {
11
  font-family: "dashicons";
12
  content: "\f307";
@@ -14,63 +14,87 @@
14
  .pmpro_admin tr td .dashicons {
15
  padding-top: 5px;
16
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
  /* header/etc */
19
  .pmpro_admin {
20
- background-image: url(../images/Paid-Memberships-Pro_watermark.png);
21
- background-position: bottom right;
22
- background-repeat: no-repeat;
23
- background-size: 290px 40px;
24
- padding: 1em 0 70px 0;
25
  }
26
- .pmpro_admin .pmpro_banner {
27
- display: grid;
28
- grid-template-areas: "logo meta";
29
- grid-template-columns: 350px auto;
30
  }
31
- .pmpro_admin .pmpro_banner .pmpro_logo {
32
- grid-area: logo;
33
  }
34
- .pmpro_admin .pmpro_banner .pmpro_meta {
35
  align-self: center;
36
- grid-area: meta;
37
  font-size: 16px;
38
  line-height: 1.5;
39
  }
40
- .pmpro_admin .pmpro_banner .pmpro_meta .pmpro_version {
41
- color: #333333;
42
- display: inline-block;
 
 
43
  font-weight: bold;
44
- padding: 5px 10px 5px 5px;
45
  }
46
- .pmpro_admin .pmpro_banner .pmpro_meta a {
47
- border-left: 1px solid #CCC;
48
- padding: 5px 10px;
49
  }
50
- .pmpro_admin .pmpro_banner .pmpro_meta a.pmpro_license_tag {
51
  font-weight: bold;
52
- padding: 5px 10px 5px 5px;
53
  text-decoration: none;
54
  }
55
- .pmpro_admin .pmpro_banner .pmpro_meta a.pmpro_license_tag:before {
56
- bottom: 7px;
57
  display: inline-block;
58
  font: 400 20px/1 dashicons;
59
  left: 0;
60
  position: relative;
61
  text-decoration: none;
62
- vertical-align: bottom;
63
  }
64
- .pmpro_admin .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-valid {
65
  color: rgb( 70, 180, 80 );
66
  }
67
- .pmpro_admin .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-valid:before {
68
  content: "\f147";
69
  }
70
- .pmpro_admin .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-invalid {
71
  color: #AAA;
72
  }
73
- .pmpro_admin .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-invalid:before {
74
  content: "\f335";
75
  }
76
 
@@ -92,6 +116,10 @@
92
  max-width: 200px;
93
  height: auto;
94
  }
 
 
 
 
95
 
96
  /* Scollable Boxes */
97
  .pmpro_scrollable {
@@ -170,6 +198,18 @@
170
  background-color: #f6f7f7;
171
  }
172
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  /* levels */
174
  .memberships_page_pmpro-membershiplevels .pmpro_admin #posts-filter p.search-box {
175
  margin: 2em 0 1em 0;
@@ -217,36 +257,37 @@
217
  }
218
 
219
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode {
220
- border: 1px solid;
221
  border-radius: 3px;
222
  display: inline-block;
223
- font-size: 75%;
 
224
  margin-left: 5px;
225
- padding: 3px 5px;
226
  }
227
 
228
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-live {
229
- background-color: #edfaef;
230
- border-color: #00a32a;
231
- color: #00a32a;
232
  }
233
 
234
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-live.pmpro_gateway-mode-not-connected {
235
- background-color: #fcf0f1;
236
- border-color: #d63638;
237
- color: #d63638;
238
  }
239
 
240
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-test {
241
- background-color: #fcf9e8;
242
- border-color: #dba617;
243
- color: #dba617;
244
  }
245
 
246
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-test.pmpro_gateway-mode-not-connected {
247
- background-color: #f9f3d3;
248
- border-color: #d59a13;
249
- color: #d59a13;
250
  }
251
 
252
  .admin_page_pmpro-paymentsettings .pmpro-stripe-connect {
@@ -369,6 +410,62 @@
369
  .memberships_page_pmpro-orders .pmpro_admin .nav-tab-wrapper {
370
  margin-bottom: 10px;
371
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
 
373
  /* members list */
374
  .wp-list-table.members .column-ID {
@@ -385,42 +482,41 @@ tr.pmpro_settings_divider td {
385
  }
386
 
387
  /* admin pages */
388
- .pmpro_admin_section-email-templates-content .pmpro-email-templates-variable-reference .form-table td {
389
- padding: 5px;
390
- }
391
- .pmpro_admin_section-email-templates-content .pmpro-email-templates-variable-reference .form-table .widefat {
392
- margin-bottom: 20px;
393
  }
394
 
395
  /* messages */
396
  .pmpro_admin .pmpro_message {
397
  background: #FFF;
398
  border-left: 4px solid #FFF;
 
399
  margin-right: 15px;
400
  padding: 15px;
401
  }
402
  .pmpro_admin .pmpro_success {
403
- background-color: rgba( 70, 180, 80, 0.1 );
404
- border-left-color: rgb( 70, 180, 80 );
405
  }
406
  .pmpro_admin .pmpro_error,
407
  .pmpro_admin tr.pmpro_error td {
408
- background-color: rgba( 220, 50, 50, 0.1 );
409
- border-left-color: rgb( 220, 50, 50 );
410
  }
411
  .pmpro_admin .pmpro_alert {
412
- background-color: rgba( 255, 185, 0, 0.1 );
413
- border-left-color: rgb( 255, 185, 0 );
414
  }
415
  .pmpro_admin .pmpro_success a {
416
- color: #208A1B;
417
  }
418
  .pmpro_admin .pmpro_error a,
419
  .pmpro_admin tr.pmpro_error td {
420
- color: #CC0000;
421
  }
422
  .pmpro_admin .pmpro_alert a {
423
- color: #CF8516;
424
  }
425
 
426
  /* notifications */
@@ -487,37 +583,37 @@ tr.pmpro_alert {
487
  }
488
 
489
  /* pagination */
490
- div.pmpro_pagination {
491
- padding: 3px;
492
- margin: 5px 0px 5px 0px;
493
- font-size: 10px;
494
- float: right;
495
- }
496
- div.pmpro_pagination a {
497
- padding: 2px 5px 2px 5px;
498
- margin: 1px;
499
- border: 1px solid #666;
 
 
 
500
  text-decoration: none;
501
- /* no underline */ color: #666;
502
- background: #EEE;
503
  }
504
- div.pmpro_pagination a:hover, div.pmpro_pagination a:active {
505
- background: #FFF;
 
 
 
506
  }
507
- div.pmpro_pagination span.current {
508
- border: 1px solid #FFF;
 
509
  color: #FFF;
510
- background: #666;
511
- padding: 2px 5px 2px 5px;
512
- margin: 1px;
513
- font-weight: bold;
514
  }
515
- div.pmpro_pagination span.disabled {
516
- padding: 2px 5px 2px 5px;
517
- margin: 2px;
518
- border: 1px solid #BBB;
519
- color: #BBB;
520
- background: #EFEFEF;
521
  }
522
 
523
  p.pmpro_meta_notice {
@@ -616,6 +712,9 @@ p.pmpro_meta_notice {
616
  .memberships_page_pmpro-license .pmpro_icon {
617
  margin-top: 20px;
618
  }
 
 
 
619
 
620
  /* misc */
621
  .pmpro_lite {
@@ -644,13 +743,9 @@ h2.nav-tab-wrapper {
644
  .memberships_page_pmpro-reports .pmpro_admin .nav-tab-wrapper {
645
  margin-bottom: 10px;
646
  }
647
- .pmpro_reports-holder { }
648
- .pmpro_reports-holder .postbox h2 {
649
- border-bottom: 1px solid #eee;
650
- font-size: 14px;
651
- padding: 8px 12px;
652
- margin: 0;
653
- line-height: 1.4;
654
  }
655
  .pmpro_clickable {
656
  cursor: pointer;
@@ -717,6 +812,7 @@ button.pmpro_report_th_closed:before {
717
  background-color: #f6f7f7;
718
  }
719
  .pmpro_report-holder .pmpro_report-button {
 
720
  text-align: center;
721
  }
722
  .pmpro_chart_area {
6
  border-bottom-width: 1px;
7
  }
8
 
9
+ /* icons */
10
  #wp-admin-bar-paid-memberships-pro .ab-item .ab-icon:before {
11
  font-family: "dashicons";
12
  content: "\f307";
14
  .pmpro_admin tr td .dashicons {
15
  padding-top: 5px;
16
  }
17
+ .pmpro_admin .pmpro-has-icon:before {
18
+ font: normal 16px/1 dashicons;
19
+ margin-right: 8px;
20
+ speak: never;
21
+ vertical-align: middle;
22
+ position: relative;
23
+ top: -2px;
24
+ -webkit-font-smoothing: antialiased;
25
+ -moz-osx-font-smoothing: grayscale;
26
+ }
27
+ .pmpro_admin .pmpro-has-icon-printer:before {
28
+ content: "\f193";
29
+ }
30
+ .pmpro_admin .pmpro-has-icon-email:before {
31
+ content: "\f465";
32
+ }
33
+ .pmpro_admin .pmpro-has-icon-admin-users:before {
34
+ content: "\f110";
35
+ }
36
+ .pmpro_admin .pmpro-has-icon-image-rotate:before {
37
+ content: "\f531";
38
+ }
39
+ .pmpro_admin .pmpro-has-icon-download:before {
40
+ content: "\f316";
41
+ top: 0;
42
+ }
43
+ .pmpro_admin .pmpro-has-icon-plus:before {
44
+ content: "\f132";
45
+ top: 0;
46
+ }
47
 
48
  /* header/etc */
49
  .pmpro_admin {
50
+ padding: 1em 0 0 0;
 
 
 
 
51
  }
52
+ .pmpro_banner {
53
+ display: flex;
54
+ padding: .5em 0;
 
55
  }
56
+ .pmpro_banner .pmpro_logo {
57
+ margin-right: 10px;
58
  }
59
+ .pmpro_banner .pmpro_meta {
60
  align-self: center;
 
61
  font-size: 16px;
62
  line-height: 1.5;
63
  }
64
+ .pmpro_banner .pmpro_meta .pmpro_version {
65
+ background: #DCDCDE;
66
+ color: #555;
67
+ border-radius: 999px;
68
+ font-size: 14px;
69
  font-weight: bold;
70
+ padding: 6px 12px;
71
  }
72
+ .pmpro_banner .pmpro_meta a {
73
+ display: inline-block;
74
+ margin: 0 0 0 10px;
75
  }
76
+ .pmpro_banner .pmpro_meta a.pmpro_license_tag {
77
  font-weight: bold;
 
78
  text-decoration: none;
79
  }
80
+ .pmpro_banner .pmpro_meta a.pmpro_license_tag:before {
 
81
  display: inline-block;
82
  font: 400 20px/1 dashicons;
83
  left: 0;
84
  position: relative;
85
  text-decoration: none;
86
+ vertical-align: middle;
87
  }
88
+ .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-valid {
89
  color: rgb( 70, 180, 80 );
90
  }
91
+ .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-valid:before {
92
  content: "\f147";
93
  }
94
+ .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-invalid {
95
  color: #AAA;
96
  }
97
+ .pmpro_banner .pmpro_meta a.pmpro_license_tag.pmpro_license_tag-invalid:before {
98
  content: "\f335";
99
  }
100
 
116
  max-width: 200px;
117
  height: auto;
118
  }
119
+ .pmpro_admin h2,
120
+ .pmpro_admin h3 {
121
+ font-size: 18px;
122
+ }
123
 
124
  /* Scollable Boxes */
125
  .pmpro_scrollable {
198
  background-color: #f6f7f7;
199
  }
200
 
201
+ /* General admin-area tables styles */
202
+ .pmpro_admin table.wp-list-table thead th {
203
+ padding-left: 1.25em;
204
+ padding-right: 1.25em;
205
+ }
206
+ .pmpro_admin table.wp-list-table tbody td {
207
+ padding: 1.25em;
208
+ }
209
+ .pmpro_admin table.wp-list-table .row-actions {
210
+ color: #999;
211
+ }
212
+
213
  /* levels */
214
  .memberships_page_pmpro-membershiplevels .pmpro_admin #posts-filter p.search-box {
215
  margin: 2em 0 1em 0;
257
  }
258
 
259
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode {
260
+ border: 1px solid transparent;
261
  border-radius: 3px;
262
  display: inline-block;
263
+ font-size: 14px;
264
+ font-weight: 500;
265
  margin-left: 5px;
266
+ padding: .25em .5em;
267
  }
268
 
269
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-live {
270
+ background-color: #d4edda;
271
+ border-color: #c3e6cb;
272
+ color: #0F441C;
273
  }
274
 
275
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-live.pmpro_gateway-mode-not-connected {
276
+ background-color: #f8d7da;
277
+ border-color: #f5c6cb;
278
+ color: #721c24;
279
  }
280
 
281
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-test {
282
+ background-color: #FFF2E0;
283
+ border-color: #F2E5D3;
284
+ color: #6B4201;
285
  }
286
 
287
  .admin_page_pmpro-paymentsettings span.pmpro_gateway-mode-test.pmpro_gateway-mode-not-connected {
288
+ background-color: #FFF8E0;
289
+ border-color: #ffeeba;
290
+ color: #6C5101;
291
  }
292
 
293
  .admin_page_pmpro-paymentsettings .pmpro-stripe-connect {
410
  .memberships_page_pmpro-orders .pmpro_admin .nav-tab-wrapper {
411
  margin-bottom: 10px;
412
  }
413
+ .pmpro_admin .wp-list-table .column-username,
414
+ .pmpro_admin .wp-list-table .column-billing,
415
+ .pmpro_admin .wp-list-table .column-transaction-ids {
416
+ word-break: break-word;
417
+ }
418
+ .pmpro_order-status {
419
+ border: 1px solid transparent;
420
+ border-radius: 5px;
421
+ display: block;
422
+ font-weight: 500;
423
+ padding: .25em .5em;
424
+ text-align: center;
425
+ }
426
+ .pmpro_order-status-success,
427
+ .pmpro_order-status-cancelled {
428
+ background-color: #d4edda;
429
+ border-color: #c3e6cb;
430
+ color: #0F441C;
431
+ }
432
+ .pmpro_order-status-error,
433
+ .pmpro_order-status-refunded {
434
+ background-color: #f8d7da;
435
+ border-color: #f5c6cb;
436
+ color: #721c24;
437
+ }
438
+ .pmpro_order-status-pending,
439
+ .pmpro_order-status-review,
440
+ .pmpro_order-status-token {
441
+ background-color: #FFF8E0;
442
+ border-color: #ffeeba;
443
+ color: #6C5101;
444
+ }
445
+ .wp-list-table .pmpro_order-renewal {
446
+ display: block;
447
+ margin-top: 8px;
448
+ text-align: center;
449
+ }
450
+ a.pmpro_order-renewal {
451
+ color: inherit;
452
+ text-decoration: none;
453
+ }
454
+ .pmpro_order-renewal:before {
455
+ content: "\f113";
456
+ font: normal 12px/1 dashicons;
457
+ margin-right: 3px;
458
+ vertical-align: middle;
459
+ position: relative;
460
+ top: -1px;
461
+ -webkit-font-smoothing: antialiased;
462
+ -moz-osx-font-smoothing: grayscale;
463
+ }
464
+ .memberships_page_pmpro-orders #show_billing_action {
465
+ font-size: 14px;
466
+ font-weight: normal;
467
+ margin-left: 10px;
468
+ }
469
 
470
  /* members list */
471
  .wp-list-table.members .column-ID {
482
  }
483
 
484
  /* admin pages */
485
+ .pmpro_admin_section-email-templates-content .pmpro-email-templates-variable-reference table {
486
+ margin-bottom: 3em;
487
+ max-width: 900px;
 
 
488
  }
489
 
490
  /* messages */
491
  .pmpro_admin .pmpro_message {
492
  background: #FFF;
493
  border-left: 4px solid #FFF;
494
+ color: #3c434a;
495
  margin-right: 15px;
496
  padding: 15px;
497
  }
498
  .pmpro_admin .pmpro_success {
499
+ background-color: #d4edda;
500
+ border-left-color: #c3e6cb;
501
  }
502
  .pmpro_admin .pmpro_error,
503
  .pmpro_admin tr.pmpro_error td {
504
+ background-color: #f8d7da;
505
+ border-left-color: #f5c6cb;
506
  }
507
  .pmpro_admin .pmpro_alert {
508
+ background-color: #FFF8E0;
509
+ border-left-color: #ffeeba;
510
  }
511
  .pmpro_admin .pmpro_success a {
512
+ color: #0F441C;
513
  }
514
  .pmpro_admin .pmpro_error a,
515
  .pmpro_admin tr.pmpro_error td {
516
+ color: #721c24;
517
  }
518
  .pmpro_admin .pmpro_alert a {
519
+ color: #6C5101;
520
  }
521
 
522
  /* notifications */
583
  }
584
 
585
  /* pagination */
586
+ .pmpro_pagination a,
587
+ .pmpro_pagination span.current,
588
+ .pmpro_pagination span.disabled {
589
+ display: inline-block;
590
+ vertical-align: baseline;
591
+ margin: 0 2px;
592
+ padding: 0 8px;
593
+ font-size: 14px;
594
+ line-height: 1.625;
595
+ text-align: center;
596
+ color: #2271b1;
597
+ border: 1px solid #2271b1;
598
+ background: #f6f7f7;
599
  text-decoration: none;
600
+ border-radius: 3px;
 
601
  }
602
+ .pmpro_pagination a:hover,
603
+ .pmpro_pagination a:active {
604
+ background: #f0f0f1;
605
+ border-color: #0a4b78;
606
+ color: #0a4b78;
607
  }
608
+ .pmpro_pagination span.current {
609
+ background: #0a4b78;
610
+ border-color: #0a4b78;
611
  color: #FFF;
 
 
 
 
612
  }
613
+ .pmpro_pagination span.disabled {
614
+ background: #f6f7f7;
615
+ border-color: #dcdcde;
616
+ color: #a7aaad;
 
 
617
  }
618
 
619
  p.pmpro_meta_notice {
712
  .memberships_page_pmpro-license .pmpro_icon {
713
  margin-top: 20px;
714
  }
715
+ .memberships_page_pmpro-license .about-wrap .about-text {
716
+ color: #3c434a;
717
+ }
718
 
719
  /* misc */
720
  .pmpro_lite {
743
  .memberships_page_pmpro-reports .pmpro_admin .nav-tab-wrapper {
744
  margin-bottom: 10px;
745
  }
746
+ .pmpro_report-holder table.wp-list-table thead th,
747
+ .pmpro_report-holder table.wp-list-table tbody td {
748
+ padding: 8px 10px;
 
 
 
 
749
  }
750
  .pmpro_clickable {
751
  cursor: pointer;
812
  background-color: #f6f7f7;
813
  }
814
  .pmpro_report-holder .pmpro_report-button {
815
+ margin-bottom: 0;
816
  text-align: center;
817
  }
818
  .pmpro_chart_area {
css/blocks.editor.css CHANGED
@@ -21,23 +21,27 @@
21
  position: relative;
22
  text-transform: uppercase;
23
  }
 
 
 
 
24
  .pmpro-block-element .components-base-control {
25
  margin-bottom: 16px;
26
  }
27
  .pmpro-block-element .components-base-control .components-select-control {
28
  height: auto;
29
  }
30
- .pmpro-block-element .components-base-control .components-base-control__label {
31
  display: block;
32
  }
33
 
34
  /* Require Membership Block */
35
  .pmpro-block-require-membership-element {
 
36
  border-bottom: 5px solid #8d96a0;
37
  border-top: 5px solid #8d96a0;
38
  }
39
  .pmpro-block-require-membership-element .pmpro-block-title {
40
- background: rgba(237, 239, 240, 0.8);
41
  color: #555d66;
42
  display: block;
43
  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue, sans-serif;
@@ -46,24 +50,36 @@
46
  position: relative;
47
  text-transform: uppercase;
48
  }
49
- .pmpro-block-require-membership-element .components-panel__body {
50
- background: rgba(237, 239, 240, 0);
51
- border-bottom: 0;
 
52
  border-top: none;
53
- border-left: 5px solid rgba(237, 239, 240, 0.8);
54
- border-bottom: 5px solid rgba(237, 239, 240, 0.8);
55
- padding-top: 0;
56
- height: 200px;
57
- overflow: auto;
58
  }
59
  .pmpro-block-require-membership-element .block-editor-inner-blocks {
60
- padding-left: 16px;
61
- padding-right: 16px;
62
  }
63
  .pmpro-block-inspector-scrollable {
64
- height: 200px;
65
  overflow: auto;
66
  }
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
  /* Checkout Button Block */
69
  .wp-block-pmpro-checkout-button {
21
  position: relative;
22
  text-transform: uppercase;
23
  }
24
+ .pmpro-block-element hr {
25
+ margin-bottom: 16px;
26
+ margin-top: 16px;
27
+ }
28
  .pmpro-block-element .components-base-control {
29
  margin-bottom: 16px;
30
  }
31
  .pmpro-block-element .components-base-control .components-select-control {
32
  height: auto;
33
  }
34
+ ..pmpro-block-element .components-base-control .components-base-control__label {
35
  display: block;
36
  }
37
 
38
  /* Require Membership Block */
39
  .pmpro-block-require-membership-element {
40
+ background: rgba(237, 239, 240, 0.8);
41
  border-bottom: 5px solid #8d96a0;
42
  border-top: 5px solid #8d96a0;
43
  }
44
  .pmpro-block-require-membership-element .pmpro-block-title {
 
45
  color: #555d66;
46
  display: block;
47
  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue, sans-serif;
50
  position: relative;
51
  text-transform: uppercase;
52
  }
53
+ .pmpro-block-require-membership-element .components-panel__body,
54
+ .pmpro-block-require-membership-element .components-panel__body.is-opened {
55
+ background: rgba(237, 239, 240, 0.8);
56
+ border-bottom: none;
57
  border-top: none;
58
+ }
59
+ .pmpro-block-require-membership-element .pmpro-block-inspector-scrollable {
60
+ border: 1px solid #CCC;
61
+ margin: 0px 16px 16px 16px;
 
62
  }
63
  .pmpro-block-require-membership-element .block-editor-inner-blocks {
64
+ background-color: #FFF;
65
+ padding: 16px;
66
  }
67
  .pmpro-block-inspector-scrollable {
68
+ height: 170px;
69
  overflow: auto;
70
  }
71
+ .pmpro-block-inspector-scrollable::-webkit-scrollbar {
72
+ background-color: #c3c4c7;
73
+ width: 8px;
74
+ height: 8px;
75
+ }
76
+ .pmpro-block-inspector-scrollable::-webkit-scrollbar-thumb {
77
+ background: #2c3338;
78
+ border-radius: 5px;
79
+ }
80
+ .pmpro-block-inspector-scrollable .components-base-control.components-checkbox-control {
81
+ margin-bottom: 5px;
82
+ }
83
 
84
  /* Checkout Button Block */
85
  .wp-block-pmpro-checkout-button {
includes/compatibility.php CHANGED
@@ -113,4 +113,49 @@ function pmpro_compatibility_checker_themes(){
113
 
114
 
115
  }
116
- add_action( 'after_setup_theme', 'pmpro_compatibility_checker_themes' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
 
114
 
115
  }
116
+ add_action( 'after_setup_theme', 'pmpro_compatibility_checker_themes' );
117
+
118
+ /**
119
+ * Keep track of plugins that load libraries before PMPro loads its version.
120
+ *
121
+ * @param string $name The name of the library.
122
+ * @param string $path The path of the loaded library.
123
+ * @param string $version The version of the loaded library.
124
+ *
125
+ * @since 2.8
126
+ */
127
+ function pmpro_track_library_conflict( $name, $path, $version ) {
128
+ // Ignore when PMPro is trying to load.
129
+ if ( strpos( $path, '/plugins/paid-memberships-pro/' ) !== false ) {
130
+ return;
131
+ }
132
+
133
+ // Use a static var for timestamp so we can avoid multiple updates per pageload.
134
+ static $now = null;
135
+ if ( empty( $now ) ) {
136
+ $now = current_time( 'Y-m-d H:i:s' );
137
+ }
138
+
139
+ // Get the current list of library conflicts.
140
+ $library_conflicts = get_option( 'pmpro_library_conflicts', array() );
141
+
142
+ // Make sure we have an entry for this library.
143
+ if ( ! isset( $library_conflicts[ $name ] ) ) {
144
+ $library_conflicts[ $name ] = array();
145
+ }
146
+
147
+ // Make sure we have an entry for this path.
148
+ if ( ! isset( $library_conflicts[ $name ][ $path ] ) ) {
149
+ $library_conflicts[ $name ][ $path ] = array();
150
+ }
151
+
152
+ // Don't save conflict if no time has passed.
153
+ if ( ! empty( $library_conflicts[ $name ][ $path ]['timestamp'] ) && $library_conflicts[ $name ][ $path ]['timestamp'] === $now ) {
154
+ return;
155
+ }
156
+
157
+ // Update the library conflict information.
158
+ $library_conflicts[ $name ][ $path ]['version'] = $version;
159
+ $library_conflicts[ $name ][ $path ]['timestamp'] = $now;
160
+ update_option( 'pmpro_library_conflicts', $library_conflicts, false );
161
+ }
includes/crons.php ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Functionality related to cron operations.
4
+ *
5
+ * The crons themselves are located in /scheduled/crons.php and in corresponding Add-Ons.
6
+ */
7
+
8
+ /**
9
+ * Get the list of registered crons for Paid Memberships Pro.
10
+ *
11
+ * @since 2.8
12
+ *
13
+ * @return array The list of registered crons for Paid Memberships Pro.
14
+ */
15
+ function pmpro_get_crons() {
16
+ $crons = [
17
+ 'pmpro_cron_expire_memberships' => [
18
+ 'interval' => 'hourly',
19
+ ],
20
+ 'pmpro_cron_expiration_warnings' => [
21
+ 'interval' => 'hourly',
22
+ 'timestamp' => current_time( 'timestamp' ) + 1,
23
+ ],
24
+ 'pmpro_cron_credit_card_expiring_warnings' => [
25
+ 'interval' => 'monthly',
26
+ ],
27
+ 'pmpro_cron_admin_activity_email' => [
28
+ 'interval' => 'daily',
29
+ 'timestamp' => strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ),
30
+ ],
31
+ 'pmpro_license_check_key' => [
32
+ 'interval' => 'monthly',
33
+ ],
34
+ ];
35
+
36
+ /**
37
+ * Allow filtering the list of registered crons for Paid Memberships Pro.
38
+ *
39
+ * @since 2.8
40
+ *
41
+ * @param array $crons The list of registered crons for Paid Memberships Pro.
42
+ */
43
+ $crons = (array) apply_filters( 'pmpro_registered_crons', $crons );
44
+
45
+ // Set up the default information for each cron if not set.
46
+ foreach ( $crons as $hook => $cron ) {
47
+ if ( empty( $cron['timestamp'] ) ) {
48
+ $cron['timestamp'] = current_time( 'timestamp' );
49
+ }
50
+
51
+ if ( empty( $cron['recurrence'] ) ) {
52
+ $cron['recurrence'] = 'hourly';
53
+ }
54
+
55
+ if ( empty( $cron['args'] ) ) {
56
+ $cron['args'] = [];
57
+ }
58
+
59
+ $crons[ $hook ] = $cron;
60
+ }
61
+
62
+ return $crons;
63
+ }
64
+
65
+ /**
66
+ * Maybe schedule our registered crons.
67
+ *
68
+ * @since 2.8
69
+ */
70
+ function pmpro_maybe_schedule_crons() {
71
+ $crons = pmpro_get_crons();
72
+
73
+ foreach ( $crons as $hook => $cron ) {
74
+ pmpro_maybe_schedule_event( $cron['timestamp'], $cron['recurrence'], $hook, $cron['args'] );
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Handle rescheduling Paid Memberships Pro crons when checking for ready cron tasks.
80
+ *
81
+ * @since 2.8
82
+ *
83
+ * @param null|array[] $pre Array of ready cron tasks to return instead. Default null
84
+ * to continue using results from _get_cron_array().
85
+ *
86
+ * @return null|array[] Array of ready cron tasks to return instead. Default null
87
+ * to continue using results from _get_cron_array().
88
+ */
89
+ function pmpro_handle_schedule_crons_on_cron_ready_check( $pre ) {
90
+ pmpro_maybe_schedule_crons();
91
+
92
+ return $pre;
93
+ }
94
+
95
+ add_filter( 'pre_get_ready_cron_jobs', 'pmpro_handle_schedule_crons_on_cron_ready_check' );
96
+
97
+ /**
98
+ * Schedule a periodic event unless one with the same hook is already scheduled.
99
+ *
100
+ * @since 2.8
101
+ *
102
+ * @see wp_schedule_event()
103
+ * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/
104
+ *
105
+ * @param int $timestamp Unix timestamp (UTC) for when to next run the event.
106
+ * @param string $recurrence How often the event should subsequently recur.
107
+ * See wp_get_schedules() for accepted values.
108
+ * @param string $hook Action hook to execute when the event is run.
109
+ * @param array $args Optional. Array containing arguments to pass to the
110
+ * hook's callback function. Each value in the array
111
+ * is passed to the callback as an individual parameter.
112
+ * The array keys are ignored. Default empty array.
113
+ *
114
+ * @return bool|WP_Error True when an event is scheduled, WP_Error on failure, and false if the event was already scheduled.
115
+ */
116
+ function pmpro_maybe_schedule_event( $timestamp, $recurrence, $hook, $args = [] ) {
117
+ $next = wp_next_scheduled( $hook, $args );
118
+
119
+ if ( empty( $next ) ) {
120
+ return wp_schedule_event( $timestamp, $recurrence, $hook, $args, true );
121
+ }
122
+
123
+ return false;
124
+ }
includes/email-templates.php CHANGED
@@ -498,7 +498,37 @@ $pmpro_email_templates_defaults = array(
498
  <p>Log in to your membership account here: !!login_url!!</p>', 'paid-memberships-pro' ),
499
  'help_text' => __( 'This email is sent to the member when the trial portion of their membership level is approaching, at an interval based on the term of the trial.', 'paid-memberships-pro' )
500
  ),
 
 
 
 
501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
502
  );
503
 
504
  // add SCA payment action required emails if we're using PMPro 2.1 or later
498
  <p>Log in to your membership account here: !!login_url!!</p>', 'paid-memberships-pro' ),
499
  'help_text' => __( 'This email is sent to the member when the trial portion of their membership level is approaching, at an interval based on the term of the trial.', 'paid-memberships-pro' )
500
  ),
501
+ 'refund' => array(
502
+ 'subject' => __( 'Your invoice for order #!!invoice_id!! at !!sitename!! has been REFUNDED', 'paid-memberships-pro' ),
503
+ 'description' => __('Refund', 'paid-memberships-pro'),
504
+ 'body' => __( '<p>Your invoice for order #!!invoice_id!! at !!sitename!! has been refunded.</p>
505
 
506
+ <p>Account: !!display_name!! (!!user_email!!)</p>
507
+ <p>
508
+ Invoice #!!invoice_id!! on !!invoice_date!!<br />
509
+ Total Refunded: !!invoice_total!!
510
+ </p>
511
+
512
+ <p>Log in to your membership account here: !!login_url!!</p>
513
+ <p>To view an online version of this invoice, click here: !!invoice_url!!</p>
514
+
515
+ <p>If you did not request this refund and would like more information please contact us at !!siteemail!!</p>', 'paid-memberships-pro' ),
516
+ 'help_text' => __( 'This email is sent to the member as confirmation of a refunded payment. The email is sent after your membership site receives notification of a successful payment refund through your gateway.', 'paid-memberships-pro' )
517
+ ),
518
+ 'refund_admin' => array(
519
+ 'subject' => __( 'Invoice for order #!!invoice_id!! at !!sitename!! has been REFUNDED', 'paid-memberships-pro' ),
520
+ 'description' => __('Refund (admin)', 'paid-memberships-pro'),
521
+ 'body' => __( '<p>The invoice for order #!!invoice_id!! at !!sitename!! has been refunded.</p>
522
+
523
+ <p>Account: !!display_name!! (!!user_email!!)</p>
524
+ <p>
525
+ Invoice #!!invoice_id!! on !!invoice_date!!<br />
526
+ Total Refunded: !!invoice_total!!
527
+ </p>
528
+
529
+ <p>Log in to your WordPress admin here: !!login_url!!</p>', 'paid-memberships-pro' ),
530
+ 'help_text' => __( 'This email is sent to the admin as confirmation of a refunded payment. The email is sent after your membership site receives notification of a successful payment refund through your gateway.', 'paid-memberships-pro' )
531
+ ),
532
  );
533
 
534
  // add SCA payment action required emails if we're using PMPro 2.1 or later
includes/functions.php CHANGED
@@ -48,7 +48,9 @@ function pmpro_is_plugin_active( $plugin ) {
48
  return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
49
  }
50
 
51
- // scraping - override n if you have more than 1 group of matches and don't want the first group
 
 
52
  function pmpro_getMatches( $p, $s, $firstvalue = false, $n = 1 ) {
53
  $ok = preg_match_all( $p, $s, $matches );
54
 
@@ -180,7 +182,9 @@ function pmpro_isLevelFree( &$level ) {
180
  return $r;
181
  }
182
 
183
- // Given an array of levels, will return true if all of them are free.
 
 
184
  function pmpro_areLevelsFree( $levelarr ) {
185
  if ( ! is_array( $levelarr ) ) {
186
  return false; }
@@ -472,7 +476,9 @@ function pmpro_getLevelCost( &$level, $tags = true, $short = false ) {
472
  return $r;
473
  }
474
 
475
- // Similar to pmpro_getLevelCost, but loops through all levels in the incoming array and puts it all together.
 
 
476
  function pmpro_getLevelsCost( &$levels, $tags = true, $short = false ) {
477
  // let's build the array to work from to consolidate recurring info.
478
  // recurpmts[cycle_period][cycle_number][billing_limit] = total_amount
@@ -962,6 +968,7 @@ function pmpro_cancelMembershipLevel( $cancel_level, $user_id = null, $old_level
962
  * @param string $old_level_status The status to set for the row in the memberships users table. (e.g. inactive, cancelled, admin_cancelled, expired) Defaults to 'inactive'.
963
  * @param int $cancel_level If set cancel just this one level instead of all active levels (to support Multiple Memberships per User)
964
  *
 
965
  * Return values:
966
  * Success returns boolean true.
967
  * Failure returns boolean false.
@@ -1314,13 +1321,14 @@ function pmpro_listCategories( $parent_id = 0, $level_categories = array() ) {
1314
  }
1315
  }
1316
 
1317
- /*
1318
- pmpro_toggleMembershipCategory() creates or deletes a linking entry between the membership level and post category tables.
1319
  *
1320
  * @param $level may either be the ID or name of the desired membership_level.
1321
  * @param $category must be a valid post category ID.
1322
  * @param $value
1323
  *
 
1324
  * Return values:
1325
  * Success returns boolean true.
1326
  * Failure returns a string containing the error message.
@@ -1353,17 +1361,18 @@ function pmpro_toggleMembershipCategory( $level, $category, $value ) {
1353
  return true;
1354
  }
1355
 
1356
- /*
1357
- pmpro_updateMembershipCategories() ensures that all those and only those categories given
1358
- * are associated with the given membership level.
1359
- *
1360
- * @param $level is a valid membership level ID or name
1361
- * @param $categories is an array of post category IDs
1362
- *
1363
- * Return values:
1364
- * Success returns boolean true.
1365
- * Failure returns a string containing the error message.
1366
- */
 
1367
  function pmpro_updateMembershipCategories( $level, $categories ) {
1368
  global $wpdb;
1369
 
@@ -1393,15 +1402,16 @@ function pmpro_updateMembershipCategories( $level, $categories ) {
1393
  return true;
1394
  }
1395
 
1396
- /*
1397
- pmpro_getMembershipCategories() returns the categories for a given level
1398
- *
1399
- * @param $level_id is a valid membership level ID
1400
- *
1401
- * Return values:
1402
- * Success returns boolean true.
1403
- * Failure returns boolean false.
1404
- */
 
1405
  function pmpro_getMembershipCategories( $level_id ) {
1406
  $level_id = intval( $level_id );
1407
 
@@ -1500,7 +1510,7 @@ function pmpro_getPaginationString( $page = 1, $totalitems = 0, $limit = 15, $ad
1500
  */
1501
  $pagination = '';
1502
  if ( $lastpage > 1 ) {
1503
- $pagination .= '<div class="pmpro_pagination"';
1504
  if ( ! empty( $margin ) || ! empty( $padding ) ) {
1505
  $pagination .= ' style="';
1506
  if ( $margin ) {
@@ -1578,7 +1588,7 @@ function pmpro_getPaginationString( $page = 1, $totalitems = 0, $limit = 15, $ad
1578
  } else {
1579
  $pagination .= '<span class="disabled">next &raquo;</span>';
1580
  }
1581
- $pagination .= "</div>\n";
1582
  }
1583
 
1584
  return $pagination;
@@ -1721,7 +1731,9 @@ function pmpro_generateUsername( $firstname = '', $lastname = '', $email = '' )
1721
  return $username;
1722
  }
1723
 
1724
- // get a new random code for discount codes
 
 
1725
  function pmpro_getDiscountCode( $seed = null ) {
1726
  global $wpdb;
1727
 
@@ -1741,7 +1753,9 @@ function pmpro_getDiscountCode( $seed = null ) {
1741
  return strtoupper( $code );
1742
  }
1743
 
1744
- // is a discount code valid - level_id could be a scalar or an array (or unset)
 
 
1745
  function pmpro_checkDiscountCode( $code, $level_id = null, $return_errors = false ) {
1746
  global $wpdb;
1747
 
@@ -1858,7 +1872,9 @@ function pmpro_no_quotes( $s, $quotes = array( "'", '"' ) ) {
1858
  return str_replace( $quotes, '', $s );
1859
  }
1860
 
1861
- // from: http://www.php.net/manual/en/function.implode.php#86845
 
 
1862
  function pmpro_implodeToEnglish( $array, $conjunction = 'and' ) {
1863
  // sanity check
1864
  if ( ! $array || ! count( $array ) ) {
@@ -1933,7 +1949,9 @@ function pmpro_get_no_access_message( $content, $level_ids, $level_names = NULL
1933
  $level_names = array();
1934
  foreach ( $level_ids as $key => $id ) {
1935
  $level_obj = pmpro_getLevel( $id );
1936
- $level_names[] = $level_obj->name;
 
 
1937
  }
1938
  }
1939
 
@@ -1972,11 +1990,12 @@ function pmpro_get_no_access_message( $content, $level_ids, $level_names = NULL
1972
  return $content;
1973
  }
1974
 
1975
- /*
1976
- pmpro_getMembershipLevelForUser() returns the first active membership level for a user
1977
  *
1978
  * If $user_id is omitted, the value will be retrieved from $current_user.
1979
  *
 
1980
  * Return values:
1981
  * Success returns the level object.
1982
  * Failure returns false.
@@ -2060,12 +2079,13 @@ function pmpro_getMembershipLevelForUser( $user_id = null, $force = false ) {
2060
  }
2061
  }
2062
 
2063
- /*
2064
- pmpro_getMembershipLevelsForUser() returns the membership levels for a user
2065
  *
2066
  * If $user_id is omitted, the value will be retrieved from $current_user.
2067
  * By default it only includes actvie memberships.
2068
  *
 
2069
  * Return values:
2070
  * Success returns an array of level objects.
2071
  * Failure returns false.
@@ -2154,12 +2174,13 @@ function pmpro_getMembershipLevelsForUser( $user_id = null, $include_inactive =
2154
  *
2155
  * If $user_id is null, the value will be retrieved from $current_user.
2156
  *
 
 
 
 
2157
  * Return values:
2158
  * Success returns the level object.
2159
  * Failure returns false.
2160
- *
2161
- * @param int $user_id User ID to check for
2162
- * @param int $level_id Level ID to check for.
2163
  */
2164
  function pmpro_getSpecificMembershipLevelForUser( $user_id, $level_id ) {
2165
  if ( empty( $user_id ) ) {
@@ -2182,11 +2203,12 @@ function pmpro_getSpecificMembershipLevelForUser( $user_id, $level_id ) {
2182
  return false;
2183
  }
2184
 
2185
- /*
2186
- pmpro_getLevel() returns the level object for a level
2187
  *
2188
  * @param $level may be the level id or name
2189
  *
 
2190
  * Return values:
2191
  * Success returns the level object.
2192
  * Failure returns false.
@@ -2230,13 +2252,13 @@ function pmpro_getLevel( $level ) {
2230
  return $pmpro_levels[ $level_id ];
2231
  }
2232
 
2233
- /*
2234
- Get all PMPro membership levels.
2235
-
2236
- @param bool $include_hidden Include levels marked as hidden/inactive.
2237
- @param bool $use_cache If false, use $pmpro_levels global. If true use other caches.
2238
- @param bool $force Resets the static var caches as well.
2239
- */
2240
  function pmpro_getAllLevels( $include_hidden = false, $use_cache = false, $force = false ) {
2241
  global $pmpro_levels, $wpdb;
2242
 
@@ -2356,7 +2378,7 @@ function pmpro_getLevelAtCheckout( $level_id = null, $discount_code = null ) {
2356
 
2357
  // what level are they purchasing? (discount code passed)
2358
  if ( ! empty( $level_id ) && ! empty( $discount_code ) ) {
2359
- $discount_code_id = $wpdb->get_var( "SELECT id FROM $wpdb->pmpro_discount_codes WHERE code = '" . esc_sql( $discount_code ) . "' LIMIT 1" );
2360
 
2361
  // check code
2362
  global $pmpro_checkout_level_ids; // Set by MMPU.
@@ -2511,10 +2533,10 @@ function pmpro_getDomainFromURL( $url = null ) {
2511
  return $domain;
2512
  }
2513
 
2514
- /*
2515
- Get a member's start date... either in general or for a specific level_id.
2516
- */
2517
  if ( ! function_exists( 'pmpro_getMemberStartdate' ) ) {
 
 
 
2518
  function pmpro_getMemberStartdate( $user_id = null, $level_id = 0 ) {
2519
  if ( empty( $user_id ) ) {
2520
  global $current_user;
@@ -2544,10 +2566,10 @@ if ( ! function_exists( 'pmpro_getMemberStartdate' ) ) {
2544
  }
2545
  }
2546
 
2547
- /*
2548
- How long has this member been a member
2549
- */
2550
  if ( ! function_exists( 'pmpro_getMemberDays' ) ) {
 
 
 
2551
  function pmpro_getMemberDays( $user_id = null, $level_id = 0 ) {
2552
  if ( empty( $user_id ) ) {
2553
  global $current_user;
@@ -2680,7 +2702,9 @@ function pmpro_get_field_class( $class, $element ) {
2680
  }
2681
  add_filter( 'pmpro_element_class', 'pmpro_get_field_class', 10, 2 );
2682
 
2683
- // get a var from $_GET or $_POST
 
 
2684
  function pmpro_getParam( $index, $method = 'REQUEST', $default = '', $sanitize_function = 'sanitize_text_field' ) {
2685
  if ( $method == 'REQUEST' ) {
2686
  if ( ! empty( $_REQUEST[ $index ] ) ) {
@@ -2699,9 +2723,9 @@ function pmpro_getParam( $index, $method = 'REQUEST', $default = '', $sanitize_f
2699
  return $default;
2700
  }
2701
 
2702
- /*
2703
- Format an address from address, city, state, zip, country, and phone
2704
- */
2705
  function pmpro_formatAddress( $name, $address1, $address2, $city, $state, $zip, $country, $phone, $nl2br = true ) {
2706
  $address = '';
2707
 
@@ -2742,9 +2766,9 @@ function pmpro_formatAddress( $name, $address1, $address2, $city, $state, $zip,
2742
  return apply_filters( 'pmpro_formatted_address', $address, $name, $address1, $address2, $city, $state, $zip, $country, $phone, $nl2br );
2743
  }
2744
 
2745
- /*
2746
- Checks if all required settings are set.
2747
- */
2748
  function pmpro_is_ready() {
2749
  global $wpdb, $pmpro_pages, $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready;
2750
 
@@ -3092,7 +3116,7 @@ function pmpro_getCurrencyPosition() {
3092
  * Rounds price based on currency
3093
  * Does not format price, to do that, call pmpro_formatPrice().
3094
  *
3095
- * @param string/float $price to round.
3096
  * @param string $currency to round price into.
3097
  */
3098
  function pmpro_round_price( $price, $currency = '' ) {
@@ -3119,6 +3143,97 @@ function pmpro_round_price( $price, $currency = '' ) {
3119
  return $rounded;
3120
  }
3121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3122
  /**
3123
  * Cast to floats and pad zeroes after the decimal
3124
  * when editing the price on the edit level page.
@@ -3163,7 +3278,7 @@ function pmpro_filter_price_for_text_field( $price, $currency = null ) {
3163
  return $price;
3164
  }
3165
 
3166
- /*
3167
  * What gateway should we be using?
3168
  *
3169
  * @since 1.8
@@ -3201,7 +3316,7 @@ function pmpro_getGateway() {
3201
  * Used in logins/visits/views report.
3202
  *
3203
  * @since 1.8.3
3204
- * @param $str Date to check. Will be passed through strtotime().
3205
  */
3206
  function pmpro_isDateThisMonth( $str ) {
3207
  $now = current_time( 'timestamp' );
@@ -3223,7 +3338,7 @@ function pmpro_isDateThisMonth( $str ) {
3223
  * Does the date provided fall within the current week?
3224
  * Merged in from the Better Logins Report Add On.
3225
  * @since 2.0
3226
- * @param $str Date to check. Will be passed through strtotime().
3227
  */
3228
  function pmpro_isDateThisWeek( $str ) {
3229
  $now = current_time( 'timestamp' );
@@ -3243,7 +3358,7 @@ function pmpro_isDateThisWeek( $str ) {
3243
  * Does the dave provided fall within the current year?
3244
  * Merged in from the Better Logins Report Add On.
3245
  * @since 2.0
3246
- * @param $str Date to check. Will be passed through strtotime().
3247
  */
3248
  function pmpro_isDateThisYear( $str ) {
3249
  $now = current_time( 'timestamp' );
@@ -3324,25 +3439,6 @@ function pmpro_generatePages( $pages ) {
3324
  return $pages_created;
3325
  }
3326
 
3327
- /**
3328
- * Schedule a periodic event unless one with the same hook is already scheduled.
3329
- *
3330
- * @param int $timestamp Timestamp for when to run the event.
3331
- * @param string $recurrence How often the event should recur.
3332
- * @param string $hook Action hook to execute when cron is run.
3333
- * @param array $args Optional. Arguments to pass to the hook's callback function.
3334
- * @return false|void False when an event is not scheduled.
3335
- * @since 1.8.7.3
3336
- */
3337
- function pmpro_maybe_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) {
3338
- $next = wp_next_scheduled( $hook, $args );
3339
- if ( empty( $next ) ) {
3340
- return wp_schedule_event( $timestamp, $recurrence, $hook, $args );
3341
- } else {
3342
- return false;
3343
- }
3344
- }
3345
-
3346
  /**
3347
  * Get an array of orders for a specific checkout ID
3348
  *
@@ -3611,7 +3707,7 @@ function pmpro_check_plugin_version( $plugin_file, $comparison, $version ) {
3611
  return false;
3612
  }
3613
 
3614
- // Get plugin data.
3615
  $full_plugin_file_path = WP_PLUGIN_DIR . '/' . $plugin_file;
3616
  if ( is_file( $full_plugin_file_path ) ) {
3617
  $plugin_data = get_plugin_data( $full_plugin_file_path, false, true );
@@ -3723,16 +3819,16 @@ function pmpro_doing_webhook( $gateway = null, $set = false ){
3723
 
3724
  /**
3725
  * Called once a webhook has been run but was not handled.
3726
- *
3727
  * @return void
3728
  *
3729
- * @since TBD
3730
  */
3731
  function pmpro_unhandled_webhook(){
3732
  /**
3733
  * Allow hooking into after a webhook has been run but was not handled.
3734
  *
3735
- * @since TBD
3736
  *
3737
  * @param string $gateway The gateway the webhook was not handled for.
3738
  */
@@ -3905,7 +4001,7 @@ function pmpro_send_200_http_response() {
3905
  flush();
3906
  }
3907
 
3908
- /**
3909
  * Returns formatted ISO-8601 date (Used for Zapier Native app.)
3910
  * @since 2.6.6
3911
  * @param $date date A valid date value.
@@ -3979,23 +4075,116 @@ function pmpro_get_ip() {
3979
  if ( ! $client_ip ) {
3980
  return false;
3981
  }
3982
-
3983
  // Sanitize the IP
3984
  $client_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $client_ip );
3985
-
3986
  return $client_ip;
3987
  }
3988
 
3989
  /**
3990
- * Send the WP new user notification email, but also check our filter.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3991
  * NOTE: includes/email.php has code to check for the related setting and
3992
  * filters on the pmpro_wp_new_user_notification hook.
3993
  * @since 2.7.4
3994
  * @param int $user_id ID of the user to send the email for.
3995
  * @param int $level_id Level ID the user just got. (Need to send to filter.)
3996
  */
3997
- function pmpro_maybe_send_wp_new_user_notification( $user_id, $level_id = null ) {
3998
- if ( apply_filters( 'pmpro_wp_new_user_notification', true, $user_id, $level_id ) ) {
3999
  wp_new_user_notification( $user_id, null, 'both' );
4000
  }
 
4001
  }
48
  return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
49
  }
50
 
51
+ /**
52
+ * @param int $n Override if you have more than 1 group of matches and don't want the first group.
53
+ */
54
  function pmpro_getMatches( $p, $s, $firstvalue = false, $n = 1 ) {
55
  $ok = preg_match_all( $p, $s, $matches );
56
 
182
  return $r;
183
  }
184
 
185
+ /**
186
+ * Given an array of levels, will return true if all of them are free.
187
+ */
188
  function pmpro_areLevelsFree( $levelarr ) {
189
  if ( ! is_array( $levelarr ) ) {
190
  return false; }
476
  return $r;
477
  }
478
 
479
+ /**
480
+ * Similar to pmpro_getLevelCost, but loops through all levels in the incoming array and puts it all together.
481
+ */
482
  function pmpro_getLevelsCost( &$levels, $tags = true, $short = false ) {
483
  // let's build the array to work from to consolidate recurring info.
484
  // recurpmts[cycle_period][cycle_number][billing_limit] = total_amount
968
  * @param string $old_level_status The status to set for the row in the memberships users table. (e.g. inactive, cancelled, admin_cancelled, expired) Defaults to 'inactive'.
969
  * @param int $cancel_level If set cancel just this one level instead of all active levels (to support Multiple Memberships per User)
970
  *
971
+ * @return bool|null
972
  * Return values:
973
  * Success returns boolean true.
974
  * Failure returns boolean false.
1321
  }
1322
  }
1323
 
1324
+ /**
1325
+ * pmpro_toggleMembershipCategory() creates or deletes a linking entry between the membership level and post category tables.
1326
  *
1327
  * @param $level may either be the ID or name of the desired membership_level.
1328
  * @param $category must be a valid post category ID.
1329
  * @param $value
1330
  *
1331
+ * @return string|true
1332
  * Return values:
1333
  * Success returns boolean true.
1334
  * Failure returns a string containing the error message.
1361
  return true;
1362
  }
1363
 
1364
+ /**
1365
+ * pmpro_updateMembershipCategories() ensures that all those and only those categories given
1366
+ * are associated with the given membership level.
1367
+ *
1368
+ * @param $level is a valid membership level ID or name
1369
+ * @param $categories is an array of post category IDs
1370
+ *
1371
+ * @return string|true
1372
+ * Return values:
1373
+ * Success returns boolean true.
1374
+ * Failure returns a string containing the error message.
1375
+ */
1376
  function pmpro_updateMembershipCategories( $level, $categories ) {
1377
  global $wpdb;
1378
 
1402
  return true;
1403
  }
1404
 
1405
+ /**
1406
+ * pmpro_getMembershipCategories() returns the categories for a given level
1407
+ *
1408
+ * @param $level_id is a valid membership level ID
1409
+ *
1410
+ * @return bool
1411
+ * Return values:
1412
+ * Success returns boolean true.
1413
+ * Failure returns boolean false.
1414
+ */
1415
  function pmpro_getMembershipCategories( $level_id ) {
1416
  $level_id = intval( $level_id );
1417
 
1510
  */
1511
  $pagination = '';
1512
  if ( $lastpage > 1 ) {
1513
+ $pagination .= '<span class="pmpro_pagination"';
1514
  if ( ! empty( $margin ) || ! empty( $padding ) ) {
1515
  $pagination .= ' style="';
1516
  if ( $margin ) {
1588
  } else {
1589
  $pagination .= '<span class="disabled">next &raquo;</span>';
1590
  }
1591
+ $pagination .= "</span>\n";
1592
  }
1593
 
1594
  return $pagination;
1731
  return $username;
1732
  }
1733
 
1734
+ /**
1735
+ * Get a new random code for discount codes.
1736
+ */
1737
  function pmpro_getDiscountCode( $seed = null ) {
1738
  global $wpdb;
1739
 
1753
  return strtoupper( $code );
1754
  }
1755
 
1756
+ /**
1757
+ * Is a discount code valid - $level_id could be a scalar or an array (or unset)
1758
+ */
1759
  function pmpro_checkDiscountCode( $code, $level_id = null, $return_errors = false ) {
1760
  global $wpdb;
1761
 
1872
  return str_replace( $quotes, '', $s );
1873
  }
1874
 
1875
+ /**
1876
+ * From: http://www.php.net/manual/en/function.implode.php#86845
1877
+ */
1878
  function pmpro_implodeToEnglish( $array, $conjunction = 'and' ) {
1879
  // sanity check
1880
  if ( ! $array || ! count( $array ) ) {
1949
  $level_names = array();
1950
  foreach ( $level_ids as $key => $id ) {
1951
  $level_obj = pmpro_getLevel( $id );
1952
+ if ( ! empty( $level_obj ) ) {
1953
+ $level_names[] = $level_obj->name;
1954
+ }
1955
  }
1956
  }
1957
 
1990
  return $content;
1991
  }
1992
 
1993
+ /**
1994
+ * pmpro_getMembershipLevelForUser() returns the first active membership level for a user
1995
  *
1996
  * If $user_id is omitted, the value will be retrieved from $current_user.
1997
  *
1998
+ * @return false|object
1999
  * Return values:
2000
  * Success returns the level object.
2001
  * Failure returns false.
2079
  }
2080
  }
2081
 
2082
+ /**
2083
+ * pmpro_getMembershipLevelsForUser() returns the membership levels for a user
2084
  *
2085
  * If $user_id is omitted, the value will be retrieved from $current_user.
2086
  * By default it only includes actvie memberships.
2087
  *
2088
+ * @return array|false
2089
  * Return values:
2090
  * Success returns an array of level objects.
2091
  * Failure returns false.
2174
  *
2175
  * If $user_id is null, the value will be retrieved from $current_user.
2176
  *
2177
+ * @param int $user_id User ID to check for
2178
+ * @param int $level_id Level ID to check for.
2179
+ *
2180
+ * @return false|object
2181
  * Return values:
2182
  * Success returns the level object.
2183
  * Failure returns false.
 
 
 
2184
  */
2185
  function pmpro_getSpecificMembershipLevelForUser( $user_id, $level_id ) {
2186
  if ( empty( $user_id ) ) {
2203
  return false;
2204
  }
2205
 
2206
+ /**
2207
+ * pmpro_getLevel() returns the level object for a level
2208
  *
2209
  * @param $level may be the level id or name
2210
  *
2211
+ * @return false|object
2212
  * Return values:
2213
  * Success returns the level object.
2214
  * Failure returns false.
2252
  return $pmpro_levels[ $level_id ];
2253
  }
2254
 
2255
+ /**
2256
+ * Get all PMPro membership levels.
2257
+ *
2258
+ * @param bool $include_hidden Include levels marked as hidden/inactive.
2259
+ * @param bool $use_cache If false, use $pmpro_levels global. If true use other caches.
2260
+ * @param bool $force Resets the static var caches as well.
2261
+ */
2262
  function pmpro_getAllLevels( $include_hidden = false, $use_cache = false, $force = false ) {
2263
  global $pmpro_levels, $wpdb;
2264
 
2378
 
2379
  // what level are they purchasing? (discount code passed)
2380
  if ( ! empty( $level_id ) && ! empty( $discount_code ) ) {
2381
+ $discount_code_id = $wpdb->get_var( "SELECT id FROM $wpdb->pmpro_discount_codes WHERE code = '" . esc_sql( $discount_code ) . "' LIMIT 1" );
2382
 
2383
  // check code
2384
  global $pmpro_checkout_level_ids; // Set by MMPU.
2533
  return $domain;
2534
  }
2535
 
 
 
 
2536
  if ( ! function_exists( 'pmpro_getMemberStartdate' ) ) {
2537
+ /**
2538
+ * Get a member's start date... either in general or for a specific level_id.
2539
+ */
2540
  function pmpro_getMemberStartdate( $user_id = null, $level_id = 0 ) {
2541
  if ( empty( $user_id ) ) {
2542
  global $current_user;
2566
  }
2567
  }
2568
 
 
 
 
2569
  if ( ! function_exists( 'pmpro_getMemberDays' ) ) {
2570
+ /**
2571
+ * How long has this member been a member.
2572
+ */
2573
  function pmpro_getMemberDays( $user_id = null, $level_id = 0 ) {
2574
  if ( empty( $user_id ) ) {
2575
  global $current_user;
2702
  }
2703
  add_filter( 'pmpro_element_class', 'pmpro_get_field_class', 10, 2 );
2704
 
2705
+ /**
2706
+ * Get a var from $_GET or $_POST.
2707
+ */
2708
  function pmpro_getParam( $index, $method = 'REQUEST', $default = '', $sanitize_function = 'sanitize_text_field' ) {
2709
  if ( $method == 'REQUEST' ) {
2710
  if ( ! empty( $_REQUEST[ $index ] ) ) {
2723
  return $default;
2724
  }
2725
 
2726
+ /**
2727
+ * Format an address from address, city, state, zip, country, and phone.
2728
+ */
2729
  function pmpro_formatAddress( $name, $address1, $address2, $city, $state, $zip, $country, $phone, $nl2br = true ) {
2730
  $address = '';
2731
 
2766
  return apply_filters( 'pmpro_formatted_address', $address, $name, $address1, $address2, $city, $state, $zip, $country, $phone, $nl2br );
2767
  }
2768
 
2769
+ /**
2770
+ * Checks if all required settings are set.
2771
+ */
2772
  function pmpro_is_ready() {
2773
  global $wpdb, $pmpro_pages, $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready;
2774
 
3116
  * Rounds price based on currency
3117
  * Does not format price, to do that, call pmpro_formatPrice().
3118
  *
3119
+ * @param string|float $price to round.
3120
  * @param string $currency to round price into.
3121
  */
3122
  function pmpro_round_price( $price, $currency = '' ) {
3143
  return $rounded;
3144
  }
3145
 
3146
+ /**
3147
+ * Rounds price based on currency and returns a string.
3148
+ *
3149
+ * Does not format price, to do that, call pmpro_formatPrice().
3150
+ *
3151
+ * @since 2.8
3152
+ *
3153
+ * @param int|float|string $amount The amount to get price information for.
3154
+ * @param null|string $currency The currency to use, defaults to current currency.
3155
+ *
3156
+ * @return string The rounded price as a string.
3157
+ */
3158
+ function pmpro_round_price_as_string( $amount, $currency = null ) {
3159
+ $price_info = pmpro_get_price_info( $amount, $currency );
3160
+
3161
+ if ( ! $price_info ) {
3162
+ return (string) pmpro_round_price( $amount, $currency );
3163
+ }
3164
+
3165
+ return $price_info['amount_string'];
3166
+ }
3167
+
3168
+ /**
3169
+ * Get the price information about the provided amount.
3170
+ *
3171
+ * @since 2.8
3172
+ *
3173
+ * @param int|float|string $amount The amount to get price information for.
3174
+ * @param null|string $currency The currency to use, defaults to current currency.
3175
+ *
3176
+ * @return array The price information about the provided amount.
3177
+ */
3178
+ function pmpro_get_price_info( $amount, $currency = null ) {
3179
+ if ( ! is_numeric( $amount ) ) {
3180
+ return false;
3181
+ }
3182
+
3183
+ $amount = (float) $amount;
3184
+
3185
+ $currency_info = pmpro_get_currency( $currency );
3186
+
3187
+ $price_info = [
3188
+ // The amount represented as a float.
3189
+ 'amount' => $amount,
3190
+ // The flat amount represent (example: 1.99 would be 199).
3191
+ 'amount_flat' => 0,
3192
+ // The amount as a string.
3193
+ 'amount_string' => '',
3194
+ 'parts' => [
3195
+ // The whole number part of the amount (example: 1.99 would be 1).
3196
+ 'number' => (int) $amount,
3197
+ // The decimal part of the amount (example: 1.99 would be 99, 1.00 would be 0).
3198
+ 'decimal' => 0,
3199
+ // The decimal part of the amount as a string (example: 1.99 would be 99, 1.00 would be 00).
3200
+ 'decimal_string' => '',
3201
+ ],
3202
+ // The currency information.
3203
+ 'currency' => $currency_info,
3204
+ ];
3205
+
3206
+ // Enforce integer.
3207
+ $currency_info['decimals'] = (int) $currency_info['decimals'];
3208
+
3209
+ $multiplier = 1;
3210
+
3211
+ if ( 0 < $currency_info['decimals'] ) {
3212
+ $multiplier = pow( 10, $currency_info['decimals'] );
3213
+ }
3214
+
3215
+ // Convert the amount from 100.99 to 10099.
3216
+ $price_info['amount_flat'] = $amount * $multiplier;
3217
+
3218
+ // If there were additional unsupported decimal points, round to remove and convert to integer.
3219
+ $price_info['amount_flat'] = round( $price_info['amount_flat'] );
3220
+
3221
+ // Get the decimal part of the amount as a whole number.
3222
+ $price_info['parts']['decimal'] = (
3223
+ $price_info['amount_flat'] - (
3224
+ $price_info['parts']['number'] * $multiplier
3225
+ )
3226
+ );
3227
+
3228
+ // Get the zero-padded decimal amount.
3229
+ $price_info['parts']['decimal_string'] = sprintf( '%02d', $price_info['parts']['decimal'] );
3230
+
3231
+ // Get the amount as a string.
3232
+ $price_info['amount_string'] = sprintf( '%s.%s', $price_info['parts']['number'], $price_info['parts']['decimal_string'] );
3233
+
3234
+ return $price_info;
3235
+ }
3236
+
3237
  /**
3238
  * Cast to floats and pad zeroes after the decimal
3239
  * when editing the price on the edit level page.
3278
  return $price;
3279
  }
3280
 
3281
+ /**
3282
  * What gateway should we be using?
3283
  *
3284
  * @since 1.8
3316
  * Used in logins/visits/views report.
3317
  *
3318
  * @since 1.8.3
3319
+ * @param string $str Date to check. Will be passed through strtotime().
3320
  */
3321
  function pmpro_isDateThisMonth( $str ) {
3322
  $now = current_time( 'timestamp' );
3338
  * Does the date provided fall within the current week?
3339
  * Merged in from the Better Logins Report Add On.
3340
  * @since 2.0
3341
+ * @param string $str Date to check. Will be passed through strtotime().
3342
  */
3343
  function pmpro_isDateThisWeek( $str ) {
3344
  $now = current_time( 'timestamp' );
3358
  * Does the dave provided fall within the current year?
3359
  * Merged in from the Better Logins Report Add On.
3360
  * @since 2.0
3361
+ * @param string $str Date to check. Will be passed through strtotime().
3362
  */
3363
  function pmpro_isDateThisYear( $str ) {
3364
  $now = current_time( 'timestamp' );
3439
  return $pages_created;
3440
  }
3441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3442
  /**
3443
  * Get an array of orders for a specific checkout ID
3444
  *
3707
  return false;
3708
  }
3709
 
3710
+ // Get plugin data.
3711
  $full_plugin_file_path = WP_PLUGIN_DIR . '/' . $plugin_file;
3712
  if ( is_file( $full_plugin_file_path ) ) {
3713
  $plugin_data = get_plugin_data( $full_plugin_file_path, false, true );
3819
 
3820
  /**
3821
  * Called once a webhook has been run but was not handled.
3822
+ *
3823
  * @return void
3824
  *
3825
+ * @since 2.8
3826
  */
3827
  function pmpro_unhandled_webhook(){
3828
  /**
3829
  * Allow hooking into after a webhook has been run but was not handled.
3830
  *
3831
+ * @since 2.8
3832
  *
3833
  * @param string $gateway The gateway the webhook was not handled for.
3834
  */
4001
  flush();
4002
  }
4003
 
4004
+ /**
4005
  * Returns formatted ISO-8601 date (Used for Zapier Native app.)
4006
  * @since 2.6.6
4007
  * @param $date date A valid date value.
4075
  if ( ! $client_ip ) {
4076
  return false;
4077
  }
4078
+
4079
  // Sanitize the IP
4080
  $client_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $client_ip );
4081
+
4082
  return $client_ip;
4083
  }
4084
 
4085
  /**
4086
+ * Determines if this order can be refunded
4087
+ * @param object $order The order that we want to refund
4088
+ * @return bool Returns a bool value based on if the order can be refunded
4089
+ */
4090
+ function pmpro_allowed_refunds( $order ) {
4091
+
4092
+ //If this isn't a valid order then lets not allow it
4093
+ if( empty( $order ) || empty( $order->gateway ) || empty( $order->status ) || empty( $order->payment_transaction_id ) ) {
4094
+ return false;
4095
+ }
4096
+
4097
+ //Orders with a 0 total shouldn't be able to be refunded
4098
+ if( $order->total == 0 ){
4099
+ return false;
4100
+ }
4101
+
4102
+ $okay = false;
4103
+
4104
+ /**
4105
+ * Specify which gateways support refund functionality
4106
+ *
4107
+ * @since 2.8
4108
+ *
4109
+ * @param array $allowed_gateways A list of allowed gateways to work with refunds
4110
+ */
4111
+ $allowed_gateways = apply_filters( 'pmpro_allowed_refunds_gateways', array( 'stripe', 'paypalexpress' ) );
4112
+ //Only apply to these gateways
4113
+ if( in_array( $order->gateway, $allowed_gateways, true ) ) {
4114
+ $okay = true;
4115
+ }
4116
+
4117
+ $disallowed_statuses = pmpro_disallowed_refund_statuses();
4118
+ //Don't allow pending orders to be refunded
4119
+ if( in_array( $order->status, $disallowed_statuses, true ) ){
4120
+ $okay = false;
4121
+ }
4122
+
4123
+ $okay = apply_filters( 'pmpro_refund_allowed', $okay, $order );
4124
+
4125
+ return $okay;
4126
+ }
4127
+
4128
+
4129
+ /**
4130
+ * Decides which filter should be used for the refund depending on gateway
4131
+ * @param object $order Member Order that we are refunding
4132
+ * @return bool Returns a bool value based on if a refund was processed successfully or not
4133
+ */
4134
+ function pmpro_refund_order( $order ){
4135
+
4136
+ if( empty( $order ) ){
4137
+ return false;
4138
+ }
4139
+
4140
+ //Not going to refund an order that has already been refunded
4141
+ if( $order->status == 'refunded' ) {
4142
+ return true;
4143
+ }
4144
+
4145
+ /**
4146
+ * Processes a refund for a specific gateway
4147
+ *
4148
+ * @since 2.8
4149
+ *
4150
+ * @param bool $success Default return value is false to determine if the refund was successfully processed.
4151
+ * @param object $order The Member Order we want to refund.
4152
+ */
4153
+ $success = apply_filters( 'pmpro_process_refund_'.$order->gateway, false, $order );
4154
+
4155
+ return $success;
4156
+
4157
+ }
4158
+
4159
+ /**
4160
+ * Returns an array of order statuses that do not qualify for a refund
4161
+ *
4162
+ * @return array Returns an array of statuses that are not allowe to be refunded
4163
+ */
4164
+ function pmpro_disallowed_refund_statuses() {
4165
+
4166
+ /**
4167
+ * Allow filtering the list of statuses that can not be refunded from.
4168
+ *
4169
+ * @since 2.8
4170
+ *
4171
+ * @param array $disallowed_statuses The list of statuses that can not be refunded from.
4172
+ */
4173
+ $disallowed_statuses = apply_filters( 'pmpro_disallowed_refund_statuses', array( 'pending', 'refunded', 'review', 'token', 'error' ) );
4174
+
4175
+ return $disallowed_statuses;
4176
+ }
4177
+
4178
+ /* Send the WP new user notification email, but also check our filter.
4179
  * NOTE: includes/email.php has code to check for the related setting and
4180
  * filters on the pmpro_wp_new_user_notification hook.
4181
  * @since 2.7.4
4182
  * @param int $user_id ID of the user to send the email for.
4183
  * @param int $level_id Level ID the user just got. (Need to send to filter.)
4184
  */
4185
+ function pmpro_maybe_send_wp_new_user_notification( $user_id, $level_id = null ) {
4186
+ if ( apply_filters( 'pmpro_wp_new_user_notification', true, $user_id, $level_id ) ) {
4187
  wp_new_user_notification( $user_id, null, 'both' );
4188
  }
4189
+
4190
  }
includes/init.php CHANGED
@@ -92,7 +92,7 @@ function pmpro_wp()
92
  {
93
  //add class to body
94
  $pmpro_body_classes[] = "pmpro-" . str_replace("_", "-", $pmpro_page_name);
95
-
96
  //shortcode has params, but we still want to load the preheader
97
  require_once(PMPRO_DIR . "/preheaders/" . $pmpro_page_name . ".php");
98
  }
92
  {
93
  //add class to body
94
  $pmpro_body_classes[] = "pmpro-" . str_replace("_", "-", $pmpro_page_name);
95
+
96
  //shortcode has params, but we still want to load the preheader
97
  require_once(PMPRO_DIR . "/preheaders/" . $pmpro_page_name . ".php");
98
  }
includes/lib/Twocheckout/Twocheckout/TwocheckoutCharge.php CHANGED
@@ -12,10 +12,10 @@ class Twocheckout_Charge extends Twocheckout
12
  echo '<input type="hidden" name="'.htmlspecialchars($key, ENT_QUOTES, 'UTF-8').'" value="'.htmlspecialchars($value, ENT_QUOTES, 'UTF-8').'"/>';
13
  }
14
  if ($type == 'auto') {
15
- echo '<input type="submit" value="Click here if you are not redirected automatically" /></form>';
16
  echo '<script type="text/javascript">document.getElementById("2checkout").submit();</script>';
17
  } else {
18
- echo '<input type="submit" value="'.$type.'" />';
19
  echo '</form>';
20
  }
21
  }
@@ -26,11 +26,11 @@ class Twocheckout_Charge extends Twocheckout
26
 
27
  foreach ($params as $key => $value)
28
  {
29
- echo '<input type="hidden" name="'.$key.'" value="'.$value.'"/>';
30
  }
31
 
32
  if ($type == 'auto') {
33
- echo '<input type="submit" value="Click here if the payment form does not open automatically." /></form>';
34
  echo '<script type="text/javascript">
35
  function submitForm() {
36
  document.getElementById("tco_lightbox").style.display = "block";
@@ -39,7 +39,7 @@ class Twocheckout_Charge extends Twocheckout
39
  setTimeout("submitForm()", 2000);
40
  </script>';
41
  } else {
42
- echo '<input type="submit" value="'.$type.'" />';
43
  echo '</form>';
44
  }
45
 
12
  echo '<input type="hidden" name="'.htmlspecialchars($key, ENT_QUOTES, 'UTF-8').'" value="'.htmlspecialchars($value, ENT_QUOTES, 'UTF-8').'"/>';
13
  }
14
  if ($type == 'auto') {
15
+ echo '<input type="submit" value="' . esc_attr__( 'Click here if you are not redirected automatically.', 'paid-memberships-pro' ) . '" /></form>';
16
  echo '<script type="text/javascript">document.getElementById("2checkout").submit();</script>';
17
  } else {
18
+ echo '<input type="submit" value="'.esc_attr($type).'" />';
19
  echo '</form>';
20
  }
21
  }
26
 
27
  foreach ($params as $key => $value)
28
  {
29
+ echo '<input type="hidden" name="'.$key.'" value="'.esc_attr($value).'"/>';
30
  }
31
 
32
  if ($type == 'auto') {
33
+ echo '<input type="submit" value="' . esc_attr__( 'Click here if the payment form does not open automatically.', 'paid-memberships-pro' ) . '" /></form>';
34
  echo '<script type="text/javascript">
35
  function submitForm() {
36
  document.getElementById("tco_lightbox").style.display = "block";
39
  setTimeout("submitForm()", 2000);
40
  </script>';
41
  } else {
42
+ echo '<input type="submit" value="'.esc_attr($type).'" />';
43
  echo '</form>';
44
  }
45
 
includes/license.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  This file handles the support licensing control for Paid Memberships Pro
4
  and PMPro addons.
5
-
6
  How it works:
7
  - All source code and resource files bundled with this plugin are licensed under the GPLv2 license unless otherwise noted (e.g. included third-party libraries).
8
  - An additional "support license" can be purchased at https://www.paidmembershipspro.com/pricing/
@@ -16,7 +16,7 @@
16
 
17
  /*
18
  Developers, add this line to your wp-config.php to remove PMPro license nags even if no license has been purchased.
19
-
20
  define('PMPRO_LICENSE_NAG', false); //consider purchasing a license at https://www.paidmembershipspro.com/pricing/
21
  */
22
 
@@ -32,24 +32,24 @@ define('PMPRO_LICENSE_SERVER', 'https://license.paidmembershipspro.com/v2/');
32
  * @param bool $force If true, will check key against the PMPro server.
33
  * @return bool True if valid, false if not.
34
  */
35
- function pmpro_license_isValid($key = NULL, $type = NULL, $force = false) {
36
  // Get key from options if non passed in.
37
  if( empty( $key ) ) {
38
  $key = get_option("pmpro_license_key", "");
39
  }
40
-
41
  // No key? Clean up options and return false.
42
  if ( empty( $key ) ) {
43
  delete_option('pmpro_license_check');
44
  add_option('pmpro_license_check', array('license'=>false, 'enddate'=>0), NULL, 'no');
45
  return false;
46
  }
47
-
48
  // If force was passed in, let's check with the server.
49
  if ( $force ) {
50
  $pmpro_license_check = pmpro_license_check_key( $key );
51
  }
52
-
53
  // Get license check value from options.
54
  $pmpro_license_check = get_option( 'pmpro_license_check', false );
55
 
@@ -57,27 +57,27 @@ function pmpro_license_isValid($key = NULL, $type = NULL, $force = false) {
57
  if ( empty( $pmpro_license_check ) ) {
58
  return false;
59
  }
60
-
61
  // Server check errored out?
62
  if ( is_wp_error( $pmpro_license_check ) ) {
63
  return false;
64
  }
65
-
66
  // Check if 30 days past the end date. (We only run the cron every 30 days.)
67
  if ( $pmpro_license_check['enddate'] < ( current_time( 'timestamp' ) - 86400*31 ) ) {
68
  return false;
69
  }
70
-
71
  // Check if a specific type.
72
  if ( ! empty( $type ) ) {
73
  $type = (array)$type;
74
-
75
  if ( ! in_array( $pmpro_license_check['license'], $type, true ) ) {
76
 
77
  return false;
78
  }
79
  }
80
-
81
  // If we got here, we should be good.
82
  return true;
83
  }
@@ -87,15 +87,15 @@ function pmpro_license_isValid($key = NULL, $type = NULL, $force = false) {
87
  */
88
  //activation
89
  function pmpro_license_activation() {
90
- pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_license_check_key');
91
  }
92
- register_activation_hook(__FILE__, 'pmpro_activation');
93
 
94
  //deactivation
95
  function pmpro_license_deactivation() {
96
- wp_clear_scheduled_hook('pmpro_license_check_key');
97
  }
98
- register_deactivation_hook(__FILE__, 'pmpro_deactivation');
99
 
100
  /**
101
  * Check a key against the PMPro license server.
@@ -106,17 +106,17 @@ register_deactivation_hook(__FILE__, 'pmpro_deactivation');
106
  */
107
  function pmpro_license_check_key($key = NULL) {
108
  global $pmpro_license_error;
109
-
110
  // Get key from options if non passed in.
111
  if( empty( $key ) ) {
112
  $key = get_option("pmpro_license_key", "");
113
  }
114
-
115
  // No key? Return error.
116
  if ( empty ( $key ) ) {
117
  return new WP_Error ( 'no_key', __( 'Missing key.', 'paid-memberships-pro' ) );
118
  }
119
-
120
  /**
121
  * Filter to change the timeout for this wp_remote_get() request.
122
  *
@@ -134,30 +134,31 @@ function pmpro_license_check_key($key = NULL) {
134
  // Connection error.
135
  return new WP_Error( 'connection_error', $r->get_error_message() );
136
  }
137
-
138
  // Bad response code?
139
  if ( $r['response']['code'] !== 200 ) {
140
- return new WP_Error( 'bad_response_code', __( sprintf( 'Bad response code %s.', 'paid-memberships-pro' ), $r['response']['code'] ) );
 
141
  }
142
-
143
  // Process the response.
144
- $r = json_decode($r['body']);
145
  if( $r->active == 1 ) {
146
  // Get end date. If none, let's set it 1 year out.
147
  if( ! empty( $r->enddate ) ) {
148
  $enddate = strtotime( $r->enddate, current_time( 'timestamp' ) );
149
  } else {
150
  $enddate = strtotime( '+1 Year', current_time( 'timestamp' ) );
151
- }
152
 
153
  $license_check = array( 'license' => $r->license, 'enddate' => $enddate );
154
  update_option( 'pmpro_license_check', $license_check, 'no' );
155
-
156
  return $license_check;
157
- } elseif ( ! empty( $r->error ) ) {
158
  // Invalid key. Let's clear out the option.
159
  update_option( 'pmpro_license_check', array('license'=>false, 'enddate'=>0), 'no' );
160
-
161
  return new WP_Error( 'invalid_key', $r->error );
162
  } else {
163
  // Unknown error. We should maybe clear out the option, but we're not.
@@ -172,7 +173,7 @@ add_action('pmpro_license_check_key', 'pmpro_license_check_key');
172
  * @param string $type The license type for an add on for license key.
173
  * @return bool True if the type is for a paid PMPro membership, false if not.
174
  */
175
- function pmpro_license_type_is_premium( $type ) {
176
  $premium_types = pmpro_license_get_premium_types();
177
  return in_array( strtolower( $type ), $premium_types, true );
178
  }
@@ -184,4 +185,4 @@ function pmpro_license_type_is_premium( $type ) {
184
  */
185
  function pmpro_license_get_premium_types() {
186
  return array( 'standard', 'plus', 'builder' );
187
- }
2
  /*
3
  This file handles the support licensing control for Paid Memberships Pro
4
  and PMPro addons.
5
+
6
  How it works:
7
  - All source code and resource files bundled with this plugin are licensed under the GPLv2 license unless otherwise noted (e.g. included third-party libraries).
8
  - An additional "support license" can be purchased at https://www.paidmembershipspro.com/pricing/
16
 
17
  /*
18
  Developers, add this line to your wp-config.php to remove PMPro license nags even if no license has been purchased.
19
+
20
  define('PMPRO_LICENSE_NAG', false); //consider purchasing a license at https://www.paidmembershipspro.com/pricing/
21
  */
22
 
32
  * @param bool $force If true, will check key against the PMPro server.
33
  * @return bool True if valid, false if not.
34
  */
35
+ function pmpro_license_isValid($key = NULL, $type = NULL, $force = false) {
36
  // Get key from options if non passed in.
37
  if( empty( $key ) ) {
38
  $key = get_option("pmpro_license_key", "");
39
  }
40
+
41
  // No key? Clean up options and return false.
42
  if ( empty( $key ) ) {
43
  delete_option('pmpro_license_check');
44
  add_option('pmpro_license_check', array('license'=>false, 'enddate'=>0), NULL, 'no');
45
  return false;
46
  }
47
+
48
  // If force was passed in, let's check with the server.
49
  if ( $force ) {
50
  $pmpro_license_check = pmpro_license_check_key( $key );
51
  }
52
+
53
  // Get license check value from options.
54
  $pmpro_license_check = get_option( 'pmpro_license_check', false );
55
 
57
  if ( empty( $pmpro_license_check ) ) {
58
  return false;
59
  }
60
+
61
  // Server check errored out?
62
  if ( is_wp_error( $pmpro_license_check ) ) {
63
  return false;
64
  }
65
+
66
  // Check if 30 days past the end date. (We only run the cron every 30 days.)
67
  if ( $pmpro_license_check['enddate'] < ( current_time( 'timestamp' ) - 86400*31 ) ) {
68
  return false;
69
  }
70
+
71
  // Check if a specific type.
72
  if ( ! empty( $type ) ) {
73
  $type = (array)$type;
74
+
75
  if ( ! in_array( $pmpro_license_check['license'], $type, true ) ) {
76
 
77
  return false;
78
  }
79
  }
80
+
81
  // If we got here, we should be good.
82
  return true;
83
  }
87
  */
88
  //activation
89
  function pmpro_license_activation() {
90
+ pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'monthly', 'pmpro_license_check_key' );
91
  }
92
+ add_action( 'activate_paid-memberships-pro', 'pmpro_license_activation' );
93
 
94
  //deactivation
95
  function pmpro_license_deactivation() {
96
+ wp_clear_scheduled_hook( 'pmpro_license_check_key' );
97
  }
98
+ add_action( 'deactivate_paid-memberships-pro', 'pmpro_license_deactivation' );
99
 
100
  /**
101
  * Check a key against the PMPro license server.
106
  */
107
  function pmpro_license_check_key($key = NULL) {
108
  global $pmpro_license_error;
109
+
110
  // Get key from options if non passed in.
111
  if( empty( $key ) ) {
112
  $key = get_option("pmpro_license_key", "");
113
  }
114
+
115
  // No key? Return error.
116
  if ( empty ( $key ) ) {
117
  return new WP_Error ( 'no_key', __( 'Missing key.', 'paid-memberships-pro' ) );
118
  }
119
+
120
  /**
121
  * Filter to change the timeout for this wp_remote_get() request.
122
  *
134
  // Connection error.
135
  return new WP_Error( 'connection_error', $r->get_error_message() );
136
  }
137
+
138
  // Bad response code?
139
  if ( $r['response']['code'] !== 200 ) {
140
+ return new WP_Error( 'bad_response_code', esc_html( sprintf( __( 'Bad response code %s.', 'paid-memberships-pro' ), $r['response']['code'] ) ) );
141
+
142
  }
143
+
144
  // Process the response.
145
+ $r = json_decode($r['body']);
146
  if( $r->active == 1 ) {
147
  // Get end date. If none, let's set it 1 year out.
148
  if( ! empty( $r->enddate ) ) {
149
  $enddate = strtotime( $r->enddate, current_time( 'timestamp' ) );
150
  } else {
151
  $enddate = strtotime( '+1 Year', current_time( 'timestamp' ) );
152
+ }
153
 
154
  $license_check = array( 'license' => $r->license, 'enddate' => $enddate );
155
  update_option( 'pmpro_license_check', $license_check, 'no' );
156
+
157
  return $license_check;
158
+ } elseif ( ! empty( $r->error ) ) {
159
  // Invalid key. Let's clear out the option.
160
  update_option( 'pmpro_license_check', array('license'=>false, 'enddate'=>0), 'no' );
161
+
162
  return new WP_Error( 'invalid_key', $r->error );
163
  } else {
164
  // Unknown error. We should maybe clear out the option, but we're not.
173
  * @param string $type The license type for an add on for license key.
174
  * @return bool True if the type is for a paid PMPro membership, false if not.
175
  */
176
+ function pmpro_license_type_is_premium( $type ) {
177
  $premium_types = pmpro_license_get_premium_types();
178
  return in_array( strtolower( $type ), $premium_types, true );
179
  }
185
  */
186
  function pmpro_license_get_premium_types() {
187
  return array( 'standard', 'plus', 'builder' );
188
+ }
includes/login.php CHANGED
@@ -687,7 +687,7 @@ function pmpro_reset_password_form() {
687
  <div class="<?php echo pmpro_get_element_class( 'pmpro_reset_password-field pmpro_reset_password-field-pass1', 'pmpro_reset_password-field-pass1' ); ?>">
688
  <label for="pass1"><?php esc_html_e( 'New Password', 'paid-memberships-pro' ) ?></label>
689
  <input type="password" name="pass1" id="pass1" class="<?php echo pmpro_get_element_class( 'input pass1', 'pass1' ); ?>" size="20" value="" autocomplete="off" />
690
- <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength Indicator', 'paid-memberships-pro' ); ?></div>
691
  <p class="<?php echo pmpro_get_element_class( 'lite' ); ?>"><?php echo wp_get_password_hint(); ?></p>
692
  </div>
693
  <div class="<?php echo pmpro_get_element_class( 'pmpro_reset_password-field pmpro_reset_password-field-pass2', 'pmpro_reset_password-field-pass2' ); ?>">
687
  <div class="<?php echo pmpro_get_element_class( 'pmpro_reset_password-field pmpro_reset_password-field-pass1', 'pmpro_reset_password-field-pass1' ); ?>">
688
  <label for="pass1"><?php esc_html_e( 'New Password', 'paid-memberships-pro' ) ?></label>
689
  <input type="password" name="pass1" id="pass1" class="<?php echo pmpro_get_element_class( 'input pass1', 'pass1' ); ?>" size="20" value="" autocomplete="off" />
690
+ <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php esc_html_e( 'Strength Indicator', 'paid-memberships-pro' ); ?></div>
691
  <p class="<?php echo pmpro_get_element_class( 'lite' ); ?>"><?php echo wp_get_password_hint(); ?></p>
692
  </div>
693
  <div class="<?php echo pmpro_get_element_class( 'pmpro_reset_password-field pmpro_reset_password-field-pass2', 'pmpro_reset_password-field-pass2' ); ?>">
includes/menus.php CHANGED
@@ -67,7 +67,7 @@ function pmpro_pages_metabox_nav_links() {
67
  </label>
68
  <input type="hidden" class="menu-item-type" name="menu-item[-1][menu-item-type]" value="custom">
69
  <input type="hidden" class="menu-item-type-name" name="menu-item[-1][menu-item-type]" value="custom">
70
- <input type="hidden" class="menu-item-title" name="menu-item[-1][menu-item-title]" value="<?php _e( 'Log In', 'paid-memberships-pro'); ?>">
71
  <input type="hidden" class="menu-item-url" name="menu-item[-1][menu-item-url]" value="#">
72
  <input type="hidden" class="menu-item-classes" name="menu-item[-1][menu-item-classes]" value="menu-item-type-pmpro-login">
73
  </li>
@@ -76,7 +76,7 @@ function pmpro_pages_metabox_nav_links() {
76
  <input type="checkbox" class="menu-item-checkbox" name="menu-item[-2][menu-item-object-id]" value="-2"> <?php _e( 'Log Out', 'paid-memberships-pro'); ?>
77
  </label>
78
  <input type="hidden" class="menu-item-type" name="menu-item[-2][menu-item-type]" value="custom">
79
- <input type="hidden" class="menu-item-title" name="menu-item[-2][menu-item-title]" value="<?php _e( 'Log Out', 'paid-memberships-pro'); ?>">
80
  <input type="hidden" class="menu-item-url" name="menu-item[-2][menu-item-url]" value="#">
81
  <input type="hidden" class="menu-item-classes" name="menu-item[-2][menu-item-classes]" value="menu-item-type-pmpro-logout">
82
  </li>
@@ -252,4 +252,4 @@ function pmpro_hide_toolbar() {
252
  add_filter( 'show_admin_bar', '__return_false' );
253
  }
254
  }
255
- add_action( 'init', 'pmpro_hide_toolbar', 9 );
67
  </label>
68
  <input type="hidden" class="menu-item-type" name="menu-item[-1][menu-item-type]" value="custom">
69
  <input type="hidden" class="menu-item-type-name" name="menu-item[-1][menu-item-type]" value="custom">
70
+ <input type="hidden" class="menu-item-title" name="menu-item[-1][menu-item-title]" value="<?php esc_attr_e( 'Log In', 'paid-memberships-pro'); ?>">
71
  <input type="hidden" class="menu-item-url" name="menu-item[-1][menu-item-url]" value="#">
72
  <input type="hidden" class="menu-item-classes" name="menu-item[-1][menu-item-classes]" value="menu-item-type-pmpro-login">
73
  </li>
76
  <input type="checkbox" class="menu-item-checkbox" name="menu-item[-2][menu-item-object-id]" value="-2"> <?php _e( 'Log Out', 'paid-memberships-pro'); ?>
77
  </label>
78
  <input type="hidden" class="menu-item-type" name="menu-item[-2][menu-item-type]" value="custom">
79
+ <input type="hidden" class="menu-item-title" name="menu-item[-2][menu-item-title]" value="<?php esc_attr_e( 'Log Out', 'paid-memberships-pro'); ?>">
80
  <input type="hidden" class="menu-item-url" name="menu-item[-2][menu-item-url]" value="#">
81
  <input type="hidden" class="menu-item-classes" name="menu-item[-2][menu-item-classes]" value="menu-item-type-pmpro-logout">
82
  </li>
252
  add_filter( 'show_admin_bar', '__return_false' );
253
  }
254
  }
255
+ add_action( 'init', 'pmpro_hide_toolbar', 9 );
includes/metaboxes.php CHANGED
@@ -148,11 +148,11 @@ function pmpro_taxonomy_meta( $term ) {
148
  if( ! empty( $protectedlevels ) ) {
149
  ?>
150
  <tr class="form-field">
151
- <th scope="row" valign="top"><?php _e( 'Membership Levels', 'paid-memberships-pro' ); ?></label></th>
152
  <td>
153
  <p><strong>
154
  <?php echo implode(', ',$protectedlevels); ?></strong></p>
155
- <p class="description"><?php _e( 'Only members of these levels will be able to view posts in this category.', 'paid-memberships-pro' ); ?></p>
156
  </td>
157
  </tr>
158
  <?php
148
  if( ! empty( $protectedlevels ) ) {
149
  ?>
150
  <tr class="form-field">
151
+ <th scope="row" valign="top"><?php esc_html_e( 'Membership Levels', 'paid-memberships-pro' ); ?></label></th>
152
  <td>
153
  <p><strong>
154
  <?php echo implode(', ',$protectedlevels); ?></strong></p>
155
+ <p class="description"><?php esc_html_e( 'Only members of these levels will be able to view posts in this category.', 'paid-memberships-pro' ); ?></p>
156
  </td>
157
  </tr>
158
  <?php
includes/notifications.php CHANGED
@@ -22,10 +22,10 @@ function pmpro_notifications() {
22
  ?>
23
  <div class="pmpro_notification" id="<?php echo $notification->id; ?>">
24
  <?php if ( $notification->dismissable ) { ?>
25
- <button type="button" class="pmpro-notice-button notice-dismiss" value="<?php echo $notification->id; ?>"><span class="screen-reader-text"><?php esc_html_e( 'Dismiss this notice.', 'paid-memberships-pro' ); ?></span></button>
26
  <?php } ?>
27
  <div class="pmpro_notification-<?php echo $notification->type; ?>">
28
- <h3><span class="dashicons dashicons-<?php esc_attr_e( $notification->dashicon ); ?>"></span> <?php esc_html_e( $notification->title ); ?></h3>
29
  <?php
30
  $allowed_html = array (
31
  'a' => array (
@@ -556,4 +556,4 @@ function pmpro_footer_link() {
556
  <!-- <?php echo pmpro_link()?> -->
557
  <?php }
558
  }
559
- add_action( 'wp_footer', 'pmpro_footer_link' );
22
  ?>
23
  <div class="pmpro_notification" id="<?php echo $notification->id; ?>">
24
  <?php if ( $notification->dismissable ) { ?>
25
+ <button type="button" class="pmpro-notice-button notice-dismiss" value="<?php echo esc_attr( $notification->id ); ?>"><span class="screen-reader-text"><?php esc_html_e( 'Dismiss this notice.', 'paid-memberships-pro' ); ?></span></button>
26
  <?php } ?>
27
  <div class="pmpro_notification-<?php echo $notification->type; ?>">
28
+ <h3><span class="dashicons dashicons-<?php esc_attr_e( $notification->dashicon ); ?>"></span> <?php echo esc_html( $notification->title ); ?></h3>
29
  <?php
30
  $allowed_html = array (
31
  'a' => array (
556
  <!-- <?php echo pmpro_link()?> -->
557
  <?php }
558
  }
559
+ add_action( 'wp_footer', 'pmpro_footer_link' );
includes/privacy.php CHANGED
@@ -495,6 +495,7 @@ function pmpro_after_checkout_update_consent( $user_id, $order ) {
495
  add_action( 'pmpro_after_checkout', 'pmpro_after_checkout_update_consent', 10, 2 );
496
  add_action( 'pmpro_before_send_to_paypal_standard', 'pmpro_after_checkout_update_consent', 10, 2);
497
  add_action( 'pmpro_before_send_to_twocheckout', 'pmpro_after_checkout_update_consent', 10, 2);
 
498
 
499
  /**
500
  * Convert a consent entry into a English sentence.
495
  add_action( 'pmpro_after_checkout', 'pmpro_after_checkout_update_consent', 10, 2 );
496
  add_action( 'pmpro_before_send_to_paypal_standard', 'pmpro_after_checkout_update_consent', 10, 2);
497
  add_action( 'pmpro_before_send_to_twocheckout', 'pmpro_after_checkout_update_consent', 10, 2);
498
+ add_action( 'pmpro_before_send_to_payfast', 'pmpro_after_checkout_update_consent', 10, 2 );
499
 
500
  /**
501
  * Convert a consent entry into a English sentence.
includes/profile.php CHANGED
@@ -19,7 +19,7 @@ function pmpro_membership_level_profile_fields($user)
19
  if(!$levels)
20
  return "";
21
  ?>
22
- <h3><?php _e("Membership Level", 'paid-memberships-pro' ); ?></h3>
23
  <table class="form-table">
24
  <?php
25
  $show_membership_level = true;
@@ -28,7 +28,7 @@ function pmpro_membership_level_profile_fields($user)
28
  {
29
  ?>
30
  <tr>
31
- <th><label for="membership_level"><?php _e("Current Level", 'paid-memberships-pro' ); ?></label></th>
32
  <td>
33
  <select name="membership_level">
34
  <option value="" <?php if(empty($user->membership_level->ID)) { ?>selected="selected"<?php } ?>>-- <?php _e("None", 'paid-memberships-pro' );?> --</option>
@@ -36,12 +36,12 @@ function pmpro_membership_level_profile_fields($user)
36
  foreach($levels as $level)
37
  {
38
  ?>
39
- <option value="<?php echo $level->id?>" <?php selected($level->id, (isset($user->membership_level->ID) ? $user->membership_level->ID : 0 )); ?>><?php echo $level->name?></option>
40
  <?php
41
  }
42
  ?>
43
  </select>
44
- <p id="cancel_description" class="description hidden"><?php _e("This will not change the subscription at the gateway unless the 'Cancel' checkbox is selected below.", 'paid-memberships-pro' ); ?></p>
45
  </td>
46
  </tr>
47
  <?php
@@ -60,13 +60,23 @@ function pmpro_membership_level_profile_fields($user)
60
  $selected_expires_hour = date( 'H', $end_date ? $user->membership_level->enddate : current_time('timestamp') );
61
 
62
  $selected_expires_minute = date( 'i', $end_date ? $user->membership_level->enddate : current_time('timestamp') );
 
 
 
 
 
 
 
 
 
 
63
  ?>
64
  <tr>
65
- <th><label for="expiration"><?php _e("Expires", 'paid-memberships-pro' ); ?></label></th>
66
  <td>
67
  <select id="expires" name="expires">
68
- <option value="0" <?php if(!$end_date) { ?>selected="selected"<?php } ?>><?php _e("No", 'paid-memberships-pro' );?></option>
69
- <option value="1" <?php if($end_date) { ?>selected="selected"<?php } ?>><?php _e("Yes", 'paid-memberships-pro' );?></option>
70
  </select>
71
  <span id="expires_date" <?php if(!$end_date) { ?>style="display: none;"<?php } ?>>
72
  on
@@ -75,25 +85,25 @@ function pmpro_membership_level_profile_fields($user)
75
  for($i = 1; $i < 13; $i++)
76
  {
77
  ?>
78
- <option value="<?php echo $i?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/15/" . date("Y", current_time( 'timestamp' ) ), current_time("timestamp")))?></option>
79
  <?php
80
  }
81
  ?>
82
  </select>
83
- <input name="expires_day" type="text" size="2" value="<?php echo $selected_expires_day?>" />
84
- <input name="expires_year" type="text" size="4" value="<?php echo $selected_expires_year?>" />
85
  <?php _e('at', 'paid-memberships-pro'); ?>
86
  <select name='expires_hour'>
87
  <?php
88
  for( $i = 0; $i <= 24; $i++ ){
89
- echo "<option value='".$i."' ".selected( $selected_expires_hour, sprintf("%02d", $i ), true ).">".sprintf("%02d", $i )."</option>";
90
  }
91
  ?>
92
  </select>
93
  <select name='expires_minute'>
94
  <?php
95
  for( $i = 0; $i <= 59; $i++ ){
96
- echo "<option value='".$i."' ".selected( $selected_expires_minute, sprintf("%02d", $i ), true ).">".sprintf("%02d", $i )."</option>";
97
  }
98
  ?>
99
  </select>
@@ -119,6 +129,12 @@ function pmpro_membership_level_profile_fields($user)
119
  <td>
120
  <label for="cancel_subscription"><input value="1" id="cancel_subscription" name="cancel_subscription" type="checkbox"> <?php _e("Cancel this user's subscription at the gateway.", "paid-memberships-pro" ); ?></label>
121
  </td>
 
 
 
 
 
 
122
  </tr>
123
  <?php
124
  }
@@ -131,7 +147,7 @@ function pmpro_membership_level_profile_fields($user)
131
  if( !empty( $tospage_id ) || !empty( $consent_log ) ) {
132
  ?>
133
  <tr>
134
- <th><label for="tos_consent_history"><?php _e("TOS Consent History", 'paid-memberships-pro' ); ?></label></th>
135
  <td id="tos_consent_history">
136
  <?php
137
  if ( ! empty( $consent_log ) ) {
@@ -355,6 +371,30 @@ function pmpro_membership_level_profile_fields_update()
355
  $pmproemail->sendAdminChangeEmail(get_userdata($user_ID));
356
  }
357
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  }
359
  add_action( 'show_user_profile', 'pmpro_membership_level_profile_fields' );
360
  add_action( 'edit_user_profile', 'pmpro_membership_level_profile_fields' );
@@ -424,18 +464,18 @@ function pmpro_membership_history_profile_fields( $user ) {
424
  <tr>
425
  <td><?php echo date_i18n( get_option( 'date_format'), $invoice->timestamp ); ?></td>
426
  <td class="order_code column-order_code has-row-actions">
427
- <a href="<?php echo add_query_arg( array( 'page' => 'pmpro-orders', 'order' => $invoice->id ), admin_url('admin.php' ) ); ?>"><?php echo $invoice->code; ?></a><br />
428
  <div class="row-actions">
429
  <span class="edit">
430
- <a title="<?php esc_html_e( 'Edit', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'page' => 'pmpro-orders', 'order' => $invoice->id ), admin_url('admin.php' ) ); ?>"><?php esc_html_e( 'Edit', 'paid-memberships-pro' ); ?></a>
431
  </span> |
432
  <span class="print">
433
- <a target="_blank" title="<?php _e( 'Print', 'paid-memberships-pro' ); ?>" href="<?php echo add_query_arg( array( 'action' => 'pmpro_orders_print_view', 'order' => $invoice->id ), admin_url('admin-ajax.php' ) ); ?>"><?php esc_html_e( 'Print', 'paid-memberships-pro' ); ?></a>
434
  </span>
435
  <?php if ( function_exists( 'pmpro_add_email_order_modal' ) ) { ?>
436
  |
437
  <span class="email">
438
- <a title="<?php esc_html_e( 'Email', 'paid-memberships-pro' ); ?>" href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link" data-order="<?php echo esc_attr( $invoice->id ); ?>"><?php _e( 'Email', 'paid-memberships-pro' ); ?></a>
439
  </span>
440
  <?php } ?>
441
  </div> <!-- end .row-actions -->
@@ -787,11 +827,11 @@ function pmpro_member_profile_edit_form() {
787
  do_action( 'pmpro_show_user_profile', $current_user );
788
  ?>
789
  <input type="hidden" name="action" value="update-profile" />
790
- <input type="hidden" name="user_id" value="<?php echo $current_user->ID; ?>" />
791
  <div class="<?php echo pmpro_get_element_class( 'pmpro_submit' ); ?>">
792
  <hr />
793
- <input type="submit" name="submit" class="<?php echo pmpro_get_element_class( 'pmpro_btn pmpro_btn-submit', 'pmpro_btn-submit' ); ?>" value="<?php _e( 'Update Profile', 'paid-memberships-pro' );?>" />
794
- <input type="button" name="cancel" class="<?php echo pmpro_get_element_class( 'pmpro_btn pmpro_btn-cancel', 'pmpro_btn-cancel' ); ?>" value="<?php _e( 'Cancel', 'paid-memberships-pro' );?>" onclick="location.href='<?php echo pmpro_url( 'account'); ?>';" />
795
  </div>
796
  </form>
797
  </div> <!-- end pmpro_member_profile_edit_wrap -->
@@ -877,7 +917,7 @@ add_action( 'init', 'pmpro_change_password_process' );
877
  function pmpro_change_password_form() {
878
  global $current_user, $pmpro_msg, $pmpro_msgt;
879
  ?>
880
- <h2><?php _e( 'Change Password', 'paid-memberships-pro' ); ?></h2>
881
  <?php if ( ! empty( $pmpro_msg ) ) { ?>
882
  <div class="<?php echo pmpro_get_element_class( 'pmpro_message ' . $pmpro_msgt, $pmpro_msgt ); ?>">
883
  <?php echo esc_html( $pmpro_msg ); ?>
@@ -891,19 +931,19 @@ function pmpro_change_password_form() {
891
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout_box-password' ); ?>">
892
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-fields' ); ?>">
893
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-field pmpro_change_password-field-password_current', 'pmpro_change_password-field-password_current' ); ?>">
894
- <label for="password_current"><?php _e( 'Current Password', 'paid-memberships-pro' ); ?></label></th>
895
  <input type="password" name="password_current" id="password_current" value="" class="<?php echo pmpro_get_element_class( 'input', 'password_current' ); ?>" />
896
  <span class="<?php echo pmpro_get_element_class( 'pmpro_asterisk' ); ?>"> <abbr title="<?php _e( 'Required Field', 'paid-memberships-pro' ); ?>">*</abbr></span>
897
  </div> <!-- end pmpro_change_password-field-password_current -->
898
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-field pmpro_change_password-field-pass1', 'pmpro_change_password-field-pass1' ); ?>">
899
- <label for="pass1"><?php _e( 'New Password', 'paid-memberships-pro' ); ?></label></th>
900
  <input type="password" name="pass1" id="pass1" value="" class="<?php echo pmpro_get_element_class( 'input pass1', 'pass1' ); ?>" autocomplete="off" />
901
  <span class="<?php echo pmpro_get_element_class( 'pmpro_asterisk' ); ?>"> <abbr title="<?php _e( 'Required Field', 'paid-memberships-pro' ); ?>">*</abbr></span>
902
- <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength Indicator', 'paid-memberships-pro' ); ?></div>
903
  <p class="<?php echo pmpro_get_element_class( 'lite' ); ?>"><?php echo wp_get_password_hint(); ?></p>
904
  </div> <!-- end pmpro_change_password-field-pass1 -->
905
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-field pmpro_change_password-field-pass2', 'pmpro_change_password-field-pass2' ); ?>">
906
- <label for="pass2"><?php _e( 'Confirm New Password', 'paid-memberships-pro' ); ?></label></th>
907
  <input type="password" name="pass2" id="pass2" value="" class="<?php echo pmpro_get_element_class( 'input', 'pass2' ); ?>" autocomplete="off" />
908
  <span class="<?php echo pmpro_get_element_class( 'pmpro_asterisk' ); ?>"> <abbr title="<?php _e( 'Required Field', 'paid-memberships-pro' ); ?>">*</abbr></span>
909
  </div> <!-- end pmpro_change_password-field-pass2 -->
19
  if(!$levels)
20
  return "";
21
  ?>
22
+ <h3><?php esc_html_e("Membership Level", 'paid-memberships-pro' ); ?></h3>
23
  <table class="form-table">
24
  <?php
25
  $show_membership_level = true;
28
  {
29
  ?>
30
  <tr>
31
+ <th><label for="membership_level"><?php esc_html_e("Current Level", 'paid-memberships-pro' ); ?></label></th>
32
  <td>
33
  <select name="membership_level">
34
  <option value="" <?php if(empty($user->membership_level->ID)) { ?>selected="selected"<?php } ?>>-- <?php _e("None", 'paid-memberships-pro' );?> --</option>
36
  foreach($levels as $level)
37
  {
38
  ?>
39
+ <option value="<?php echo esc_attr( $level->id ) ?>" <?php selected($level->id, (isset($user->membership_level->ID) ? $user->membership_level->ID : 0 )); ?>><?php echo esc_html( $level->name ); ?></option>
40
  <?php
41
  }
42
  ?>
43
  </select>
44
+ <p id="cancel_description" class="description hidden"><?php esc_html_e("This will not change the subscription at the gateway unless the 'Cancel' checkbox is selected below.", 'paid-memberships-pro' ); ?></p>
45
  </td>
46
  </tr>
47
  <?php
60
  $selected_expires_hour = date( 'H', $end_date ? $user->membership_level->enddate : current_time('timestamp') );
61
 
62
  $selected_expires_minute = date( 'i', $end_date ? $user->membership_level->enddate : current_time('timestamp') );
63
+
64
+ $last_order = new MemberOrder();
65
+
66
+ $last_order->getLastMemberOrder( $user->ID );
67
+
68
+ $allows_refunds = false;
69
+
70
+ if( pmpro_allowed_refunds( $last_order ) ) {
71
+ $allows_refunds = true;
72
+ }
73
  ?>
74
  <tr>
75
+ <th><label for="expiration"><?php esc_html_e("Expires", 'paid-memberships-pro' ); ?></label></th>
76
  <td>
77
  <select id="expires" name="expires">
78
+ <option value="0" <?php if(!$end_date) { ?>selected="selected"<?php } ?>><?php esc_html_e("No", 'paid-memberships-pro' );?></option>
79
+ <option value="1" <?php if($end_date) { ?>selected="selected"<?php } ?>><?php esc_html_e("Yes", 'paid-memberships-pro' );?></option>
80
  </select>
81
  <span id="expires_date" <?php if(!$end_date) { ?>style="display: none;"<?php } ?>>
82
  on
85
  for($i = 1; $i < 13; $i++)
86
  {
87
  ?>
88
+ <option value="<?php echo esc_attr( $i ) ?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/15/" . date("Y", current_time( 'timestamp' ) ), current_time("timestamp")))?></option>
89
  <?php
90
  }
91
  ?>
92
  </select>
93
+ <input name="expires_day" type="text" size="2" value="<?php echo esc_attr( $selected_expires_day ) ?>" />
94
+ <input name="expires_year" type="text" size="4" value="<?php echo esc_attr( $selected_expires_year ) ?>" />
95
  <?php _e('at', 'paid-memberships-pro'); ?>
96
  <select name='expires_hour'>
97
  <?php
98
  for( $i = 0; $i <= 24; $i++ ){
99
+ echo "<option value='".esc_attr($i)."' ".selected( $selected_expires_hour, sprintf("%02d", $i ), true ).">".sprintf("%02d", $i )."</option>";
100
  }
101
  ?>
102
  </select>
103
  <select name='expires_minute'>
104
  <?php
105
  for( $i = 0; $i <= 59; $i++ ){
106
+ echo "<option value='".esc_attr($i)."' ".selected( $selected_expires_minute, sprintf("%02d", $i ), true ).">".sprintf("%02d", $i )."</option>";
107
  }
108
  ?>
109
  </select>
129
  <td>
130
  <label for="cancel_subscription"><input value="1" id="cancel_subscription" name="cancel_subscription" type="checkbox"> <?php _e("Cancel this user's subscription at the gateway.", "paid-memberships-pro" ); ?></label>
131
  </td>
132
+ </tr>
133
+ <tr class="more_level_options">
134
+ <th></th>
135
+ <td>
136
+ <label for="refund_last_subscription"><input value="1" id="refund_last_subscription" name="refund_last_subscription" type="checkbox"<?php disabled( !$allows_refunds ); ?>> <?php esc_html_e("Refund this user's most recent order.", "paid-memberships-pro" ); ?></label>
137
+ </td>
138
  </tr>
139
  <?php
140
  }
147
  if( !empty( $tospage_id ) || !empty( $consent_log ) ) {
148
  ?>
149
  <tr>
150
+ <th><label for="tos_consent_history"><?php esc_html_e("TOS Consent History", 'paid-memberships-pro' ); ?></label></th>
151
  <td id="tos_consent_history">
152
  <?php
153
  if ( ! empty( $consent_log ) ) {
371
  $pmproemail->sendAdminChangeEmail(get_userdata($user_ID));
372
  }
373
  }
374
+
375
+ //Refund their most recent subscription
376
+ if( !empty( $_REQUEST['refund_last_subscription'] ) ) {
377
+
378
+ $order = new MemberOrder();
379
+
380
+ //We need to get a different order if we already cancelled it on the profile edit page.
381
+ if( !empty( $_REQUEST['cancel_subscription'] ) ){
382
+ $order_status = 'cancelled';
383
+ } else {
384
+ $order_status = 'success';
385
+ }
386
+
387
+ $order->getLastMemberOrder( $user_ID, $order_status );
388
+
389
+ if( !empty( $order ) && !empty( $order->id ) ) {
390
+
391
+ //Gateways that we want to support this can run the action from their own class.
392
+ pmpro_refund_order( $order );
393
+
394
+ }
395
+
396
+ }
397
+
398
  }
399
  add_action( 'show_user_profile', 'pmpro_membership_level_profile_fields' );
400
  add_action( 'edit_user_profile', 'pmpro_membership_level_profile_fields' );
464
  <tr>
465
  <td><?php echo date_i18n( get_option( 'date_format'), $invoice->timestamp ); ?></td>
466
  <td class="order_code column-order_code has-row-actions">
467
+ <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-orders', 'order' => $invoice->id ), admin_url( 'admin.php' ) ) ); ?>"><?php echo esc_html( $invoice->code ); ?></a><br />
468
  <div class="row-actions">
469
  <span class="edit">
470
+ <a title="<?php esc_attr_e( 'Edit', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-orders', 'order' => $invoice->id ), admin_url('admin.php' ) ) ); ?>"><?php esc_html_e( 'Edit', 'paid-memberships-pro' ); ?></a>
471
  </span> |
472
  <span class="print">
473
+ <a target="_blank" title="<?php esc_attr_e( 'Print', 'paid-memberships-pro' ); ?>" href="<?php echo esc_url( add_query_arg( array( 'action' => 'pmpro_orders_print_view', 'order' => $invoice->id ), admin_url('admin-ajax.php' ) ) ); ?>"><?php esc_html_e( 'Print', 'paid-memberships-pro' ); ?></a>
474
  </span>
475
  <?php if ( function_exists( 'pmpro_add_email_order_modal' ) ) { ?>
476
  |
477
  <span class="email">
478
+ <a title="<?php esc_attr_e( 'Email', 'paid-memberships-pro' ); ?>" href="#TB_inline?width=600&height=200&inlineId=email_invoice" class="thickbox email_link" data-order="<?php echo esc_attr( $invoice->id ); ?>"><?php esc_html_e( 'Email', 'paid-memberships-pro' ); ?></a>
479
  </span>
480
  <?php } ?>
481
  </div> <!-- end .row-actions -->
827
  do_action( 'pmpro_show_user_profile', $current_user );
828
  ?>
829
  <input type="hidden" name="action" value="update-profile" />
830
+ <input type="hidden" name="user_id" value="<?php echo esc_attr( $current_user->ID ) ; ?>" />
831
  <div class="<?php echo pmpro_get_element_class( 'pmpro_submit' ); ?>">
832
  <hr />
833
+ <input type="submit" name="submit" class="<?php echo pmpro_get_element_class( 'pmpro_btn pmpro_btn-submit', 'pmpro_btn-submit' ); ?>" value="<?php esc_attr_e( 'Update Profile', 'paid-memberships-pro' );?>" />
834
+ <input type="button" name="cancel" class="<?php echo pmpro_get_element_class( 'pmpro_btn pmpro_btn-cancel', 'pmpro_btn-cancel' ); ?>" value="<?php esc_attr_e( 'Cancel', 'paid-memberships-pro' );?>" onclick="location.href='<?php echo pmpro_url( 'account'); ?>';" />
835
  </div>
836
  </form>
837
  </div> <!-- end pmpro_member_profile_edit_wrap -->
917
  function pmpro_change_password_form() {
918
  global $current_user, $pmpro_msg, $pmpro_msgt;
919
  ?>
920
+ <h2><?php esc_html_e( 'Change Password', 'paid-memberships-pro' ); ?></h2>
921
  <?php if ( ! empty( $pmpro_msg ) ) { ?>
922
  <div class="<?php echo pmpro_get_element_class( 'pmpro_message ' . $pmpro_msgt, $pmpro_msgt ); ?>">
923
  <?php echo esc_html( $pmpro_msg ); ?>
931
  <div class="<?php echo pmpro_get_element_class( 'pmpro_checkout_box-password' ); ?>">
932
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-fields' ); ?>">
933
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-field pmpro_change_password-field-password_current', 'pmpro_change_password-field-password_current' ); ?>">
934
+ <label for="password_current"><?php esc_html_e( 'Current Password', 'paid-memberships-pro' ); ?></label></th>
935
  <input type="password" name="password_current" id="password_current" value="" class="<?php echo pmpro_get_element_class( 'input', 'password_current' ); ?>" />
936
  <span class="<?php echo pmpro_get_element_class( 'pmpro_asterisk' ); ?>"> <abbr title="<?php _e( 'Required Field', 'paid-memberships-pro' ); ?>">*</abbr></span>
937
  </div> <!-- end pmpro_change_password-field-password_current -->
938
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-field pmpro_change_password-field-pass1', 'pmpro_change_password-field-pass1' ); ?>">
939
+ <label for="pass1"><?php esc_html_e( 'New Password', 'paid-memberships-pro' ); ?></label></th>
940
  <input type="password" name="pass1" id="pass1" value="" class="<?php echo pmpro_get_element_class( 'input pass1', 'pass1' ); ?>" autocomplete="off" />
941
  <span class="<?php echo pmpro_get_element_class( 'pmpro_asterisk' ); ?>"> <abbr title="<?php _e( 'Required Field', 'paid-memberships-pro' ); ?>">*</abbr></span>
942
+ <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php esc_html_e( 'Strength Indicator', 'paid-memberships-pro' ); ?></div>
943
  <p class="<?php echo pmpro_get_element_class( 'lite' ); ?>"><?php echo wp_get_password_hint(); ?></p>
944
  </div> <!-- end pmpro_change_password-field-pass1 -->
945
  <div class="<?php echo pmpro_get_element_class( 'pmpro_change_password-field pmpro_change_password-field-pass2', 'pmpro_change_password-field-pass2' ); ?>">
946
+ <label for="pass2"><?php esc_html_e( 'Confirm New Password', 'paid-memberships-pro' ); ?></label></th>
947
  <input type="password" name="pass2" id="pass2" value="" class="<?php echo pmpro_get_element_class( 'input', 'pass2' ); ?>" autocomplete="off" />
948
  <span class="<?php echo pmpro_get_element_class( 'pmpro_asterisk' ); ?>"> <abbr title="<?php _e( 'Required Field', 'paid-memberships-pro' ); ?>">*</abbr></span>
949
  </div> <!-- end pmpro_change_password-field-pass2 -->
includes/rest-api.php CHANGED
@@ -154,6 +154,21 @@ if ( class_exists( 'WP_REST_Controller' ) ) {
154
  ),
155
  ));
156
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  /**
158
  * Get membership level after checkout options are applied.
159
  * @since 2.4
@@ -685,6 +700,51 @@ if ( class_exists( 'WP_REST_Controller' ) ) {
685
  return new WP_REST_Response( $discount_code, 200 );
686
  }
687
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
688
  /**
689
  * Get a membership level at checkout.
690
  * Note: Not compatible with MMPU.
@@ -876,6 +936,7 @@ if ( class_exists( 'WP_REST_Controller' ) ) {
876
  `u`.`ID` AS `user_id`,
877
  `u`.`user_email`,
878
  `u`.`user_nicename`,
 
879
  `o`.`billing_name`,
880
  `o`.`billing_street`,
881
  `o`.`billing_city`,
@@ -929,6 +990,7 @@ if ( class_exists( 'WP_REST_Controller' ) ) {
929
  '/pmpro/v1/cancel_membership_level' => 'pmpro_edit_memberships',
930
  '/pmpro/v1/membership_level' => true,
931
  '/pmpro/v1/discount_code' => 'pmpro_discountcodes',
 
932
  '/pmpro/v1/checkout_level' => true,
933
  '/pmpro/v1/checkout_levels' => true,
934
  '/pmpro/v1/me' => true,
154
  ),
155
  ));
156
 
157
+ /**
158
+ * Retrieve an order.
159
+ * @since 2.8
160
+ * Example: https://example.com/wp-json/pmpro/v1/order
161
+ */
162
+ register_rest_route( $pmpro_namespace, '/order',
163
+ array(
164
+ array(
165
+ 'methods' => WP_REST_Server::READABLE,
166
+ 'callback' => array( $this, 'pmpro_rest_api_get_order' ),
167
+ 'permission_callback' => array( $this, 'pmpro_rest_api_get_permissions_check' )
168
+ ),
169
+ ));
170
+ add_filter( 'pmpro_rest_api_permissions', array( $this, 'pmpro_rest_api_permissions_get_order' ), 10, 2 );
171
+
172
  /**
173
  * Get membership level after checkout options are applied.
174
  * @since 2.4
700
  return new WP_REST_Response( $discount_code, 200 );
701
  }
702
 
703
+ /**
704
+ * Get an order.
705
+ * @since 2.8
706
+ * Example: https://example.com/wp-json/pmpro/v1/order
707
+ */
708
+ function pmpro_rest_api_get_order( $request ) {
709
+ if ( ! class_exists( 'MemberOrder' ) ) {
710
+ return new WP_REST_Response( 'Paid Memberships Pro order class not found.', 404 );
711
+ }
712
+
713
+ $params = $request->get_params();
714
+ $code = isset( $params['code'] ) ? sanitize_text_field( $params['code'] ) : null;
715
+
716
+ if ( empty( $code ) ) {
717
+ return new WP_REST_Response( 'No order code sent.', 400 );
718
+ }
719
+
720
+ return new WP_REST_Response( new MemberOrder( $code ), 200 );
721
+ }
722
+
723
+ /**
724
+ * Make sure that users can GET their own orders.
725
+ * @since 2.8
726
+ */
727
+ function pmpro_rest_api_permissions_get_order( $permission, $request ) {
728
+ $method = $request->get_method();
729
+ $route = $request->get_route();
730
+
731
+ // Check if the user does not have access but is trying to get an order.
732
+ if ( ! $permission && 'GET' === $method && '/pmpro/v1/order' === $route ) {
733
+ // Check if the order belongs to the user.
734
+ $params = $request->get_params();
735
+ $code = isset( $params['code'] ) ? sanitize_text_field( $params['code'] ) : null;
736
+
737
+ if ( ! empty( $code ) ) {
738
+ $order = new MemberOrder( $code );
739
+
740
+ if ( $order->user_id == get_current_user_id() ) {
741
+ return true;
742
+ }
743
+ }
744
+ }
745
+ return $permission;
746
+ }
747
+
748
  /**
749
  * Get a membership level at checkout.
750
  * Note: Not compatible with MMPU.
936
  `u`.`ID` AS `user_id`,
937
  `u`.`user_email`,
938
  `u`.`user_nicename`,
939
+ `o`.`membership_id`,
940
  `o`.`billing_name`,
941
  `o`.`billing_street`,
942
  `o`.`billing_city`,
990
  '/pmpro/v1/cancel_membership_level' => 'pmpro_edit_memberships',
991
  '/pmpro/v1/membership_level' => true,
992
  '/pmpro/v1/discount_code' => 'pmpro_discountcodes',
993
+ '/pmpro/v1/order' => 'pmpro_orders',
994
  '/pmpro/v1/checkout_level' => true,
995
  '/pmpro/v1/checkout_levels' => true,
996
  '/pmpro/v1/me' => true,
includes/updates.php CHANGED
@@ -147,7 +147,7 @@ function pmpro_show_notice_for_reports() {
147
 
148
  ?>
149
  <div class="notice notice-warning">
150
- <p><?php _e( sprintf( 'You currently have the Better Login Reports Add On activated. This functionality has now been merged into Paid Memberships Pro. %s', "<br/><a href='". esc_url( admin_url( '/plugins.php?s=better%20logins%20report%20add%20on&plugin_status=inactive&pmpro-deactivate-reports=true' ) ) . "'>Please deactivate and remove this plugin.</a>" ), 'paid-memberships-pro' ); ?></p>
151
  </div>
152
  <?php
153
  }
147
 
148
  ?>
149
  <div class="notice notice-warning">
150
+ <p><?php echo sprintf( __( 'You currently have the Better Login Reports Add On activated. This functionality has now been merged into Paid Memberships Pro. %s', 'paid-memberships-pro' ), "<br/><a href='". esc_url( admin_url( '/plugins.php?s=better%20logins%20report%20add%20on&plugin_status=inactive&pmpro-deactivate-reports=true' ) ) . "'>" . __( 'Please deactivate and remove this plugin.', 'paid-memberships-pro' ) . "</a>" ); ?></p>
151
  </div>
152
  <?php
153
  }
includes/updates/upgrade_1.php CHANGED
@@ -50,6 +50,9 @@ function pmpro_upgrade_1()
50
  //let's pause the nag for the first week of use
51
  $pmpro_nag_paused = current_time('timestamp')+(3600*24*7);
52
  update_option('pmpro_nag_paused', $pmpro_nag_paused, 'no');
 
 
 
53
 
54
  //db update
55
  pmpro_db_delta();
50
  //let's pause the nag for the first week of use
51
  $pmpro_nag_paused = current_time('timestamp')+(3600*24*7);
52
  update_option('pmpro_nag_paused', $pmpro_nag_paused, 'no');
53
+
54
+ //wisdom tracking turned off by default
55
+ pmpro_setOption('wisdom_opt_out', 1);
56
 
57
  //db update
58
  pmpro_db_delta();
includes/updates/upgrade_1_8_7.php CHANGED
@@ -3,17 +3,17 @@
3
  Remove extra cron jobs inserted in version 1.8.7 and 1.8.7.1
4
  */
5
  function pmpro_upgrade_1_8_7() {
6
-
7
  //fix cron jobs
8
  $jobs = _get_cron_array();
9
-
10
  // Remove all pmpro cron jobs (for now).
11
  foreach( $jobs as $when => $job_array ) {
12
 
13
  foreach($job_array as $name => $job) {
14
  //delete pmpro cron
15
  if ( false !== stripos( $name, 'pmpro_cron') )
16
- unset($jobs[$when][$name]);
17
  }
18
 
19
  //delete empty cron time slots
@@ -29,7 +29,7 @@ function pmpro_upgrade_1_8_7() {
29
  pmpro_maybe_schedule_event(current_time('timestamp')+1, 'daily', 'pmpro_cron_expiration_warnings');
30
  pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings');
31
 
32
- pmpro_setOption("db_version", "1.87");
33
 
34
  return 1.87;
35
- }
3
  Remove extra cron jobs inserted in version 1.8.7 and 1.8.7.1
4
  */
5
  function pmpro_upgrade_1_8_7() {
6
+
7
  //fix cron jobs
8
  $jobs = _get_cron_array();
9
+
10
  // Remove all pmpro cron jobs (for now).
11
  foreach( $jobs as $when => $job_array ) {
12
 
13
  foreach($job_array as $name => $job) {
14
  //delete pmpro cron
15
  if ( false !== stripos( $name, 'pmpro_cron') )
16
+ unset($jobs[$when][$name]);
17
  }
18
 
19
  //delete empty cron time slots
29
  pmpro_maybe_schedule_event(current_time('timestamp')+1, 'daily', 'pmpro_cron_expiration_warnings');
30
  pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings');
31
 
32
+ pmpro_setOption("db_version", "1.87");
33
 
34
  return 1.87;
35
+ }
includes/updates/upgrade_1_9_4.php CHANGED
@@ -23,8 +23,8 @@ function pmpro_upgrade_1_9_4() {
23
  function pmpro_upgrade_1_9_4_show_div_notice() {
24
  ?>
25
  <div class="notice notice-warning">
26
- <p><?php _e( 'We have detected that you are using a custom checkout page template for Paid Memberships Pro. This was recently changed and may need to be updated in order to display correctly.', 'paid-memberships-pro')?>
27
- <?php _e('If you notice UI issues after upgrading, <a href="https://www.paidmembershipspro.com/add-ons/table-layout-plugin-pages/">see this free add on to temporarily roll back to the table-based layout while you resolve the issues</a>.', 'paid-memberships-pro' ); ?> <a href="<?php echo add_query_arg('pmpro_div_notice_hide', '1', $_SERVER['REQUEST_URI']);?>"><?php _e( 'Dismiss', 'paid-memberships-pro' );?></a></p>
28
  </div>
29
  <?php
30
  }
@@ -37,4 +37,4 @@ function pmpro_update_1_9_4_notice_dismiss() {
37
  }
38
  }
39
 
40
- add_action( 'admin_init', 'pmpro_update_1_9_4_notice_dismiss' );
23
  function pmpro_upgrade_1_9_4_show_div_notice() {
24
  ?>
25
  <div class="notice notice-warning">
26
+ <p><?php esc_html_e( 'We have detected that you are using a custom checkout page template for Paid Memberships Pro. This was recently changed and may need to be updated in order to display correctly.', 'paid-memberships-pro')?>
27
+ <?php _e('If you notice UI issues after upgrading, <a href="https://www.paidmembershipspro.com/add-ons/table-layout-plugin-pages/">see this free add on to temporarily roll back to the table-based layout while you resolve the issues</a>.', 'paid-memberships-pro' ); ?> <a href="<?php echo esc_url( add_query_arg( 'pmpro_div_notice_hide', '1', $_SERVER['REQUEST_URI'] ) );?>"><?php esc_html_e( 'Dismiss', 'paid-memberships-pro' );?></a></p>
28
  </div>
29
  <?php
30
  }
37
  }
38
  }
39
 
40
+ add_action( 'admin_init', 'pmpro_update_1_9_4_notice_dismiss' );
includes/updates/upgrade_2_6.php CHANGED
@@ -36,7 +36,7 @@ function pmpro_upgrade_2_6() {
36
  if ( empty( $admin_billing ) ) {
37
  pmpro_setOption( 'email_billing_admin_disabled', 'true' );
38
  }
39
-
40
  // Reschedule cron job for hourly checks.
41
  $next = wp_next_scheduled( 'pmpro_cron_expire_memberships' );
42
  if ( ! empty( $next ) ) {
36
  if ( empty( $admin_billing ) ) {
37
  pmpro_setOption( 'email_billing_admin_disabled', 'true' );
38
  }
39
+
40
  // Reschedule cron job for hourly checks.
41
  $next = wp_next_scheduled( 'pmpro_cron_expire_memberships' );
42
  if ( ! empty( $next ) ) {
includes/upgradecheck.php CHANGED
@@ -267,8 +267,8 @@ function pmpro_checkForUpgrades()
267
  pmpro_db_delta();
268
  $pmpro_db_version = pmpro_upgrade_2_6();
269
  pmpro_setOption( 'db_version', '2.6' );
270
- }
271
-
272
  /**
273
  * Version 2.7.1
274
  * Running pmpro_db_delta to fix the primary key in a couple tables.
@@ -277,6 +277,15 @@ function pmpro_checkForUpgrades()
277
  pmpro_db_delta();
278
  pmpro_setOption( 'db_version', '2.71' );
279
  }
 
 
 
 
 
 
 
 
 
280
  }
281
 
282
  function pmpro_db_delta()
267
  pmpro_db_delta();
268
  $pmpro_db_version = pmpro_upgrade_2_6();
269
  pmpro_setOption( 'db_version', '2.6' );
270
+ }
271
+
272
  /**
273
  * Version 2.7.1
274
  * Running pmpro_db_delta to fix the primary key in a couple tables.
277
  pmpro_db_delta();
278
  pmpro_setOption( 'db_version', '2.71' );
279
  }
280
+
281
+ /**
282
+ * Version 2.8
283
+ * Default option for Wisdom tracking.
284
+ */
285
+ if ( $pmpro_db_version < 2.8 ) {
286
+ pmpro_setOption('wisdom_opt_out', 1);
287
+ pmpro_setOption( 'db_version', '2.8' );
288
+ }
289
  }
290
 
291
  function pmpro_db_delta()
js/blocks.build.js CHANGED
@@ -1,1883 +1 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
- /******/
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
- /******/
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId]) {
10
- /******/ return installedModules[moduleId].exports;
11
- /******/ }
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ i: moduleId,
15
- /******/ l: false,
16
- /******/ exports: {}
17
- /******/ };
18
- /******/
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
- /******/
22
- /******/ // Flag the module as loaded
23
- /******/ module.l = true;
24
- /******/
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
- /******/
29
- /******/
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
- /******/
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
- /******/
36
- /******/ // define getter function for harmony exports
37
- /******/ __webpack_require__.d = function(exports, name, getter) {
38
- /******/ if(!__webpack_require__.o(exports, name)) {
39
- /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
40
- /******/ }
41
- /******/ };
42
- /******/
43
- /******/ // define __esModule on exports
44
- /******/ __webpack_require__.r = function(exports) {
45
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47
- /******/ }
48
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
49
- /******/ };
50
- /******/
51
- /******/ // create a fake namespace object
52
- /******/ // mode & 1: value is a module id, require it
53
- /******/ // mode & 2: merge all properties of value into the ns
54
- /******/ // mode & 4: return value when already ns object
55
- /******/ // mode & 8|1: behave like require
56
- /******/ __webpack_require__.t = function(value, mode) {
57
- /******/ if(mode & 1) value = __webpack_require__(value);
58
- /******/ if(mode & 8) return value;
59
- /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60
- /******/ var ns = Object.create(null);
61
- /******/ __webpack_require__.r(ns);
62
- /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63
- /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64
- /******/ return ns;
65
- /******/ };
66
- /******/
67
- /******/ // getDefaultExport function for compatibility with non-harmony modules
68
- /******/ __webpack_require__.n = function(module) {
69
- /******/ var getter = module && module.__esModule ?
70
- /******/ function getDefault() { return module['default']; } :
71
- /******/ function getModuleExports() { return module; };
72
- /******/ __webpack_require__.d(getter, 'a', getter);
73
- /******/ return getter;
74
- /******/ };
75
- /******/
76
- /******/ // Object.prototype.hasOwnProperty.call
77
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78
- /******/
79
- /******/ // __webpack_public_path__
80
- /******/ __webpack_require__.p = "";
81
- /******/
82
- /******/
83
- /******/ // Load entry module and return exports
84
- /******/ return __webpack_require__(__webpack_require__.s = "./blocks/blocks.js");
85
- /******/ })
86
- /************************************************************************/
87
- /******/ ({
88
-
89
- /***/ "./blocks/account-invoices-section/block.js":
90
- /*!**************************************************!*\
91
- !*** ./blocks/account-invoices-section/block.js ***!
92
- \**************************************************/
93
- /*! exports provided: default */
94
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
95
-
96
- "use strict";
97
- __webpack_require__.r(__webpack_exports__);
98
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
99
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
100
-
101
-
102
- /**
103
- * Block: PMPro Membership Account: Invoices
104
- *
105
- * Displays the Membership Account > Invoices page section.
106
- *
107
- */
108
-
109
- /**
110
- * Internal block libraries
111
- */
112
- var __ = wp.i18n.__;
113
- var registerBlockType = wp.blocks.registerBlockType;
114
- /**
115
- * Register block
116
- */
117
-
118
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-invoices-section', {
119
- title: __('Membership Account: Invoices', 'paid-memberships-pro'),
120
- description: __('Displays the member\'s invoices.', 'paid-memberships-pro'),
121
- category: 'pmpro',
122
- icon: {
123
- background: '#2997c8',
124
- foreground: '#ffffff',
125
- src: 'archive'
126
- },
127
- keywords: [__('pmpro', 'paid-memberships-pro')],
128
- supports: {},
129
- attributes: {},
130
- edit: function edit() {
131
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
132
- className: "pmpro-block-element"
133
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
134
- className: "pmpro-block-title"
135
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
136
- className: "pmpro-block-subtitle"
137
- }, " ", __('Membership Account: Invoices', 'paid-memberships-pro')))];
138
- },
139
- save: function save() {
140
- return null;
141
- }
142
- }));
143
-
144
- /***/ }),
145
-
146
- /***/ "./blocks/account-links-section/block.js":
147
- /*!***********************************************!*\
148
- !*** ./blocks/account-links-section/block.js ***!
149
- \***********************************************/
150
- /*! exports provided: default */
151
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
152
-
153
- "use strict";
154
- __webpack_require__.r(__webpack_exports__);
155
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
156
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
157
-
158
-
159
- /**
160
- * Block: PMPro Membership Account: Member Links
161
- *
162
- * Displays the Membership Account > Member Links page section.
163
- *
164
- */
165
-
166
- /**
167
- * Internal block libraries
168
- */
169
- var __ = wp.i18n.__;
170
- var registerBlockType = wp.blocks.registerBlockType;
171
- /**
172
- * Register block
173
- */
174
-
175
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-links-section', {
176
- title: __('Membership Account: Links', 'paid-memberships-pro'),
177
- description: __('Displays the member\'s member links. This block is only visible if other Add Ons or custom code have added links.', 'paid-memberships-pro'),
178
- category: 'pmpro',
179
- icon: {
180
- background: '#2997c8',
181
- foreground: '#ffffff',
182
- src: 'external'
183
- },
184
- keywords: [__('pmpro', 'paid-memberships-pro')],
185
- supports: {},
186
- attributes: {},
187
- edit: function edit() {
188
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
189
- className: "pmpro-block-element"
190
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
191
- className: "pmpro-block-title"
192
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
193
- className: "pmpro-block-subtitle"
194
- }, __('Membership Account: Member Links', 'paid-memberships-pro')))];
195
- },
196
- save: function save() {
197
- return null;
198
- }
199
- }));
200
-
201
- /***/ }),
202
-
203
- /***/ "./blocks/account-membership-section/block.js":
204
- /*!****************************************************!*\
205
- !*** ./blocks/account-membership-section/block.js ***!
206
- \****************************************************/
207
- /*! exports provided: default */
208
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
209
-
210
- "use strict";
211
- __webpack_require__.r(__webpack_exports__);
212
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
213
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
214
-
215
-
216
- /**
217
- * Block: PMPro Membership Account: Memberships
218
- *
219
- * Displays the Membership Account > My Memberships page section.
220
- *
221
- */
222
-
223
- /**
224
- * Internal block libraries
225
- */
226
- var __ = wp.i18n.__;
227
- var registerBlockType = wp.blocks.registerBlockType;
228
- /**
229
- * Register block
230
- */
231
-
232
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-membership-section', {
233
- title: __('Membership Account: Memberships', 'paid-memberships-pro'),
234
- description: __('Displays the member\'s membership information.', 'paid-memberships-pro'),
235
- category: 'pmpro',
236
- icon: {
237
- background: '#2997c8',
238
- foreground: '#ffffff',
239
- src: 'groups'
240
- },
241
- keywords: [__('pmpro', 'paid-memberships-pro')],
242
- supports: {},
243
- attributes: {},
244
- edit: function edit() {
245
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
246
- className: "pmpro-block-element"
247
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
248
- className: "pmpro-block-title"
249
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
250
- className: "pmpro-block-subtitle"
251
- }, __('Membership Account: My Memberships', 'paid-memberships-pro')))];
252
- },
253
- save: function save() {
254
- return null;
255
- }
256
- }));
257
-
258
- /***/ }),
259
-
260
- /***/ "./blocks/account-page/block.js":
261
- /*!**************************************!*\
262
- !*** ./blocks/account-page/block.js ***!
263
- \**************************************/
264
- /*! exports provided: default */
265
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
266
-
267
- "use strict";
268
- __webpack_require__.r(__webpack_exports__);
269
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js");
270
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
271
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
272
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
273
- /* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inspector */ "./blocks/account-page/inspector.js");
274
-
275
-
276
-
277
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
278
-
279
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
280
-
281
- /**
282
- * Block: PMPro Membership Account
283
- *
284
- * Displays the Membership Account page.
285
- *
286
- */
287
-
288
- /**
289
- * Block dependencies
290
- */
291
-
292
- /**
293
- * Internal block libraries
294
- */
295
-
296
- var __ = wp.i18n.__;
297
- var registerBlockType = wp.blocks.registerBlockType;
298
- /**
299
- * Register block
300
- */
301
-
302
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-page', {
303
- title: __('Membership Account Page', 'paid-memberships-pro'),
304
- description: __('Displays the sections of the Membership Account page as selected below.', 'paid-memberships-pro'),
305
- category: 'pmpro',
306
- icon: {
307
- background: '#2997c8',
308
- foreground: '#ffffff',
309
- src: 'admin-users'
310
- },
311
- keywords: [__('pmpro', 'paid-memberships-pro')],
312
- supports: {},
313
- attributes: {
314
- membership: {
315
- type: 'boolean',
316
- default: false
317
- },
318
- profile: {
319
- type: 'boolean',
320
- default: false
321
- },
322
- invoices: {
323
- type: 'boolean',
324
- default: false
325
- },
326
- links: {
327
- type: 'boolean',
328
- default: false
329
- }
330
- },
331
- edit: function edit(props) {
332
- var setAttributes = props.setAttributes,
333
- isSelected = props.isSelected;
334
- return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_2__["default"], _objectSpread({
335
- setAttributes: setAttributes
336
- }, props)), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", {
337
- className: "pmpro-block-element"
338
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", {
339
- className: "pmpro-block-title"
340
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", {
341
- className: "pmpro-block-subtitle"
342
- }, __('Membership Account Page', 'paid-memberships-pro')))];
343
- },
344
- save: function save() {
345
- return null;
346
- }
347
- }));
348
-
349
- /***/ }),
350
-
351
- /***/ "./blocks/account-page/inspector.js":
352
- /*!******************************************!*\
353
- !*** ./blocks/account-page/inspector.js ***!
354
- \******************************************/
355
- /*! exports provided: default */
356
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
357
-
358
- "use strict";
359
- __webpack_require__.r(__webpack_exports__);
360
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; });
361
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js");
362
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
363
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js");
364
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
365
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js");
366
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);
367
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
368
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
369
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js");
370
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
371
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
372
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__);
373
-
374
-
375
-
376
-
377
-
378
-
379
-
380
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }
381
-
382
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
383
-
384
- /**
385
- * Internal block libraries
386
- */
387
- var __ = wp.i18n.__;
388
- var Component = wp.element.Component;
389
- var _wp$components = wp.components,
390
- PanelBody = _wp$components.PanelBody,
391
- CheckboxControl = _wp$components.CheckboxControl;
392
- var InspectorControls = wp.blockEditor.InspectorControls;
393
- /**
394
- * Create an Inspector Controls wrapper Component
395
- */
396
-
397
- var Inspector = /*#__PURE__*/function (_Component) {
398
- _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component);
399
-
400
- var _super = _createSuper(Inspector);
401
-
402
- function Inspector() {
403
- _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector);
404
-
405
- return _super.apply(this, arguments);
406
- }
407
-
408
- _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{
409
- key: "render",
410
- value: function render() {
411
- var _this$props = this.props,
412
- _this$props$attribute = _this$props.attributes,
413
- membership = _this$props$attribute.membership,
414
- profile = _this$props$attribute.profile,
415
- invoices = _this$props$attribute.invoices,
416
- links = _this$props$attribute.links,
417
- setAttributes = _this$props.setAttributes;
418
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, {
419
- label: __("Show 'My Memberships' Section", 'paid-memberships-pro'),
420
- checked: membership,
421
- onChange: function onChange(membership) {
422
- return setAttributes({
423
- membership: membership
424
- });
425
- }
426
- })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, {
427
- label: __("Show 'Profile' Section", 'paid-memberships-pro'),
428
- checked: profile,
429
- onChange: function onChange(profile) {
430
- return setAttributes({
431
- profile: profile
432
- });
433
- }
434
- })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, {
435
- label: __("Show 'Invoices' Section", 'paid-memberships-pro'),
436
- checked: invoices,
437
- onChange: function onChange(invoices) {
438
- return setAttributes({
439
- invoices: invoices
440
- });
441
- }
442
- })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, {
443
- label: __("Show 'Member Links' Section", 'paid-memberships-pro'),
444
- checked: links,
445
- onChange: function onChange(links) {
446
- return setAttributes({
447
- links: links
448
- });
449
- }
450
- })));
451
- }
452
- }]);
453
-
454
- return Inspector;
455
- }(Component);
456
-
457
-
458
-
459
- /***/ }),
460
-
461
- /***/ "./blocks/account-profile-section/block.js":
462
- /*!*************************************************!*\
463
- !*** ./blocks/account-profile-section/block.js ***!
464
- \*************************************************/
465
- /*! exports provided: default */
466
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
467
-
468
- "use strict";
469
- __webpack_require__.r(__webpack_exports__);
470
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
471
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
472
-
473
-
474
- /**
475
- * Block: PMPro Checkout Button
476
- *
477
- * Add a styled link to the PMPro checkout page for a
478
- * specific level.
479
- *
480
- */
481
-
482
- /**
483
- * Internal block libraries
484
- */
485
- var __ = wp.i18n.__;
486
- var registerBlockType = wp.blocks.registerBlockType;
487
- /**
488
- * Register block
489
- */
490
-
491
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-profile-section', {
492
- title: __('Membership Account: Profile', 'paid-memberships-pro'),
493
- description: __('Displays the member\'s profile information.', 'paid-memberships-pro'),
494
- category: 'pmpro',
495
- icon: {
496
- background: '#2997c8',
497
- foreground: '#ffffff',
498
- src: 'admin-users'
499
- },
500
- keywords: [__('pmpro', 'paid-memberships-pro')],
501
- supports: {},
502
- attributes: {},
503
- edit: function edit() {
504
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
505
- className: "pmpro-block-element"
506
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
507
- className: "pmpro-block-title"
508
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
509
- className: "pmpro-block-subtitle"
510
- }, __('Membership Account: Profile', 'paid-memberships-pro')))];
511
- },
512
- save: function save() {
513
- return null;
514
- }
515
- }));
516
-
517
- /***/ }),
518
-
519
- /***/ "./blocks/billing-page/block.js":
520
- /*!**************************************!*\
521
- !*** ./blocks/billing-page/block.js ***!
522
- \**************************************/
523
- /*! exports provided: default */
524
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
525
-
526
- "use strict";
527
- __webpack_require__.r(__webpack_exports__);
528
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
529
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
530
-
531
-
532
- /**
533
- * Block: PMPro Membership Billing
534
- *
535
- * Displays the Membership Billing page and form.
536
- *
537
- */
538
-
539
- /**
540
- * Internal block libraries
541
- */
542
- var __ = wp.i18n.__;
543
- var registerBlockType = wp.blocks.registerBlockType;
544
- /**
545
- * Register block
546
- */
547
-
548
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/billing-page', {
549
- title: __('Membership Billing Page', 'paid-memberships-pro'),
550
- description: __('Displays the member\'s billing information and allows them to update the payment method.', 'paid-memberships-pro'),
551
- category: 'pmpro',
552
- icon: {
553
- background: '#2997c8',
554
- foreground: '#ffffff',
555
- src: 'list-view'
556
- },
557
- keywords: [__('pmpro', 'paid-memberships-pro')],
558
- supports: {},
559
- attributes: {},
560
- edit: function edit() {
561
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
562
- className: "pmpro-block-element"
563
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
564
- className: "pmpro-block-title"
565
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
566
- className: "pmpro-block-subtitle"
567
- }, __('Membership Billing Page', 'paid-memberships-pro')))];
568
- },
569
- save: function save() {
570
- return null;
571
- }
572
- }));
573
-
574
- /***/ }),
575
-
576
- /***/ "./blocks/blocks.js":
577
- /*!**************************!*\
578
- !*** ./blocks/blocks.js ***!
579
- \**************************/
580
- /*! no exports provided */
581
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
582
-
583
- "use strict";
584
- __webpack_require__.r(__webpack_exports__);
585
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
586
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
587
- /* harmony import */ var _i18n_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./i18n.js */ "./blocks/i18n.js");
588
- /* harmony import */ var _i18n_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_i18n_js__WEBPACK_IMPORTED_MODULE_1__);
589
- /* harmony import */ var _checkout_button_block_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./checkout-button/block.js */ "./blocks/checkout-button/block.js");
590
- /* harmony import */ var _account_page_block_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./account-page/block.js */ "./blocks/account-page/block.js");
591
- /* harmony import */ var _account_membership_section_block_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./account-membership-section/block.js */ "./blocks/account-membership-section/block.js");
592
- /* harmony import */ var _account_profile_section_block_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./account-profile-section/block.js */ "./blocks/account-profile-section/block.js");
593
- /* harmony import */ var _account_invoices_section_block_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./account-invoices-section/block.js */ "./blocks/account-invoices-section/block.js");
594
- /* harmony import */ var _account_links_section_block_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./account-links-section/block.js */ "./blocks/account-links-section/block.js");
595
- /* harmony import */ var _billing_page_block_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./billing-page/block.js */ "./blocks/billing-page/block.js");
596
- /* harmony import */ var _cancel_page_block_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./cancel-page/block.js */ "./blocks/cancel-page/block.js");
597
- /* harmony import */ var _checkout_page_block_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./checkout-page/block.js */ "./blocks/checkout-page/block.js");
598
- /* harmony import */ var _confirmation_page_block_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./confirmation-page/block.js */ "./blocks/confirmation-page/block.js");
599
- /* harmony import */ var _invoice_page_block_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./invoice-page/block.js */ "./blocks/invoice-page/block.js");
600
- /* harmony import */ var _levels_page_block_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./levels-page/block.js */ "./blocks/levels-page/block.js");
601
- /* harmony import */ var _membership_block_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./membership/block.js */ "./blocks/membership/block.js");
602
- /* harmony import */ var _member_profile_edit_block_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./member-profile-edit/block.js */ "./blocks/member-profile-edit/block.js");
603
- /* harmony import */ var _login_block_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./login/block.js */ "./blocks/login/block.js");
604
-
605
-
606
- /**
607
- * Import internationalization
608
- */
609
-
610
- /**
611
- * Import registerBlockType blocks
612
- */
613
-
614
-
615
-
616
-
617
-
618
-
619
-
620
-
621
-
622
-
623
-
624
-
625
-
626
-
627
-
628
-
629
-
630
- (function () {
631
- var PMProSVG = Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("svg", {
632
- version: "1.1",
633
- id: "Layer_1",
634
- x: "0px",
635
- y: "0px",
636
- viewBox: "0 0 18 18"
637
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("path", {
638
- d: "M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"
639
- }));
640
- wp.blocks.updateCategory('pmpro', {
641
- icon: PMProSVG
642
- });
643
- })();
644
-
645
- /***/ }),
646
-
647
- /***/ "./blocks/cancel-page/block.js":
648
- /*!*************************************!*\
649
- !*** ./blocks/cancel-page/block.js ***!
650
- \*************************************/
651
- /*! exports provided: default */
652
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
653
-
654
- "use strict";
655
- __webpack_require__.r(__webpack_exports__);
656
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
657
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
658
-
659
-
660
- /**
661
- * Block: PMPro Membership Cancel
662
- *
663
- * Displays the Membership Cancel page.
664
- *
665
- */
666
-
667
- /**
668
- * Internal block libraries
669
- */
670
- var __ = wp.i18n.__;
671
- var registerBlockType = wp.blocks.registerBlockType;
672
- /**
673
- * Register block
674
- */
675
-
676
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/cancel-page', {
677
- title: __('Membership Cancel Page', 'paid-memberships-pro'),
678
- description: __('Generates the Membership Cancel page.', 'paid-memberships-pro'),
679
- category: 'pmpro',
680
- icon: {
681
- background: '#2997c8',
682
- foreground: '#ffffff',
683
- src: 'no'
684
- },
685
- keywords: [__('pmpro', 'paid-memberships-pro')],
686
- supports: {},
687
- attributes: {},
688
- edit: function edit() {
689
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
690
- className: "pmpro-block-element"
691
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
692
- className: "pmpro-block-title"
693
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
694
- className: "pmpro-block-subtitle"
695
- }, __('Membership Cancel Page', 'paid-memberships-pro')))];
696
- },
697
- save: function save() {
698
- return null;
699
- }
700
- }));
701
-
702
- /***/ }),
703
-
704
- /***/ "./blocks/checkout-button/block.js":
705
- /*!*****************************************!*\
706
- !*** ./blocks/checkout-button/block.js ***!
707
- \*****************************************/
708
- /*! exports provided: default */
709
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
710
-
711
- "use strict";
712
- __webpack_require__.r(__webpack_exports__);
713
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js");
714
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
715
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
716
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
717
- /* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inspector */ "./blocks/checkout-button/inspector.js");
718
-
719
-
720
-
721
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
722
-
723
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
724
-
725
- /**
726
- * Block: PMPro Checkout Button
727
- *
728
- * Add a styled link to the PMPro checkout page for a specific level.
729
- *
730
- */
731
-
732
- /**
733
- * Block dependencies
734
- */
735
-
736
- /**
737
- * Internal block libraries
738
- */
739
-
740
- var __ = wp.i18n.__;
741
- var registerBlockType = wp.blocks.registerBlockType;
742
- var _wp$components = wp.components,
743
- TextControl = _wp$components.TextControl,
744
- SelectControl = _wp$components.SelectControl;
745
- /**
746
- * Register block
747
- */
748
-
749
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/checkout-button', {
750
- title: __('Membership Checkout Button', 'paid-memberships-pro'),
751
- description: __('Displays a button-styled link to Membership Checkout for the specified level.', 'paid-memberships-pro'),
752
- category: 'pmpro',
753
- icon: {
754
- background: '#2997c8',
755
- foreground: '#ffffff',
756
- src: 'migrate'
757
- },
758
- keywords: [__('pmpro', 'paid-memberships-pro'), __('buy', 'paid-memberships-pro'), __('level', 'paid-memberships-pro')],
759
- supports: {},
760
- attributes: {
761
- text: {
762
- type: 'string',
763
- default: 'Buy Now'
764
- },
765
- css_class: {
766
- type: 'string',
767
- default: 'pmpro_btn'
768
- },
769
- level: {
770
- type: 'string'
771
- }
772
- },
773
- edit: function edit(props) {
774
- var _props$attributes = props.attributes,
775
- text = _props$attributes.text,
776
- level = _props$attributes.level,
777
- css_class = _props$attributes.css_class,
778
- className = props.className,
779
- setAttributes = props.setAttributes,
780
- isSelected = props.isSelected;
781
- return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_2__["default"], _objectSpread({
782
- setAttributes: setAttributes
783
- }, props)), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", {
784
- className: className
785
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("a", {
786
- class: css_class
787
- }, text)), isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", {
788
- className: "pmpro-block-element"
789
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(TextControl, {
790
- label: __('Button Text', 'paid-memberships-pro'),
791
- value: text,
792
- onChange: function onChange(text) {
793
- return setAttributes({
794
- text: text
795
- });
796
- }
797
- }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(SelectControl, {
798
- label: __('Membership Level', 'paid-memberships-pro'),
799
- value: level,
800
- onChange: function onChange(level) {
801
- return setAttributes({
802
- level: level
803
- });
804
- },
805
- options: window.pmpro.all_level_values_and_labels
806
- }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(TextControl, {
807
- label: __('CSS Class', 'paid-memberships-pro'),
808
- value: css_class,
809
- onChange: function onChange(css_class) {
810
- return setAttributes({
811
- css_class: css_class
812
- });
813
- }
814
- }))];
815
- },
816
- save: function save() {
817
- return null;
818
- }
819
- }));
820
-
821
- /***/ }),
822
-
823
- /***/ "./blocks/checkout-button/inspector.js":
824
- /*!*********************************************!*\
825
- !*** ./blocks/checkout-button/inspector.js ***!
826
- \*********************************************/
827
- /*! exports provided: default */
828
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
829
-
830
- "use strict";
831
- __webpack_require__.r(__webpack_exports__);
832
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; });
833
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js");
834
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
835
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js");
836
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
837
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js");
838
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);
839
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
840
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
841
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js");
842
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
843
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
844
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__);
845
-
846
-
847
-
848
-
849
-
850
-
851
-
852
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }
853
-
854
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
855
-
856
- /**
857
- * Internal block libraries
858
- */
859
- var __ = wp.i18n.__;
860
- var Component = wp.element.Component;
861
- var _wp$components = wp.components,
862
- PanelBody = _wp$components.PanelBody,
863
- TextControl = _wp$components.TextControl,
864
- SelectControl = _wp$components.SelectControl;
865
- var InspectorControls = wp.blockEditor.InspectorControls;
866
- /**
867
- * Create an Inspector Controls wrapper Component
868
- */
869
-
870
- var Inspector = /*#__PURE__*/function (_Component) {
871
- _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component);
872
-
873
- var _super = _createSuper(Inspector);
874
-
875
- function Inspector() {
876
- _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector);
877
-
878
- return _super.apply(this, arguments);
879
- }
880
-
881
- _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{
882
- key: "render",
883
- value: function render() {
884
- var _this$props = this.props,
885
- _this$props$attribute = _this$props.attributes,
886
- text = _this$props$attribute.text,
887
- level = _this$props$attribute.level,
888
- css_class = _this$props$attribute.css_class,
889
- setAttributes = _this$props.setAttributes;
890
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(TextControl, {
891
- label: __('Button Text', 'paid-memberships-pro'),
892
- help: __('Text for checkout button', 'paid-memberships-pro'),
893
- value: text,
894
- onChange: function onChange(text) {
895
- return setAttributes({
896
- text: text
897
- });
898
- }
899
- })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(SelectControl, {
900
- label: __('Level', 'paid-memberships-pro'),
901
- help: __('The level to link to for checkout button', 'paid-memberships-pro'),
902
- value: level,
903
- onChange: function onChange(level) {
904
- return setAttributes({
905
- level: level
906
- });
907
- },
908
- options: window.pmpro.all_level_values_and_labels
909
- })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(TextControl, {
910
- label: __('CSS Class', 'paid-memberships-pro'),
911
- help: __('Additional styling for checkout button', 'paid-memberships-pro'),
912
- value: css_class,
913
- onChange: function onChange(css_class) {
914
- return setAttributes({
915
- css_class: css_class
916
- });
917
- }
918
- })));
919
- }
920
- }]);
921
-
922
- return Inspector;
923
- }(Component);
924
-
925
-
926
-
927
- /***/ }),
928
-
929
- /***/ "./blocks/checkout-page/block.js":
930
- /*!***************************************!*\
931
- !*** ./blocks/checkout-page/block.js ***!
932
- \***************************************/
933
- /*! exports provided: default */
934
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
935
-
936
- "use strict";
937
- __webpack_require__.r(__webpack_exports__);
938
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js");
939
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
940
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
941
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
942
- /* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inspector */ "./blocks/checkout-page/inspector.js");
943
-
944
-
945
-
946
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
947
-
948
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
949
-
950
- /**
951
- * Block: PMPro Membership Checkout
952
- *
953
- * Displays the Membership Checkout form.
954
- *
955
- */
956
-
957
- /**
958
- * Block dependencies
959
- */
960
-
961
- /**
962
- * Internal block libraries
963
- */
964
-
965
- var __ = wp.i18n.__;
966
- var registerBlockType = wp.blocks.registerBlockType;
967
- var SelectControl = wp.components.SelectControl;
968
- /**
969
- * Register block
970
- */
971
-
972
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/checkout-page', {
973
- title: __('Membership Checkout Form', 'paid-memberships-pro'),
974
- description: __('Displays the Membership Checkout form.', 'paid-memberships-pro'),
975
- category: 'pmpro',
976
- icon: {
977
- background: '#2997c8',
978
- foreground: '#ffffff',
979
- src: 'list-view'
980
- },
981
- keywords: [__('pmpro', 'paid-memberships-pro')],
982
- supports: {},
983
- attributes: {
984
- pmpro_default_level: {
985
- type: 'string',
986
- source: 'meta',
987
- meta: 'pmpro_default_level'
988
- }
989
- },
990
- edit: function edit(props) {
991
- var pmpro_default_level = props.attributes.pmpro_default_level,
992
- className = props.className,
993
- setAttributes = props.setAttributes,
994
- isSelected = props.isSelected;
995
- return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_2__["default"], _objectSpread({
996
- setAttributes: setAttributes
997
- }, props)), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", {
998
- className: "pmpro-block-element"
999
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", {
1000
- className: "pmpro-block-title"
1001
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", {
1002
- className: "pmpro-block-subtitle"
1003
- }, __('Membership Checkout Form', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("hr", null), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(SelectControl, {
1004
- label: __('Membership Level', 'paid-memberships-pro'),
1005
- value: pmpro_default_level,
1006
- onChange: function onChange(pmpro_default_level) {
1007
- return setAttributes({
1008
- pmpro_default_level: pmpro_default_level
1009
- });
1010
- },
1011
- options: window.pmpro.all_level_values_and_labels
1012
- }))];
1013
- },
1014
- save: function save() {
1015
- return null;
1016
- }
1017
- }));
1018
-
1019
- /***/ }),
1020
-
1021
- /***/ "./blocks/checkout-page/inspector.js":
1022
- /*!*******************************************!*\
1023
- !*** ./blocks/checkout-page/inspector.js ***!
1024
- \*******************************************/
1025
- /*! exports provided: default */
1026
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1027
-
1028
- "use strict";
1029
- __webpack_require__.r(__webpack_exports__);
1030
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; });
1031
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js");
1032
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
1033
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js");
1034
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
1035
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js");
1036
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);
1037
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
1038
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
1039
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js");
1040
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
1041
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1042
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__);
1043
-
1044
-
1045
-
1046
-
1047
-
1048
-
1049
-
1050
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }
1051
-
1052
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
1053
-
1054
- /**
1055
- * Internal block libraries
1056
- */
1057
- var __ = wp.i18n.__;
1058
- var Component = wp.element.Component;
1059
- var _wp$components = wp.components,
1060
- PanelBody = _wp$components.PanelBody,
1061
- PanelRow = _wp$components.PanelRow,
1062
- SelectControl = _wp$components.SelectControl;
1063
- var InspectorControls = wp.blockEditor.InspectorControls;
1064
- /**
1065
- * Create an Inspector Controls wrapper Component
1066
- */
1067
-
1068
- var Inspector = /*#__PURE__*/function (_Component) {
1069
- _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component);
1070
-
1071
- var _super = _createSuper(Inspector);
1072
-
1073
- function Inspector() {
1074
- _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector);
1075
-
1076
- return _super.apply(this, arguments);
1077
- }
1078
-
1079
- _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{
1080
- key: "render",
1081
- value: function render() {
1082
- var _this$props = this.props,
1083
- pmpro_default_level = _this$props.attributes.pmpro_default_level,
1084
- setAttributes = _this$props.setAttributes;
1085
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(SelectControl, {
1086
- label: __('Membership Level', 'paid-memberships-pro'),
1087
- help: __('Choose a default level for Membership Checkout.', 'paid-memberships-pro'),
1088
- value: pmpro_default_level,
1089
- onChange: function onChange(pmpro_default_level) {
1090
- return setAttributes({
1091
- pmpro_default_level: pmpro_default_level
1092
- });
1093
- },
1094
- options: [''].concat(window.pmpro.all_level_values_and_labels)
1095
- })));
1096
- }
1097
- }]);
1098
-
1099
- return Inspector;
1100
- }(Component);
1101
-
1102
-
1103
-
1104
- /***/ }),
1105
-
1106
- /***/ "./blocks/confirmation-page/block.js":
1107
- /*!*******************************************!*\
1108
- !*** ./blocks/confirmation-page/block.js ***!
1109
- \*******************************************/
1110
- /*! exports provided: default */
1111
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1112
-
1113
- "use strict";
1114
- __webpack_require__.r(__webpack_exports__);
1115
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1116
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
1117
-
1118
-
1119
- /**
1120
- * Block: PMPro Membership Confirmation
1121
- *
1122
- * Displays the Membership Confirmation template.
1123
- *
1124
- */
1125
-
1126
- /**
1127
- * Internal block libraries
1128
- */
1129
- var __ = wp.i18n.__;
1130
- var registerBlockType = wp.blocks.registerBlockType;
1131
- /**
1132
- * Register block
1133
- */
1134
-
1135
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/confirmation-page', {
1136
- title: __('Membership Confirmation Page', 'paid-memberships-pro'),
1137
- description: __('Displays the member\'s Membership Confirmation after Membership Checkout.', 'paid-memberships-pro'),
1138
- category: 'pmpro',
1139
- icon: {
1140
- background: '#2997c8',
1141
- foreground: '#ffffff',
1142
- src: 'yes'
1143
- },
1144
- keywords: [__('pmpro', 'paid-memberships-pro')],
1145
- supports: {},
1146
- attributes: {},
1147
- edit: function edit() {
1148
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1149
- className: "pmpro-block-element"
1150
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1151
- className: "pmpro-block-title"
1152
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1153
- className: "pmpro-block-subtitle"
1154
- }, __('Membership Confirmation Page', 'paid-memberships-pro')))];
1155
- },
1156
- save: function save() {
1157
- return null;
1158
- }
1159
- }));
1160
-
1161
- /***/ }),
1162
-
1163
- /***/ "./blocks/i18n.js":
1164
- /*!************************!*\
1165
- !*** ./blocks/i18n.js ***!
1166
- \************************/
1167
- /*! no static exports found */
1168
- /***/ (function(module, exports) {
1169
-
1170
- wp.i18n.setLocaleData({
1171
- '': {}
1172
- }, 'paid-memberships-pro');
1173
-
1174
- /***/ }),
1175
-
1176
- /***/ "./blocks/invoice-page/block.js":
1177
- /*!**************************************!*\
1178
- !*** ./blocks/invoice-page/block.js ***!
1179
- \**************************************/
1180
- /*! exports provided: default */
1181
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1182
-
1183
- "use strict";
1184
- __webpack_require__.r(__webpack_exports__);
1185
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1186
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
1187
-
1188
-
1189
- /**
1190
- * Block: PMPro Membership Invoices
1191
- *
1192
- * Displays the Membership Invoices template.
1193
- *
1194
- */
1195
-
1196
- /**
1197
- * Internal block libraries
1198
- */
1199
- var __ = wp.i18n.__;
1200
- var registerBlockType = wp.blocks.registerBlockType;
1201
- /**
1202
- * Register block
1203
- */
1204
-
1205
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/invoice-page', {
1206
- title: __('Membership Invoice Page', 'paid-memberships-pro'),
1207
- description: __('Displays the member\'s Membership Invoices.', 'paid-memberships-pro'),
1208
- category: 'pmpro',
1209
- icon: {
1210
- background: '#2997c8',
1211
- foreground: '#ffffff',
1212
- src: 'archive'
1213
- },
1214
- keywords: [__('pmpro', 'paid-memberships-pro')],
1215
- supports: {},
1216
- attributes: {},
1217
- edit: function edit() {
1218
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1219
- className: "pmpro-block-element"
1220
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1221
- className: "pmpro-block-title"
1222
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1223
- className: "pmpro-block-subtitle"
1224
- }, __('Membership Invoices', 'paid-memberships-pro')))];
1225
- },
1226
- save: function save() {
1227
- return null;
1228
- }
1229
- }));
1230
-
1231
- /***/ }),
1232
-
1233
- /***/ "./blocks/levels-page/block.js":
1234
- /*!*************************************!*\
1235
- !*** ./blocks/levels-page/block.js ***!
1236
- \*************************************/
1237
- /*! exports provided: default */
1238
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1239
-
1240
- "use strict";
1241
- __webpack_require__.r(__webpack_exports__);
1242
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1243
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
1244
-
1245
-
1246
- /**
1247
- * Block: PMPro Membership Levels
1248
- *
1249
- * Displays the Membership Levels template.
1250
- *
1251
- */
1252
-
1253
- /**
1254
- * Internal block libraries
1255
- */
1256
- var __ = wp.i18n.__;
1257
- var registerBlockType = wp.blocks.registerBlockType;
1258
- /**
1259
- * Register block
1260
- */
1261
-
1262
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/levels-page', {
1263
- title: __('Membership Levels List', 'paid-memberships-pro'),
1264
- description: __('Displays a list of Membership Levels. To change the order, go to Memberships > Settings > Levels.', 'paid-memberships-pro'),
1265
- category: 'pmpro',
1266
- icon: {
1267
- background: '#2997c8',
1268
- foreground: '#ffffff',
1269
- src: 'list-view'
1270
- },
1271
- keywords: [__('pmpro', 'paid-memberships-pro')],
1272
- supports: {},
1273
- attributes: {},
1274
- edit: function edit() {
1275
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1276
- className: "pmpro-block-element"
1277
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1278
- className: "pmpro-block-title"
1279
- }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1280
- className: "pmpro-block-subtitle"
1281
- }, __('Membership Levels List', 'paid-memberships-pro')))];
1282
- },
1283
- save: function save() {
1284
- return null;
1285
- }
1286
- }));
1287
-
1288
- /***/ }),
1289
-
1290
- /***/ "./blocks/login/block.js":
1291
- /*!*******************************!*\
1292
- !*** ./blocks/login/block.js ***!
1293
- \*******************************/
1294
- /*! exports provided: default */
1295
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1296
-
1297
- "use strict";
1298
- __webpack_require__.r(__webpack_exports__);
1299
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1300
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
1301
- /* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inspector */ "./blocks/login/inspector.js");
1302
-
1303
-
1304
- /**
1305
- * Block: PMPro Login Form
1306
- *
1307
- * Add a login form to any page or post.
1308
- *
1309
- */
1310
-
1311
- /**
1312
- * Block dependencies
1313
- */
1314
-
1315
- /**
1316
- * Internal block libraries
1317
- */
1318
-
1319
- var __ = wp.i18n.__;
1320
- var registerBlockType = wp.blocks.registerBlockType;
1321
- var Fragment = wp.element.Fragment;
1322
- /**
1323
- * Register block
1324
- */
1325
-
1326
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType("pmpro/login-form", {
1327
- title: __("Log in Form", "paid-memberships-pro"),
1328
- description: __("Displays a Log In Form for Paid Memberships Pro.", "paid-memberships-pro"),
1329
- category: "pmpro",
1330
- icon: {
1331
- background: "#2997c8",
1332
- foreground: "#ffffff",
1333
- src: "unlock"
1334
- },
1335
- keywords: [__("pmpro", "paid-memberships-pro"), __("login", "paid-memberships-pro"), __("form", "paid-memberships-pro"), __("log in", "paid-memberships-pro")],
1336
- supports: {},
1337
- edit: function edit(props) {
1338
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(Fragment, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_1__["default"], props), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1339
- className: "pmpro-block-element"
1340
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1341
- className: "pmpro-block-title"
1342
- }, __("Paid Memberships Pro", "paid-memberships-pro")), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1343
- className: "pmpro-block-subtitle"
1344
- }, __("Log in Form", "paid-memberships-pro"))))];
1345
- },
1346
- save: function save() {
1347
- return null;
1348
- }
1349
- }));
1350
-
1351
- /***/ }),
1352
-
1353
- /***/ "./blocks/login/inspector.js":
1354
- /*!***********************************!*\
1355
- !*** ./blocks/login/inspector.js ***!
1356
- \***********************************/
1357
- /*! exports provided: default */
1358
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1359
-
1360
- "use strict";
1361
- __webpack_require__.r(__webpack_exports__);
1362
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; });
1363
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js");
1364
- /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
1365
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js");
1366
- /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
1367
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js");
1368
- /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);
1369
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
1370
- /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
1371
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js");
1372
- /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
1373
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1374
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__);
1375
-
1376
-
1377
-
1378
-
1379
-
1380
-
1381
-
1382
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }
1383
-
1384
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
1385
-
1386
- /**
1387
- * Internal block libraries
1388
- */
1389
- var __ = wp.i18n.__;
1390
- var Component = wp.element.Component;
1391
- var _wp$components = wp.components,
1392
- PanelBody = _wp$components.PanelBody,
1393
- SelectControl = _wp$components.SelectControl,
1394
- ToggleControl = _wp$components.ToggleControl;
1395
- var InspectorControls = wp.blockEditor.InspectorControls;
1396
- /**
1397
- * Create an Inspector Controls wrapper Component
1398
- */
1399
-
1400
- var Inspector = /*#__PURE__*/function (_Component) {
1401
- _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component);
1402
-
1403
- var _super = _createSuper(Inspector);
1404
-
1405
- function Inspector() {
1406
- _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector);
1407
-
1408
- return _super.apply(this, arguments);
1409
- }
1410
-
1411
- _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{
1412
- key: "render",
1413
- value: function render() {
1414
- var _this = this;
1415
-
1416
- var _this$props = this.props,
1417
- attributes = _this$props.attributes,
1418
- setAttributes = _this$props.setAttributes;
1419
- var display_if_logged_in = attributes.display_if_logged_in,
1420
- show_menu = attributes.show_menu,
1421
- show_logout_link = attributes.show_logout_link,
1422
- location = attributes.location;
1423
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(ToggleControl, {
1424
- label: __("Display 'Welcome' content when logged in.", "paid-memberships-pro"),
1425
- checked: display_if_logged_in,
1426
- onChange: function onChange(value) {
1427
- _this.props.setAttributes({
1428
- display_if_logged_in: value
1429
- });
1430
- }
1431
- }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(ToggleControl, {
1432
- label: __("Display the 'Log In Widget' menu.", "paid-memberships-pro"),
1433
- help: __("Assign the menu under Appearance > Menus.", "paid-memberships-pro"),
1434
- checked: show_menu,
1435
- onChange: function onChange(value) {
1436
- _this.props.setAttributes({
1437
- show_menu: value
1438
- });
1439
- }
1440
- }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(ToggleControl, {
1441
- label: __("Display a 'Log Out' link.", "paid-memberships-pro"),
1442
- checked: show_logout_link,
1443
- onChange: function onChange(value) {
1444
- _this.props.setAttributes({
1445
- show_logout_link: value
1446
- });
1447
- }
1448
- })));
1449
- }
1450
- }]);
1451
-
1452
- return Inspector;
1453
- }(Component);
1454
-
1455
-
1456
-
1457
- /***/ }),
1458
-
1459
- /***/ "./blocks/member-profile-edit/block.js":
1460
- /*!*********************************************!*\
1461
- !*** ./blocks/member-profile-edit/block.js ***!
1462
- \*********************************************/
1463
- /*! exports provided: default */
1464
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1465
-
1466
- "use strict";
1467
- __webpack_require__.r(__webpack_exports__);
1468
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1469
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
1470
-
1471
-
1472
- /**
1473
- * Block: PMPro Member Profile Edit
1474
- *
1475
- *
1476
- */
1477
-
1478
- /**
1479
- * Internal block libraries
1480
- */
1481
- var __ = wp.i18n.__;
1482
- var registerBlockType = wp.blocks.registerBlockType;
1483
- /**
1484
- * Register block
1485
- */
1486
-
1487
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType("pmpro/member-profile-edit", {
1488
- title: __("Member Profile Edit", "paid-memberships-pro"),
1489
- description: __("Allow member profile editing.", "paid-memberships-pro"),
1490
- category: "pmpro",
1491
- icon: {
1492
- background: "#2997c8",
1493
- foreground: "#ffffff",
1494
- src: "admin-users"
1495
- },
1496
- keywords: [__("pmpro", "paid-memberships-pro"), __("member", "paid-memberships-pro"), __("profile", "paid-memberships-pro")],
1497
- edit: function edit(props) {
1498
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1499
- className: "pmpro-block-element"
1500
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1501
- className: "pmpro-block-title"
1502
- }, __("Paid Memberships Pro", "paid-memberships-pro")), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1503
- className: "pmpro-block-subtitle"
1504
- }, __("Member Profile Edit", "paid-memberships-pro")));
1505
- },
1506
- save: function save() {
1507
- return null;
1508
- }
1509
- }));
1510
-
1511
- /***/ }),
1512
-
1513
- /***/ "./blocks/membership/block.js":
1514
- /*!************************************!*\
1515
- !*** ./blocks/membership/block.js ***!
1516
- \************************************/
1517
- /*! exports provided: default */
1518
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
1519
-
1520
- "use strict";
1521
- __webpack_require__.r(__webpack_exports__);
1522
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1523
- /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
1524
-
1525
-
1526
- /**
1527
- * Block: PMPro Membership
1528
- *
1529
- *
1530
- */
1531
-
1532
- /**
1533
- * Internal block libraries
1534
- */
1535
- var __ = wp.i18n.__;
1536
- var registerBlockType = wp.blocks.registerBlockType;
1537
- var _wp$components = wp.components,
1538
- PanelBody = _wp$components.PanelBody,
1539
- CheckboxControl = _wp$components.CheckboxControl;
1540
- var _wp$blockEditor = wp.blockEditor,
1541
- InspectorControls = _wp$blockEditor.InspectorControls,
1542
- InnerBlocks = _wp$blockEditor.InnerBlocks;
1543
- var all_levels = [{
1544
- value: 0,
1545
- label: "Non-Members"
1546
- }].concat(pmpro.all_level_values_and_labels);
1547
- /**
1548
- * Register block
1549
- */
1550
-
1551
- /* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/membership', {
1552
- title: __('Require Membership Block', 'paid-memberships-pro'),
1553
- description: __('Control the visibility of nested blocks for members or non-members.', 'paid-memberships-pro'),
1554
- category: 'pmpro',
1555
- icon: {
1556
- background: '#2997c8',
1557
- foreground: '#ffffff',
1558
- src: 'visibility'
1559
- },
1560
- keywords: [__('pmpro', 'paid-memberships-pro')],
1561
- attributes: {
1562
- levels: {
1563
- type: 'array',
1564
- default: []
1565
- },
1566
- uid: {
1567
- type: 'string',
1568
- default: ''
1569
- }
1570
- },
1571
- edit: function edit(props) {
1572
- var _props$attributes = props.attributes,
1573
- levels = _props$attributes.levels,
1574
- uid = _props$attributes.uid,
1575
- setAttributes = props.setAttributes,
1576
- isSelected = props.isSelected;
1577
-
1578
- if (uid == '') {
1579
- var rand = Math.random() + "";
1580
- setAttributes({
1581
- uid: rand
1582
- });
1583
- } // Build an array of checkboxes for each level.
1584
-
1585
-
1586
- var checkboxes = all_levels.map(function (level) {
1587
- function setLevelsAttribute(nowChecked) {
1588
- if (nowChecked && !levels.some(function (levelID) {
1589
- return levelID == level.value;
1590
- })) {
1591
- // Add the level.
1592
- var newLevels = levels.slice();
1593
- newLevels.push(level.value + '');
1594
- setAttributes({
1595
- levels: newLevels
1596
- });
1597
- } else if (!nowChecked && levels.some(function (levelID) {
1598
- return levelID == level.value;
1599
- })) {
1600
- // Remove the level.
1601
- var _newLevels = levels.filter(function (levelID) {
1602
- return levelID != level.value;
1603
- });
1604
-
1605
- setAttributes({
1606
- levels: _newLevels
1607
- });
1608
- }
1609
- }
1610
-
1611
- return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(CheckboxControl, {
1612
- label: level.label,
1613
- checked: levels.some(function (levelID) {
1614
- return levelID == level.value;
1615
- }),
1616
- onChange: setLevelsAttribute
1617
- })];
1618
- });
1619
- return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1620
- class: "pmpro-block-inspector-scrollable"
1621
- }, checkboxes))), isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1622
- className: "pmpro-block-require-membership-element"
1623
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1624
- className: "pmpro-block-title"
1625
- }, __('Require Membership', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(PanelBody, null, checkboxes), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks, {
1626
- renderAppender: function renderAppender() {
1627
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks.ButtonBlockAppender, null);
1628
- },
1629
- templateLock: false
1630
- })), !isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1631
- className: "pmpro-block-require-membership-element"
1632
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", {
1633
- className: "pmpro-block-title"
1634
- }, __('Require Membership', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks, {
1635
- renderAppender: function renderAppender() {
1636
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks.ButtonBlockAppender, null);
1637
- },
1638
- templateLock: false
1639
- }))];
1640
- },
1641
- save: function save(props) {
1642
- var className = props.className;
1643
- return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", {
1644
- className: className
1645
- }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks.Content, null));
1646
- }
1647
- }));
1648
-
1649
- /***/ }),
1650
-
1651
- /***/ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js":
1652
- /*!**********************************************************************!*\
1653
- !*** ./node_modules/@babel/runtime/helpers/assertThisInitialized.js ***!
1654
- \**********************************************************************/
1655
- /*! no static exports found */
1656
- /***/ (function(module, exports) {
1657
-
1658
- function _assertThisInitialized(self) {
1659
- if (self === void 0) {
1660
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
1661
- }
1662
-
1663
- return self;
1664
- }
1665
-
1666
- module.exports = _assertThisInitialized;
1667
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1668
-
1669
- /***/ }),
1670
-
1671
- /***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js":
1672
- /*!***************************************************************!*\
1673
- !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***!
1674
- \***************************************************************/
1675
- /*! no static exports found */
1676
- /***/ (function(module, exports) {
1677
-
1678
- function _classCallCheck(instance, Constructor) {
1679
- if (!(instance instanceof Constructor)) {
1680
- throw new TypeError("Cannot call a class as a function");
1681
- }
1682
- }
1683
-
1684
- module.exports = _classCallCheck;
1685
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1686
-
1687
- /***/ }),
1688
-
1689
- /***/ "./node_modules/@babel/runtime/helpers/createClass.js":
1690
- /*!************************************************************!*\
1691
- !*** ./node_modules/@babel/runtime/helpers/createClass.js ***!
1692
- \************************************************************/
1693
- /*! no static exports found */
1694
- /***/ (function(module, exports) {
1695
-
1696
- function _defineProperties(target, props) {
1697
- for (var i = 0; i < props.length; i++) {
1698
- var descriptor = props[i];
1699
- descriptor.enumerable = descriptor.enumerable || false;
1700
- descriptor.configurable = true;
1701
- if ("value" in descriptor) descriptor.writable = true;
1702
- Object.defineProperty(target, descriptor.key, descriptor);
1703
- }
1704
- }
1705
-
1706
- function _createClass(Constructor, protoProps, staticProps) {
1707
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
1708
- if (staticProps) _defineProperties(Constructor, staticProps);
1709
- return Constructor;
1710
- }
1711
-
1712
- module.exports = _createClass;
1713
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1714
-
1715
- /***/ }),
1716
-
1717
- /***/ "./node_modules/@babel/runtime/helpers/defineProperty.js":
1718
- /*!***************************************************************!*\
1719
- !*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***!
1720
- \***************************************************************/
1721
- /*! no static exports found */
1722
- /***/ (function(module, exports) {
1723
-
1724
- function _defineProperty(obj, key, value) {
1725
- if (key in obj) {
1726
- Object.defineProperty(obj, key, {
1727
- value: value,
1728
- enumerable: true,
1729
- configurable: true,
1730
- writable: true
1731
- });
1732
- } else {
1733
- obj[key] = value;
1734
- }
1735
-
1736
- return obj;
1737
- }
1738
-
1739
- module.exports = _defineProperty;
1740
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1741
-
1742
- /***/ }),
1743
-
1744
- /***/ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js":
1745
- /*!***************************************************************!*\
1746
- !*** ./node_modules/@babel/runtime/helpers/getPrototypeOf.js ***!
1747
- \***************************************************************/
1748
- /*! no static exports found */
1749
- /***/ (function(module, exports) {
1750
-
1751
- function _getPrototypeOf(o) {
1752
- module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
1753
- return o.__proto__ || Object.getPrototypeOf(o);
1754
- };
1755
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1756
- return _getPrototypeOf(o);
1757
- }
1758
-
1759
- module.exports = _getPrototypeOf;
1760
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1761
-
1762
- /***/ }),
1763
-
1764
- /***/ "./node_modules/@babel/runtime/helpers/inherits.js":
1765
- /*!*********************************************************!*\
1766
- !*** ./node_modules/@babel/runtime/helpers/inherits.js ***!
1767
- \*********************************************************/
1768
- /*! no static exports found */
1769
- /***/ (function(module, exports, __webpack_require__) {
1770
-
1771
- var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js");
1772
-
1773
- function _inherits(subClass, superClass) {
1774
- if (typeof superClass !== "function" && superClass !== null) {
1775
- throw new TypeError("Super expression must either be null or a function");
1776
- }
1777
-
1778
- subClass.prototype = Object.create(superClass && superClass.prototype, {
1779
- constructor: {
1780
- value: subClass,
1781
- writable: true,
1782
- configurable: true
1783
- }
1784
- });
1785
- if (superClass) setPrototypeOf(subClass, superClass);
1786
- }
1787
-
1788
- module.exports = _inherits;
1789
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1790
-
1791
- /***/ }),
1792
-
1793
- /***/ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js":
1794
- /*!**************************************************************************!*\
1795
- !*** ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***!
1796
- \**************************************************************************/
1797
- /*! no static exports found */
1798
- /***/ (function(module, exports, __webpack_require__) {
1799
-
1800
- var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js")["default"];
1801
-
1802
- var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized.js */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js");
1803
-
1804
- function _possibleConstructorReturn(self, call) {
1805
- if (call && (_typeof(call) === "object" || typeof call === "function")) {
1806
- return call;
1807
- }
1808
-
1809
- return assertThisInitialized(self);
1810
- }
1811
-
1812
- module.exports = _possibleConstructorReturn;
1813
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1814
-
1815
- /***/ }),
1816
-
1817
- /***/ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js":
1818
- /*!***************************************************************!*\
1819
- !*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
1820
- \***************************************************************/
1821
- /*! no static exports found */
1822
- /***/ (function(module, exports) {
1823
-
1824
- function _setPrototypeOf(o, p) {
1825
- module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
1826
- o.__proto__ = p;
1827
- return o;
1828
- };
1829
-
1830
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1831
- return _setPrototypeOf(o, p);
1832
- }
1833
-
1834
- module.exports = _setPrototypeOf;
1835
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1836
-
1837
- /***/ }),
1838
-
1839
- /***/ "./node_modules/@babel/runtime/helpers/typeof.js":
1840
- /*!*******************************************************!*\
1841
- !*** ./node_modules/@babel/runtime/helpers/typeof.js ***!
1842
- \*******************************************************/
1843
- /*! no static exports found */
1844
- /***/ (function(module, exports) {
1845
-
1846
- function _typeof(obj) {
1847
- "@babel/helpers - typeof";
1848
-
1849
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
1850
- module.exports = _typeof = function _typeof(obj) {
1851
- return typeof obj;
1852
- };
1853
-
1854
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1855
- } else {
1856
- module.exports = _typeof = function _typeof(obj) {
1857
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
1858
- };
1859
-
1860
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1861
- }
1862
-
1863
- return _typeof(obj);
1864
- }
1865
-
1866
- module.exports = _typeof;
1867
- module.exports["default"] = module.exports, module.exports.__esModule = true;
1868
-
1869
- /***/ }),
1870
-
1871
- /***/ "@wordpress/element":
1872
- /*!*********************************!*\
1873
- !*** external ["wp","element"] ***!
1874
- \*********************************/
1875
- /*! no static exports found */
1876
- /***/ (function(module, exports) {
1877
-
1878
- (function() { module.exports = window["wp"]["element"]; }());
1879
-
1880
- /***/ })
1881
-
1882
- /******/ });
1883
- //# sourceMappingURL=blocks.build.js.map
1
+ !function(e){var r={};function t(o){if(r[o])return r[o].exports;var p=r[o]={i:o,l:!1,exports:{}};return e[o].call(p.exports,p,p.exports,t),p.l=!0,p.exports}t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var p in e)t.d(o,p,function(r){return e[r]}.bind(null,p));return o},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}e.exports=function(e,r,o){return r&&t(e.prototype,r),o&&t(e,o),Object.defineProperty(e,"prototype",{writable:!1}),e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r,t){var o=t(8);e.exports=function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),r&&o(e,r)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r,t){var o=t(9).default,p=t(10);e.exports=function(e,r){if(r&&("object"===o(r)||"function"==typeof r))return r;if(void 0!==r)throw new TypeError("Derived constructors may only return object or undefined");return p(e)},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){wp.i18n.setLocaleData({"":{}},"paid-memberships-pro")},function(e,r){function t(r,o){return e.exports=t=Object.setPrototypeOf||function(e,r){return e.__proto__=r,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r,o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(r){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r,t){"use strict";t.r(r);var o=t(0),p=(t(7),t(6)),s=t.n(p),i=t(2),c=t.n(i),n=t(3),a=t.n(n),l=t(4),m=t.n(l),b=t(5),u=t.n(b),d=t(1),h=t.n(d);function f(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var y=wp.i18n.__,g=wp.element.Component,v=wp.components,k=v.PanelBody,O=v.TextControl,j=v.SelectControl,w=wp.blockEditor.InspectorControls,_=function(e){m()(t,e);var r=f(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this.props,r=e.attributes,t=r.text,p=r.level,s=r.css_class,i=e.setAttributes;return Object(o.createElement)(w,null,Object(o.createElement)(k,null,Object(o.createElement)(O,{label:y("Button Text","paid-memberships-pro"),help:y("Text for checkout button","paid-memberships-pro"),value:t,onChange:function(e){return i({text:e})}})),Object(o.createElement)(k,null,Object(o.createElement)(j,{label:y("Level","paid-memberships-pro"),help:y("The level to link to for checkout button","paid-memberships-pro"),value:p,onChange:function(e){return i({level:e})},options:window.pmpro.all_level_values_and_labels})),Object(o.createElement)(k,null,Object(o.createElement)(O,{label:y("CSS Class","paid-memberships-pro"),help:y("Additional styling for checkout button","paid-memberships-pro"),value:s,onChange:function(e){return i({css_class:e})}})))}}]),t}(g);function E(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function P(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?E(Object(t),!0).forEach((function(r){s()(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):E(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var C=wp.i18n.__,F=wp.blocks.registerBlockType,M=wp.components,x=M.TextControl,B=M.SelectControl;F("pmpro/checkout-button",{title:C("Membership Checkout Button","paid-memberships-pro"),description:C("Inserts a button that links directly to membership checkout for the selected level.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"migrate"},keywords:[C("buy","paid-memberships-pro"),C("level","paid-memberships-pro"),C("member","paid-memberships-pro"),C("paid memberships pro","paid-memberships-pro"),C("pmpro","paid-memberships-pro"),C("purchase","paid-memberships-pro")],supports:{},attributes:{text:{type:"string",default:"Buy Now"},css_class:{type:"string",default:"pmpro_btn"},level:{type:"string"}},edit:function(e){var r=e.attributes,t=r.text,p=r.level,s=r.css_class,i=e.className,c=e.setAttributes,n=e.isSelected;return[n&&Object(o.createElement)(_,P({setAttributes:c},e)),Object(o.createElement)("div",{className:i},Object(o.createElement)("a",{class:s},t)),n&&Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)(x,{label:C("Button Text","paid-memberships-pro"),value:t,onChange:function(e){return c({text:e})}}),Object(o.createElement)(B,{label:C("Membership Level","paid-memberships-pro"),value:p,onChange:function(e){return c({level:e})},options:window.pmpro.all_level_values_and_labels}),Object(o.createElement)(x,{label:C("CSS Class","paid-memberships-pro"),value:s,onChange:function(e){return c({css_class:e})}}))]},save:function(){return null}});function N(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var A=wp.i18n.__,S=wp.element.Component,L=wp.components,T=L.PanelBody,D=L.CheckboxControl,R=wp.blockEditor.InspectorControls,I=function(e){m()(t,e);var r=N(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this.props,r=e.attributes,t=r.membership,p=r.profile,s=r.invoices,i=r.links,c=e.setAttributes;return Object(o.createElement)(R,null,Object(o.createElement)(T,null,Object(o.createElement)(D,{label:A("Show 'My Memberships' Section","paid-memberships-pro"),checked:t,onChange:function(e){return c({membership:e})}})),Object(o.createElement)(T,null,Object(o.createElement)(D,{label:A("Show 'Profile' Section","paid-memberships-pro"),checked:p,onChange:function(e){return c({profile:e})}})),Object(o.createElement)(T,null,Object(o.createElement)(D,{label:A("Show 'Invoices' Section","paid-memberships-pro"),checked:s,onChange:function(e){return c({invoices:e})}})),Object(o.createElement)(T,null,Object(o.createElement)(D,{label:A("Show 'Member Links' Section","paid-memberships-pro"),checked:i,onChange:function(e){return c({links:e})}})))}}]),t}(S);function q(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function z(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?q(Object(t),!0).forEach((function(r){s()(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):q(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var W=wp.i18n.__,V=((0,wp.blocks.registerBlockType)("pmpro/account-page",{title:W("PMPro Page: Account (Full)","paid-memberships-pro"),description:W("Dynamic page section to display the selected sections of the Membership Account page including Memberships, Profile, Invoices, and Member Links. These sections can also be added via separate blocks.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[W("account","paid-memberships-pro"),W("billing","paid-memberships-pro"),W("invoice","paid-memberships-pro"),W("links","paid-memberships-pro"),W("member","paid-memberships-pro"),W("order","paid-memberships-pro"),W("paid memberships pro","paid-memberships-pro"),W("pmpro","paid-memberships-pro"),W("profile","paid-memberships-pro"),W("purchases","paid-memberships-pro"),W("quick link","paid-memberships-pro"),W("receipt","paid-memberships-pro"),W("user","paid-memberships-pro")],supports:{},attributes:{membership:{type:"boolean",default:!1},profile:{type:"boolean",default:!1},invoices:{type:"boolean",default:!1},links:{type:"boolean",default:!1}},edit:function(e){var r=e.setAttributes;return[e.isSelected&&Object(o.createElement)(I,z({setAttributes:r},e)),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},W("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},W("Membership Account Page","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),G=((0,wp.blocks.registerBlockType)("pmpro/account-membership-section",{title:V("PMPro Page: Account Memberships","paid-memberships-pro"),description:V("Dynamic page section to display the member's active membership information with links to view all membership options, update billing information, and change or cancel membership.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"groups"},keywords:[V("active","paid-memberships-pro"),V("member","paid-memberships-pro"),V("paid memberships pro","paid-memberships-pro"),V("pmpro","paid-memberships-pro"),V("purchases","paid-memberships-pro"),V("user","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},V("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},V("Membership Account: My Memberships","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),H=((0,wp.blocks.registerBlockType)("pmpro/account-profile-section",{title:G("PMPro Page: Account Profile View","paid-memberships-pro"),description:G("Dynamic page section that displays the member's profile as read-only information with a link to edit fields or their change password.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[G("fields","paid-memberships-pro"),G("member","paid-memberships-pro"),G("paid memberships pro","paid-memberships-pro"),G("pmpro","paid-memberships-pro"),G("user","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},G("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},G("Membership Account: Profile","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),J=((0,wp.blocks.registerBlockType)("pmpro/account-invoices-section",{title:H("PMPro Page: Account Invoices","paid-memberships-pro"),description:H("Dynamic page section that displays a list of the last 5 membership invoices for the active member.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"archive"},keywords:[H("account","paid-memberships-pro"),H("member","paid-memberships-pro"),H("order","paid-memberships-pro"),H("paid memberships pro","paid-memberships-pro"),H("pmpro","paid-memberships-pro"),H("purchases","paid-memberships-pro"),H("receipt","paid-memberships-pro"),H("user","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},H("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"}," ",H("Membership Account: Invoices","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),K=((0,wp.blocks.registerBlockType)("pmpro/account-links-section",{title:J("PMPro Page: Account Links","paid-memberships-pro"),description:J("Dynamic page section that displays custom links available for the active member only. This block is only visible if other Add Ons or custom code have added links.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"external"},keywords:[J("access","paid-memberships-pro"),J("account","paid-memberships-pro"),J("link","paid-memberships-pro"),J("member","paid-memberships-pro"),J("paid memberships pro","paid-memberships-pro"),J("pmpro","paid-memberships-pro"),J("quick link","paid-memberships-pro"),J("user","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},J("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},J("Membership Account: Member Links","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),Q=((0,wp.blocks.registerBlockType)("pmpro/billing-page",{title:K("PMPro Page: Billing","paid-memberships-pro"),description:K("Dynamic page section to display the member's billing information. Members can update their subscription payment method from this form.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"list-view"},keywords:[K("credit card","paid-memberships-pro"),K("member","paid-memberships-pro"),K("paid memberships pro","paid-memberships-pro"),K("payment method","paid-memberships-pro"),K("pmpro","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},K("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},K("Membership Billing Page","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/cancel-page",{title:Q("PMPro Page: Cancel","paid-memberships-pro"),description:Q("Dynamic page section where members can cancel their membership and active subscription if applicable.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"no"},keywords:[Q("member","paid-memberships-pro"),Q("paid memberships pro","paid-memberships-pro"),Q("payment method","paid-memberships-pro"),Q("pmpro","paid-memberships-pro"),Q("terminate","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Q("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Q("Membership Cancel Page","paid-memberships-pro")))]},save:function(){return null}});function U(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var X=wp.i18n.__,Y=wp.element.Component,Z=wp.components,$=Z.PanelBody,ee=(Z.PanelRow,Z.SelectControl),re=wp.blockEditor.InspectorControls,te=function(e){m()(t,e);var r=U(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this.props,r=e.attributes.pmpro_default_level,t=e.setAttributes;return Object(o.createElement)(re,null,Object(o.createElement)($,null,Object(o.createElement)(ee,{label:X("Membership Level","paid-memberships-pro"),help:X("Choose a default level for Membership Checkout.","paid-memberships-pro"),value:r,onChange:function(e){return t({pmpro_default_level:e})},options:[""].concat(window.pmpro.all_level_values_and_labels)})))}}]),t}(Y);function oe(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function pe(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?oe(Object(t),!0).forEach((function(r){s()(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):oe(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var se=wp.i18n.__,ie=wp.blocks.registerBlockType,ce=wp.components.SelectControl,ne=(ie("pmpro/checkout-page",{title:se("Membership Checkout Form","paid-memberships-pro"),description:se("Dynamic form that allows users to complete free registration or paid checkout for the selected membership level.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[se("member","paid-memberships-pro"),se("paid memberships pro","paid-memberships-pro"),se("pmpro","paid-memberships-pro"),se("buy","paid-memberships-pro"),se("purchase","paid-memberships-pro"),se("sell","paid-memberships-pro")],supports:{},attributes:{pmpro_default_level:{type:"string",source:"meta",meta:"pmpro_default_level"}},edit:function(e){var r=e.attributes.pmpro_default_level,t=(e.className,e.setAttributes);return[e.isSelected&&Object(o.createElement)(te,pe({setAttributes:t},e)),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},se("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},se("Membership Checkout Form","paid-memberships-pro")),Object(o.createElement)("hr",null),Object(o.createElement)(ce,{label:se("Membership Level","paid-memberships-pro"),value:r,onChange:function(e){return t({pmpro_default_level:e})},options:window.pmpro.all_level_values_and_labels}))]},save:function(){return null}}),wp.i18n.__),ae=((0,wp.blocks.registerBlockType)("pmpro/confirmation-page",{title:ne("PMPro Page: Confirmation","paid-memberships-pro"),description:ne("Dynamic page section that displays a confirmation message and purchase information for the active member immediately after membership registration and checkout.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"yes"},keywords:[ne("member","paid-memberships-pro"),ne("buy","paid-memberships-pro"),ne("paid memberships pro","paid-memberships-pro"),ne("pmpro","paid-memberships-pro"),ne("purchase","paid-memberships-pro"),ne("receipt","paid-memberships-pro"),ne("success","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},ne("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},ne("Membership Confirmation Page","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),le=((0,wp.blocks.registerBlockType)("pmpro/invoice-page",{title:ae("PMPro Page: Invoice","paid-memberships-pro"),description:ae("Dynamic page section that displays a list of all invoices (purchase history) for the active member. Each invoice can be selected and viewed in full detail.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"archive"},keywords:[ae("history","paid-memberships-pro"),ae("order","paid-memberships-pro"),ae("paid memberships pro","paid-memberships-pro"),ae("pmpro","paid-memberships-pro"),ae("purchases","paid-memberships-pro"),ae("receipt","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},ae("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},ae("Membership Invoices","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),me=((0,wp.blocks.registerBlockType)("pmpro/levels-page",{title:le("Membership Levels and Pricing Table","paid-memberships-pro"),description:le("Dynamic page section that displays a list of membership levels and pricing, linked to membership checkout. To reorder the display, navigate to Memberships > Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=ue.SelectControl,ye=wp.blockEditor,ge=ye.InspectorControls,ve=ye.InnerBlocks,ke=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),Oe=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""},show_noaccess:{type:"boolean",default:!1}},edit:function(e){var r=e.attributes,t=r.levels,p=r.uid,s=r.show_noaccess,i=e.setAttributes,c=e.isSelected;if(""==p){var n=Math.random()+"";i({uid:n})}var a=ke.map((function(e){return[Object(o.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var o=t.slice();o.push(e.value+""),i({levels:o})}else if(!r&&t.some((function(r){return r==e.value}))){var p=t.filter((function(r){return r!=e.value}));i({levels:p})}}})]}));return[c&&Object(o.createElement)(ge,null,Object(o.createElement)(de,null,Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("Which membership levels can view this block?","paid-memberships-pro"))),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},a),Object(o.createElement)("hr",null),Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("What should users without access see?","paid-memberships-pro"))),Object(o.createElement)(fe,{value:s,help:me("Modify the 'no access' message on the Memberships > Advanced Settings page.","paid-memberships-pro"),options:[{label:me("Show nothing","paid-memberships-pro"),value:"0"},{label:me("Show the 'no access' message","paid-memberships-pro"),value:"1"}],onChange:function(e){return i({show_noaccess:e})}}))),c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(o.createElement)(de,null,a)),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1})),!c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(o.createElement)("div",{className:r},Object(o.createElement)(ve.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:Oe("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:Oe("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[Oe("custom field","paid-memberships-pro"),Oe("fields","paid-memberships-pro"),Oe("paid memberships pro","paid-memberships-pro"),Oe("pmpro","paid-memberships-pro"),Oe("user fields","paid-memberships-pro")],edit:function(e){return Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Oe("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Oe("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function je(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var we,_e=wp.i18n.__,Ee=wp.element.Component,Pe=wp.components,Ce=Pe.PanelBody,Fe=(Pe.SelectControl,Pe.ToggleControl),Me=wp.blockEditor.InspectorControls,xe=function(e){m()(t,e);var r=je(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,p=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,i=t.show_logout_link;t.location;return Object(o.createElement)(Me,null,Object(o.createElement)(Ce,null,Object(o.createElement)(Fe,{label:_e("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:p,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(o.createElement)(Fe,{label:_e("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:_e("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(o.createElement)(Fe,{label:_e("Display a 'Log Out' link.","paid-memberships-pro"),checked:i,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(Ee),Be=wp.i18n.__,Ne=wp.blocks.registerBlockType,Ae=wp.element.Fragment;Ne("pmpro/login-form",{title:Be("Login Form","paid-memberships-pro"),description:Be("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[Be("log in","paid-memberships-pro"),Be("lost password","paid-memberships-pro"),Be("paid memberships pro","paid-memberships-pro"),Be("password reset","paid-memberships-pro"),Be("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(o.createElement)(Ae,null,Object(o.createElement)(xe,e),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Be("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Be("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});we=Object(o.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(o.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:we}),wp.blocks.updateCategory("pmpro-pages",{icon:we})}]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/pmpro-admin.js CHANGED
@@ -67,7 +67,7 @@ jQuery(document).ready(function(){
67
  jQuery('#'+notification_id).hide();
68
  }
69
  })
70
-
71
  });
72
  });
73
 
@@ -85,11 +85,11 @@ jQuery(document).ready(function() {
85
  pmpro_stripe_check_api_keys();
86
  });
87
  pmpro_stripe_check_api_keys();
88
-
89
  // AJAX call to create webhook.
90
  jQuery('#pmpro_stripe_create_webhook').on( 'click', function(event){
91
  event.preventDefault();
92
-
93
  var postData = {
94
  action: 'pmpro_stripe_create_webhook',
95
  secretkey: pmpro_stripe_get_secretkey(),
@@ -101,10 +101,10 @@ jQuery(document).ready(function() {
101
  success: function( response ) {
102
  response = jQuery.parseJSON( response );
103
  ///console.log( response );
104
-
105
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('error')
106
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('notice-success')
107
-
108
  if ( response.notice ) {
109
  jQuery('#pmpro_stripe_webhook_notice').parent('div').addClass(response.notice);
110
  }
@@ -117,11 +117,11 @@ jQuery(document).ready(function() {
117
  }
118
  })
119
  });
120
-
121
  // AJAX call to delete webhook.
122
  jQuery('#pmpro_stripe_delete_webhook').on( 'click', function(event){
123
  event.preventDefault();
124
-
125
  var postData = {
126
  action: 'pmpro_stripe_delete_webhook',
127
  secretkey: pmpro_stripe_get_secretkey(),
@@ -134,10 +134,10 @@ jQuery(document).ready(function() {
134
  success: function( response ) {
135
  response = jQuery.parseJSON( response );
136
  ///console.log( response );
137
-
138
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('error')
139
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('notice-success')
140
-
141
  if ( response.notice ) {
142
  jQuery('#pmpro_stripe_webhook_notice').parent('div').addClass(response.notice);
143
  }
@@ -146,7 +146,7 @@ jQuery(document).ready(function() {
146
  }
147
  if ( response.success ) {
148
  jQuery('#pmpro_stripe_create_webhook').show();
149
- }
150
  }
151
  })
152
  });
@@ -154,7 +154,7 @@ jQuery(document).ready(function() {
154
  // AJAX call to rebuild webhook.
155
  jQuery('#pmpro_stripe_rebuild_webhook').on( 'click', function(event){
156
  event.preventDefault();
157
-
158
  var postData = {
159
  action: 'pmpro_stripe_rebuild_webhook',
160
  secretkey: pmpro_stripe_get_secretkey(),
@@ -167,10 +167,10 @@ jQuery(document).ready(function() {
167
  success: function( response ) {
168
  response = jQuery.parseJSON( response );
169
  ///console.log( response );
170
-
171
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('error')
172
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('notice-success')
173
-
174
  if ( response.notice ) {
175
  jQuery('#pmpro_stripe_webhook_notice').parent('div').addClass(response.notice);
176
  }
@@ -179,18 +179,18 @@ jQuery(document).ready(function() {
179
  }
180
  if ( response.success ) {
181
  jQuery('#pmpro_stripe_create_webhook').hide();
182
- }
183
  }
184
  })
185
  });
186
  });
187
 
188
  // Disable the webhook buttons if the API keys aren't complete yet.
189
- function pmpro_stripe_check_api_keys() {
190
  if( ( jQuery('#stripe_publishablekey').val().length > 0 && jQuery('#stripe_secretkey').val().length > 0 ) || jQuery('#live_stripe_connect_secretkey').val().length > 0 ) {
191
  jQuery('#pmpro_stripe_create_webhook').removeClass('disabled');
192
  jQuery('#pmpro_stripe_create_webhook').addClass('button-secondary');
193
- } else {
194
  jQuery('#pmpro_stripe_create_webhook').removeClass('button-secondary');
195
  jQuery('#pmpro_stripe_create_webhook').addClass('disabled');
196
  }
@@ -208,28 +208,28 @@ function pmpro_stripe_get_secretkey() {
208
 
209
  // EMAIL TEMPLATES.
210
  jQuery(document).ready(function($) {
211
-
212
  /* Variables */
213
  var template, disabled, $subject, $editor, $testemail;
214
  $subject = $("#pmpro_email_template_subject").closest("tr");
215
  $editor = $("#wp-email_template_body-wrap");
216
  $testemail = $("#test_email_address").closest("tr");
217
-
218
- $(".hide-while-loading").hide();
219
- $(".controls").hide();
220
 
221
  /* PMPro Email Template Switcher */
222
  $("#pmpro_email_template_switcher").change(function() {
223
-
224
  $(".status_message").hide();
225
  template = $(this).val();
226
-
227
  //get template data
228
  if (template)
229
  pmpro_get_template(template);
230
  else {
231
- $(".hide-while-loading").hide();
232
- $(".controls").hide();
233
  }
234
  });
235
 
@@ -245,13 +245,13 @@ jQuery(document).ready(function($) {
245
  pmpro_disable_template();
246
  });
247
 
248
- $("#send_test_email").click(function(e) {
249
  pmpro_save_template().done(setTimeout(function(){pmpro_send_test_email();}, '1000'));
250
  });
251
 
252
  /* Functions */
253
- function pmpro_get_template(template) {
254
-
255
  //hide stuff and show ajax spinner
256
  $(".hide-while-loading").hide();
257
  $("#pmproet-spinner").show();
@@ -270,16 +270,16 @@ jQuery(document).ready(function($) {
270
 
271
  //show/hide stuff
272
  $("#pmproet-spinner").hide();
273
- $(".controls").show();
274
- $(".hide-while-loading").show();
275
- $(".status").hide();
276
 
277
  //change disable text
278
  if (template == 'header' || template === 'footer') {
279
 
280
  $subject.hide();
281
  $testemail.hide();
282
-
283
  if(template == 'header')
284
  $("#disable_label").text("Disable email header for all PMPro emails?");
285
  else
@@ -400,7 +400,7 @@ jQuery(document).ready(function($) {
400
 
401
  data = {
402
  template: template,
403
- email: $("#test_email_address").val(),
404
  action: 'pmpro_email_templates_send_test',
405
  security: $('input[name=security]').val()
406
  };
@@ -408,8 +408,8 @@ jQuery(document).ready(function($) {
408
  $.post(ajaxurl, data, function(success) {
409
  //show/hide stuff
410
  $("#pmproet-spinner").hide();
411
- $(".controls").show();
412
- $(".hide-while-loading").show();
413
 
414
  if(success) {
415
  $(".status_message_wrapper").addClass("updated").removeClass("error");
@@ -428,13 +428,13 @@ jQuery(document).ready(function($) {
428
  $("#pmpro_email_template_disable").prop('checked', true);
429
  $("#pmpro_email_template_body").attr('readonly', 'readonly').attr('disabled', 'disabled');
430
  $("#pmpro_email_template_subject").attr('readonly', 'readonly').attr('disabled', 'disabled');
431
- $(".controls").hide();
432
  }
433
  else {
434
  $("#pmpro_email_template_disable").prop('checked', false);
435
  $("#pmpro_email_template_body").removeAttr('readonly','readonly').removeAttr('disabled', 'disabled');
436
  $("#pmpro_email_template_subject").removeAttr('readonly','readonly').removeAttr('disabled', 'disabled');
437
- $(".controls").show();
438
  }
439
 
440
  }
67
  jQuery('#'+notification_id).hide();
68
  }
69
  })
70
+
71
  });
72
  });
73
 
85
  pmpro_stripe_check_api_keys();
86
  });
87
  pmpro_stripe_check_api_keys();
88
+
89
  // AJAX call to create webhook.
90
  jQuery('#pmpro_stripe_create_webhook').on( 'click', function(event){
91
  event.preventDefault();
92
+
93
  var postData = {
94
  action: 'pmpro_stripe_create_webhook',
95
  secretkey: pmpro_stripe_get_secretkey(),
101
  success: function( response ) {
102
  response = jQuery.parseJSON( response );
103
  ///console.log( response );
104
+
105
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('error')
106
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('notice-success')
107
+
108
  if ( response.notice ) {
109
  jQuery('#pmpro_stripe_webhook_notice').parent('div').addClass(response.notice);
110
  }
117
  }
118
  })
119
  });
120
+
121
  // AJAX call to delete webhook.
122
  jQuery('#pmpro_stripe_delete_webhook').on( 'click', function(event){
123
  event.preventDefault();
124
+
125
  var postData = {
126
  action: 'pmpro_stripe_delete_webhook',
127
  secretkey: pmpro_stripe_get_secretkey(),
134
  success: function( response ) {
135
  response = jQuery.parseJSON( response );
136
  ///console.log( response );
137
+
138
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('error')
139
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('notice-success')
140
+
141
  if ( response.notice ) {
142
  jQuery('#pmpro_stripe_webhook_notice').parent('div').addClass(response.notice);
143
  }
146
  }
147
  if ( response.success ) {
148
  jQuery('#pmpro_stripe_create_webhook').show();
149
+ }
150
  }
151
  })
152
  });
154
  // AJAX call to rebuild webhook.
155
  jQuery('#pmpro_stripe_rebuild_webhook').on( 'click', function(event){
156
  event.preventDefault();
157
+
158
  var postData = {
159
  action: 'pmpro_stripe_rebuild_webhook',
160
  secretkey: pmpro_stripe_get_secretkey(),
167
  success: function( response ) {
168
  response = jQuery.parseJSON( response );
169
  ///console.log( response );
170
+
171
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('error')
172
  jQuery( '#pmpro_stripe_webhook_notice' ).parent('div').removeClass('notice-success')
173
+
174
  if ( response.notice ) {
175
  jQuery('#pmpro_stripe_webhook_notice').parent('div').addClass(response.notice);
176
  }
179
  }
180
  if ( response.success ) {
181
  jQuery('#pmpro_stripe_create_webhook').hide();
182
+ }
183
  }
184
  })
185
  });
186
  });
187
 
188
  // Disable the webhook buttons if the API keys aren't complete yet.
189
+ function pmpro_stripe_check_api_keys() {
190
  if( ( jQuery('#stripe_publishablekey').val().length > 0 && jQuery('#stripe_secretkey').val().length > 0 ) || jQuery('#live_stripe_connect_secretkey').val().length > 0 ) {
191
  jQuery('#pmpro_stripe_create_webhook').removeClass('disabled');
192
  jQuery('#pmpro_stripe_create_webhook').addClass('button-secondary');
193
+ } else {
194
  jQuery('#pmpro_stripe_create_webhook').removeClass('button-secondary');
195
  jQuery('#pmpro_stripe_create_webhook').addClass('disabled');
196
  }
208
 
209
  // EMAIL TEMPLATES.
210
  jQuery(document).ready(function($) {
211
+
212
  /* Variables */
213
  var template, disabled, $subject, $editor, $testemail;
214
  $subject = $("#pmpro_email_template_subject").closest("tr");
215
  $editor = $("#wp-email_template_body-wrap");
216
  $testemail = $("#test_email_address").closest("tr");
217
+
218
+ $(".pmpro_admin .hide-while-loading").hide();
219
+ $(".pmpro_admin .controls").hide();
220
 
221
  /* PMPro Email Template Switcher */
222
  $("#pmpro_email_template_switcher").change(function() {
223
+
224
  $(".status_message").hide();
225
  template = $(this).val();
226
+
227
  //get template data
228
  if (template)
229
  pmpro_get_template(template);
230
  else {
231
+ $(".pmpro_admin .hide-while-loading").hide();
232
+ $(".pmpro_admin .controls").hide();
233
  }
234
  });
235
 
245
  pmpro_disable_template();
246
  });
247
 
248
+ $("#send_test_email").click(function(e) {
249
  pmpro_save_template().done(setTimeout(function(){pmpro_send_test_email();}, '1000'));
250
  });
251
 
252
  /* Functions */
253
+ function pmpro_get_template(template) {
254
+
255
  //hide stuff and show ajax spinner
256
  $(".hide-while-loading").hide();
257
  $("#pmproet-spinner").show();
270
 
271
  //show/hide stuff
272
  $("#pmproet-spinner").hide();
273
+ $(".pmpro_admin .controls").show();
274
+ $(".pmpro_admin .hide-while-loading").show();
275
+ $(".pmpro_admin .status").hide();
276
 
277
  //change disable text
278
  if (template == 'header' || template === 'footer') {
279
 
280
  $subject.hide();
281
  $testemail.hide();
282
+
283
  if(template == 'header')
284
  $("#disable_label").text("Disable email header for all PMPro emails?");
285
  else
400
 
401
  data = {
402
  template: template,
403
+ email: $("#test_email_address").val(),
404
  action: 'pmpro_email_templates_send_test',
405
  security: $('input[name=security]').val()
406
  };
408
  $.post(ajaxurl, data, function(success) {
409
  //show/hide stuff
410
  $("#pmproet-spinner").hide();
411
+ $(".pmpro_admin .controls").show();
412
+ $(".pmpro_admin .hide-while-loading").show();
413
 
414
  if(success) {
415
  $(".status_message_wrapper").addClass("updated").removeClass("error");
428
  $("#pmpro_email_template_disable").prop('checked', true);
429
  $("#pmpro_email_template_body").attr('readonly', 'readonly').attr('disabled', 'disabled');
430
  $("#pmpro_email_template_subject").attr('readonly', 'readonly').attr('disabled', 'disabled');
431
+ $(".pmpro_admin .controls").hide();
432
  }
433
  else {
434
  $("#pmpro_email_template_disable").prop('checked', false);
435
  $("#pmpro_email_template_body").removeAttr('readonly','readonly').removeAttr('disabled', 'disabled');
436
  $("#pmpro_email_template_subject").removeAttr('readonly','readonly').removeAttr('disabled', 'disabled');
437
+ $(".pmpro_admin .controls").show();
438
  }
439
 
440
  }
js/pmpro-confirmation.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery( document ).ready( function() {
2
+ // If this script is loaded, then we are on the confirmation page for a pending or token order.
3
+ // We want to poll the server to see if the order has been completed and if so, refresh so
4
+ // the user can see the user can see their completed checkout.
5
+ var pollInterval = setInterval( function() {
6
+ // Get the level price so that information can be shown in payment request popup
7
+ jQuery.noConflict().ajax({
8
+ url: pmpro.restUrl + 'pmpro/v1/order',
9
+ beforeSend: function ( xhr ) {
10
+ xhr.setRequestHeader( 'X-WP-Nonce', pmpro.nonce );
11
+ },
12
+ dataType: 'json',
13
+ data: {
14
+ 'code': pmpro.code
15
+ },
16
+ success: function( response ) {
17
+ if ( response.status == 'success' ) {
18
+ // Order is complete.
19
+ clearInterval( pollInterval );
20
+ window.location.reload();
21
+ }
22
+ }
23
+ } );
24
+ }, 5000 ); // Poll every 5 seconds.
25
+ });
languages/paid-memberships-pro-ca.mo CHANGED
Binary file
languages/paid-memberships-pro-ca.po CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Paid Memberships Pro plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Paid Memberships Pro 2.7.5\n"
6
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
7
  "Last-Translator: Paid Memberships Pro <info@paidmembershipspro.com>\n"
8
  "Language-Team: Paid Memberships Pro <info@paidmembershipspro.com>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-03-01T15:06:06+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: paid-memberships-pro\n"
@@ -92,6 +92,8 @@ msgstr "Comproveu una vegada més"
92
  #: adminpages/orders.php:1022
93
  #: adminpages/orders.php:1014
94
  #: includes/metaboxes.php:19
 
 
95
  msgid "All"
96
  msgstr "Tot"
97
 
@@ -135,6 +137,7 @@ msgstr "Tipus"
135
  #: adminpages/membershiplevels.php:296
136
  #: adminpages/membershiplevels.php:298
137
  #: adminpages/membershiplevels.php:359
 
138
  msgid "Description"
139
  msgstr "Descripció"
140
 
@@ -215,6 +218,13 @@ msgstr "Activa %s"
215
  #: adminpages/discountcodes.php:866
216
  #: adminpages/orders.php:1417
217
  #: adminpages/orders.php:1419
 
 
 
 
 
 
 
218
  msgid "Delete"
219
  msgstr "Esborra"
220
 
@@ -279,6 +289,22 @@ msgstr "WordPress.org"
279
  #: adminpages/orders.php:1545
280
  #: adminpages/addons.php:250
281
  #: adminpages/orders.php:912
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  msgid "N/A"
283
  msgstr "N/A"
284
 
@@ -471,6 +497,14 @@ msgstr "Passarela de pagament (Payment Gateway) &amp; SSL"
471
  #: includes/profile.php:758
472
  #: adminpages/orders.php:1437
473
  #: adminpages/orders.php:1440
 
 
 
 
 
 
 
 
474
  msgid "Email"
475
  msgstr "Correu electrònic"
476
 
@@ -486,6 +520,7 @@ msgstr "Avançat"
486
  #: adminpages/advancedsettings.php:42
487
  #: adminpages/advancedsettings.php:68
488
  #: adminpages/advancedsettings.php:69
 
489
  msgid "Your advanced settings have been updated."
490
  msgstr "La vostra configuració avançada s’han actualitzat."
491
 
@@ -506,6 +541,7 @@ msgstr "Si us plau <a href=\"%s\">login</a> per a veure aquest contingut. (<a hr
506
  #: adminpages/advancedsettings.php:116
507
  #: includes/updates/upgrade_1.php:13
508
  #: adminpages/advancedsettings.php:118
 
509
  msgid "This content is for members only. Visit the site and log in/register to read."
510
  msgstr "Aquest contingut és només per a subscriptors. Visita el lloc i registra’t/log in per a llegir."
511
 
@@ -524,6 +560,7 @@ msgstr "Aquest contingut és només per a subscriptors. Visita el lloc i registr
524
  #: adminpages/advancedsettings.php:132
525
  #: includes/adminpages.php:73
526
  #: adminpages/advancedsettings.php:134
 
527
  msgid "Advanced Settings"
528
  msgstr "Configuració Avançada"
529
 
@@ -532,6 +569,7 @@ msgstr "Configuració Avançada"
532
  #: adminpages/advancedsettings.php:92
533
  #: adminpages/advancedsettings.php:164
534
  #: adminpages/advancedsettings.php:166
 
535
  msgid "Message for Logged-in Non-members"
536
  msgstr "Missatge per a No subscriptors “Logged-in”"
537
 
@@ -540,6 +578,7 @@ msgstr "Missatge per a No subscriptors “Logged-in”"
540
  #: adminpages/advancedsettings.php:96
541
  #: adminpages/advancedsettings.php:168
542
  #: adminpages/advancedsettings.php:170
 
543
  msgid "This message replaces the post content for non-members. Available variables"
544
  msgstr "Aquest missatge reemplaça el contingut de l’entrada per als no membres. Hi ha variables disponibles"
545
 
@@ -548,6 +587,7 @@ msgstr "Aquest missatge reemplaça el contingut de l’entrada per als no membre
548
  #: adminpages/advancedsettings.php:101
549
  #: adminpages/advancedsettings.php:173
550
  #: adminpages/advancedsettings.php:175
 
551
  msgid "Message for Logged-out Users"
552
  msgstr "Missatge per als usuaris desconnectats (Logged-out)"
553
 
@@ -556,6 +596,7 @@ msgstr "Missatge per als usuaris desconnectats (Logged-out)"
556
  #: adminpages/advancedsettings.php:105
557
  #: adminpages/advancedsettings.php:177
558
  #: adminpages/advancedsettings.php:179
 
559
  msgid "This message replaces the post content for logged-out visitors."
560
  msgstr "Aquest missatge remplaça el contingut del post per a visitants desconnectats (logged-out)"
561
 
@@ -564,6 +605,7 @@ msgstr "Aquest missatge remplaça el contingut del post per a visitants desconne
564
  #: adminpages/advancedsettings.php:110
565
  #: adminpages/advancedsettings.php:182
566
  #: adminpages/advancedsettings.php:184
 
567
  msgid "Message for RSS Feed"
568
  msgstr "Missatge per a RSS Feed"
569
 
@@ -572,24 +614,28 @@ msgstr "Missatge per a RSS Feed"
572
  #: adminpages/advancedsettings.php:114
573
  #: adminpages/advancedsettings.php:186
574
  #: adminpages/advancedsettings.php:188
 
575
  msgid "This message replaces the post content in RSS feeds."
576
  msgstr "Aquest missatge reemplaça el contingut del seu missatge en els canals RSS."
577
 
578
  #: adminpages/advancedsettings.php:122
579
  #: adminpages/advancedsettings.php:199
580
  #: adminpages/advancedsettings.php:201
 
581
  msgid "Filter searches and archives?"
582
  msgstr "Filtra recerques i arxius?"
583
 
584
  #: adminpages/advancedsettings.php:126
585
  #: adminpages/advancedsettings.php:203
586
  #: adminpages/advancedsettings.php:205
 
587
  msgid "No - Non-members will see restricted posts/pages in searches and archives."
588
  msgstr "No - No subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
589
 
590
  #: adminpages/advancedsettings.php:127
591
  #: adminpages/advancedsettings.php:204
592
  #: adminpages/advancedsettings.php:206
 
593
  msgid "Yes - Only members will see restricted posts/pages in searches and archives."
594
  msgstr "Sí - Només els subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
595
 
@@ -598,6 +644,7 @@ msgstr "Sí - Només els subscriptors veuran posts restringits/pàgines en les r
598
  #: adminpages/advancedsettings.php:120
599
  #: adminpages/advancedsettings.php:210
600
  #: adminpages/advancedsettings.php:212
 
601
  msgid "Show Excerpts to Non-Members?"
602
  msgstr "Mostrar extractes als no membres?"
603
 
@@ -606,6 +653,7 @@ msgstr "Mostrar extractes als no membres?"
606
  #: adminpages/advancedsettings.php:124
607
  #: adminpages/advancedsettings.php:214
608
  #: adminpages/advancedsettings.php:216
 
609
  msgid "No - Hide excerpts."
610
  msgstr "No - Amaga extractes."
611
 
@@ -614,12 +662,14 @@ msgstr "No - Amaga extractes."
614
  #: adminpages/advancedsettings.php:125
615
  #: adminpages/advancedsettings.php:215
616
  #: adminpages/advancedsettings.php:217
 
617
  msgid "Yes - Show excerpts."
618
  msgstr "Sí - Mostra extractes."
619
 
620
  #: adminpages/advancedsettings.php:144
621
  #: adminpages/advancedsettings.php:333
622
  #: adminpages/advancedsettings.php:348
 
623
  msgid "Hide Ads From Members?"
624
  msgstr "Amaga els anuncis als subscriptors?"
625
 
@@ -685,6 +735,17 @@ msgstr "Amaga els anuncis als subscriptors?"
685
  #: adminpages/advancedsettings.php:494
686
  #: classes/gateways/class.pmprogateway_stripe.php:404
687
  #: classes/gateways/class.pmprogateway_stripe.php:418
 
 
 
 
 
 
 
 
 
 
 
688
  msgid "No"
689
  msgstr "No"
690
 
@@ -693,6 +754,7 @@ msgstr "No"
693
  #: adminpages/advancedsettings.php:136
694
  #: adminpages/advancedsettings.php:338
695
  #: adminpages/advancedsettings.php:353
 
696
  msgid "Hide Ads From All Members"
697
  msgstr "Amaga Anuncis de tots els subscriptors"
698
 
@@ -701,6 +763,7 @@ msgstr "Amaga Anuncis de tots els subscriptors"
701
  #: adminpages/advancedsettings.php:137
702
  #: adminpages/advancedsettings.php:339
703
  #: adminpages/advancedsettings.php:354
 
704
  msgid "Hide Ads From Certain Members"
705
  msgstr "Amaga els anuncis a certs subscriptors"
706
 
@@ -715,6 +778,7 @@ msgstr "Els anuncis dels següents plugins seràn desactivats automàticament"
715
  #: adminpages/advancedsettings.php:145
716
  #: adminpages/advancedsettings.php:346
717
  #: adminpages/advancedsettings.php:361
 
718
  msgid "To hide ads in your template code, use code like the following"
719
  msgstr "Per amagar els anuncis al codi de la plantilla, utilitzeu el codi següent"
720
 
@@ -723,6 +787,7 @@ msgstr "Per amagar els anuncis al codi de la plantilla, utilitzeu el codi següe
723
  #: adminpages/advancedsettings.php:156
724
  #: adminpages/advancedsettings.php:355
725
  #: adminpages/advancedsettings.php:370
 
726
  msgid "Choose Levels to Hide Ads From"
727
  msgstr "Escull els nivells on amagar els anuncis"
728
 
@@ -741,6 +806,7 @@ msgstr "Redirigir tot el trànsit de la pàgina de registre a /susbcription/?"
741
  #: adminpages/advancedsettings.php:390
742
  #: adminpages/advancedsettings.php:392
743
  #: adminpages/advancedsettings.php:407
 
744
  msgid "multisite only"
745
  msgstr "només “multisite”"
746
 
@@ -795,6 +861,13 @@ msgstr "només “multisite”"
795
  #: adminpages/advancedsettings.php:412
796
  #: classes/gateways/class.pmprogateway_stripe.php:406
797
  #: classes/gateways/class.pmprogateway_stripe.php:420
 
 
 
 
 
 
 
798
  msgid "Yes"
799
  msgstr "Sí"
800
 
@@ -803,6 +876,7 @@ msgstr "Sí"
803
  #: adminpages/advancedsettings.php:202
804
  #: adminpages/advancedsettings.php:241
805
  #: adminpages/advancedsettings.php:256
 
806
  msgid "Use reCAPTCHA?"
807
  msgstr "Utilitzar reCAPTCHA?"
808
 
@@ -818,6 +892,7 @@ msgstr "Sí - Només subscripcions gratuïtes"
818
  #: adminpages/advancedsettings.php:208
819
  #: adminpages/advancedsettings.php:247
820
  #: adminpages/advancedsettings.php:262
 
821
  msgid "Yes - All memberships."
822
  msgstr "Sí - Tots els subscriptors"
823
 
@@ -826,6 +901,7 @@ msgstr "Sí - Tots els subscriptors"
826
  #: adminpages/advancedsettings.php:210
827
  #: adminpages/advancedsettings.php:249
828
  #: adminpages/advancedsettings.php:264
 
829
  msgid "A free reCAPTCHA key is required."
830
  msgstr "Una clau reCAPTCHA gratuïta és necessària"
831
 
@@ -834,6 +910,7 @@ msgstr "Una clau reCAPTCHA gratuïta és necessària"
834
  #: adminpages/advancedsettings.php:210
835
  #: adminpages/advancedsettings.php:249
836
  #: adminpages/advancedsettings.php:264
 
837
  msgid "Click here to signup for reCAPTCHA"
838
  msgstr "Clica aquí per a signar per al reCAPTCHA"
839
 
@@ -890,6 +967,10 @@ msgstr "Seleccionat"
890
  #: adminpages/advancedsettings.php:542
891
  #: adminpages/pagesettings.php:508
892
  #: adminpages/pagesettings.php:512
 
 
 
 
893
  msgid "Save Settings"
894
  msgstr "Desa la configuració"
895
 
@@ -965,6 +1046,7 @@ msgstr "Error esborrant el codi de descompte. Si us plau torna a intentar-ho."
965
  #: adminpages/discountcodes.php:796
966
  #: adminpages/discountcodes.php:354
967
  #: adminpages/discountcodes.php:798
 
968
  msgid "Code not found."
969
  msgstr "No s’ha trobat el codi."
970
 
@@ -987,6 +1069,7 @@ msgstr "Edita el codi de descompte"
987
  #: adminpages/discountcodes.php:735
988
  #: adminpages/discountcodes.php:377
989
  #: adminpages/discountcodes.php:737
 
990
  msgid "Add New Discount Code"
991
  msgstr "Afegeix un nou codi de descompte"
992
 
@@ -1033,6 +1116,12 @@ msgstr "Afegeix un nou codi de descompte"
1033
  #: adminpages/discountcodes.php:446
1034
  #: adminpages/discountcodes.php:785
1035
  #: adminpages/orders.php:1331
 
 
 
 
 
 
1036
  msgid "ID"
1037
  msgstr "ID"
1038
 
@@ -1047,6 +1136,7 @@ msgstr "ID"
1047
  #: adminpages/orders.php:415
1048
  #: adminpages/orders.php:421
1049
  #: adminpages/discountcodes.php:447
 
1050
  msgid "This will be generated when you save."
1051
  msgstr "Es generarà quan salvis."
1052
 
@@ -1078,6 +1168,11 @@ msgstr "Es generarà quan salvis."
1078
  #: adminpages/discountcodes.php:786
1079
  #: adminpages/orders.php:1332
1080
  #: adminpages/dashboard.php:292
 
 
 
 
 
1081
  msgid "Code"
1082
  msgstr "Codi"
1083
 
@@ -1091,6 +1186,7 @@ msgstr "Codi"
1091
  #: adminpages/discountcodes.php:489
1092
  #: includes/profile.php:501
1093
  #: includes/profile.php:497
 
1094
  msgid "Start Date"
1095
  msgstr "Data d’inici"
1096
 
@@ -1127,6 +1223,9 @@ msgstr "Data d’inici"
1127
  #: classes/gateways/class.pmprogateway_stripe.php:1320
1128
  #: classes/gateways/class.pmprogateway_stripe.php:1326
1129
  #: classes/gateways/class.pmprogateway_stripe.php:785
 
 
 
1130
  msgid "Expiration Date"
1131
  msgstr "Data final (d’expiració)"
1132
 
@@ -1141,6 +1240,7 @@ msgstr "Data final (d’expiració)"
1141
  #: adminpages/discountcodes.php:787
1142
  #: adminpages/discountcodes.php:525
1143
  #: adminpages/discountcodes.php:789
 
1144
  msgid "Uses"
1145
  msgstr "Utilitza"
1146
 
@@ -1174,6 +1274,7 @@ msgstr "A quins nivells s’aplicarà aquest codi?"
1174
  #: adminpages/discountcodes.php:574
1175
  #: adminpages/membershiplevels.php:401
1176
  #: adminpages/discountcodes.php:576
 
1177
  msgid "Initial Payment"
1178
  msgstr "Pagament inicial"
1179
 
@@ -1189,6 +1290,7 @@ msgstr "Pagament inicial"
1189
  #: adminpages/discountcodes.php:585
1190
  #: adminpages/membershiplevels.php:412
1191
  #: adminpages/discountcodes.php:587
 
1192
  msgid "The initial amount collected at registration."
1193
  msgstr "El pagament inicial efectuat en el registre"
1194
 
@@ -1204,6 +1306,7 @@ msgstr "El pagament inicial efectuat en el registre"
1204
  #: adminpages/discountcodes.php:590
1205
  #: adminpages/membershiplevels.php:417
1206
  #: adminpages/discountcodes.php:592
 
1207
  msgid "Recurring Subscription"
1208
  msgstr "Subscripció recurrent"
1209
 
@@ -1219,6 +1322,7 @@ msgstr "Subscripció recurrent"
1219
  #: adminpages/discountcodes.php:591
1220
  #: adminpages/membershiplevels.php:418
1221
  #: adminpages/discountcodes.php:593
 
1222
  msgid "Check if this level has a recurring subscription payment."
1223
  msgstr "Clica si aquest nivell té un pagament de subscripció recurrent"
1224
 
@@ -1233,6 +1337,7 @@ msgstr "Clica si aquest nivell té un pagament de subscripció recurrent"
1233
  #: adminpages/discountcodes.php:595
1234
  #: adminpages/membershiplevels.php:422
1235
  #: adminpages/discountcodes.php:597
 
1236
  msgid "Billing Amount"
1237
  msgstr "Total a facturar"
1238
 
@@ -1270,6 +1375,11 @@ msgstr "Total a facturar"
1270
  #: classes/gateways/class.pmprogateway_stripe.php:2641
1271
  #: classes/gateways/class.pmprogateway_stripe.php:2637
1272
  #: classes/gateways/class.pmprogateway_stripe.php:2639
 
 
 
 
 
1273
  msgid "Day(s)"
1274
  msgstr "Dia(es)"
1275
 
@@ -1307,6 +1417,11 @@ msgstr "Dia(es)"
1307
  #: classes/gateways/class.pmprogateway_stripe.php:2643
1308
  #: classes/gateways/class.pmprogateway_stripe.php:2639
1309
  #: classes/gateways/class.pmprogateway_stripe.php:2641
 
 
 
 
 
1310
  msgid "Month(s)"
1311
  msgstr "Mes(os)"
1312
 
@@ -1344,6 +1459,11 @@ msgstr "Mes(os)"
1344
  #: classes/gateways/class.pmprogateway_stripe.php:2642
1345
  #: classes/gateways/class.pmprogateway_stripe.php:2638
1346
  #: classes/gateways/class.pmprogateway_stripe.php:2640
 
 
 
 
 
1347
  msgid "Week(s)"
1348
  msgstr "Setmana(es)"
1349
 
@@ -1381,6 +1501,11 @@ msgstr "Setmana(es)"
1381
  #: classes/gateways/class.pmprogateway_stripe.php:2644
1382
  #: classes/gateways/class.pmprogateway_stripe.php:2640
1383
  #: classes/gateways/class.pmprogateway_stripe.php:2642
 
 
 
 
 
1384
  msgid "Year(s)"
1385
  msgstr "Any(s)"
1386
 
@@ -1396,6 +1521,7 @@ msgstr "Any(s)"
1396
  #: adminpages/discountcodes.php:618
1397
  #: adminpages/membershiplevels.php:446
1398
  #: adminpages/discountcodes.php:620
 
1399
  msgid "The amount to be billed one cycle after the initial payment."
1400
  msgstr "Total a facturar en un cicle després del pagament inicial"
1401
 
@@ -1411,6 +1537,7 @@ msgstr "Total a facturar en un cicle després del pagament inicial"
1411
  #: adminpages/discountcodes.php:628
1412
  #: adminpages/membershiplevels.php:465
1413
  #: adminpages/discountcodes.php:630
 
1414
  msgid "Billing Cycle Limit"
1415
  msgstr "Límit de cicle de facturació"
1416
 
@@ -1426,6 +1553,7 @@ msgstr "Límit de cicle de facturació"
1426
  #: adminpages/discountcodes.php:632
1427
  #: adminpages/membershiplevels.php:469
1428
  #: adminpages/discountcodes.php:634
 
1429
  msgid "The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite."
1430
  msgstr "El <strong>total</strong> de cicles de pagament recurrent per a aquest nivell, incloent el període de prova (si s’aplica) però sense incloure el pagament inicial. Deixa-ho a zero si la subscripció és infinita."
1431
 
@@ -1441,6 +1569,8 @@ msgstr "El <strong>total</strong> de cicles de pagament recurrent per a aquest n
1441
  #: adminpages/discountcodes.php:651
1442
  #: adminpages/membershiplevels.php:488
1443
  #: adminpages/discountcodes.php:653
 
 
1444
  msgid "Custom Trial"
1445
  msgstr "Prova personalitzada"
1446
 
@@ -1457,6 +1587,8 @@ msgstr "Prova personalitzada"
1457
  #: adminpages/discountcodes.php:653
1458
  #: adminpages/membershiplevels.php:490
1459
  #: adminpages/discountcodes.php:655
 
 
1460
  msgid "Check to add a custom trial period."
1461
  msgstr "Clica per afegir un període de prova personalitzat."
1462
 
@@ -1473,6 +1605,7 @@ msgstr "Clica per afegir un període de prova personalitzat."
1473
  #: adminpages/discountcodes.php:661
1474
  #: adminpages/membershiplevels.php:510
1475
  #: adminpages/discountcodes.php:663
 
1476
  msgid "Trial Billing Amount"
1477
  msgstr "Facturació per al període de prova"
1478
 
@@ -1489,6 +1622,7 @@ msgstr "Facturació per al període de prova"
1489
  #: adminpages/discountcodes.php:672
1490
  #: adminpages/membershiplevels.php:521
1491
  #: adminpages/discountcodes.php:674
 
1492
  msgid "for the first"
1493
  msgstr "per al primer"
1494
 
@@ -1505,6 +1639,7 @@ msgstr "per al primer"
1505
  #: adminpages/discountcodes.php:674
1506
  #: adminpages/membershiplevels.php:523
1507
  #: adminpages/discountcodes.php:676
 
1508
  msgid "subscription payments"
1509
  msgstr "pagaments de subscripció"
1510
 
@@ -1522,6 +1657,7 @@ msgstr "pagaments de subscripció"
1522
  #: adminpages/discountcodes.php:686
1523
  #: adminpages/membershiplevels.php:559
1524
  #: adminpages/discountcodes.php:688
 
1525
  msgid "Membership Expiration"
1526
  msgstr "Venciment de la subscripció"
1527
 
@@ -1538,6 +1674,7 @@ msgstr "Venciment de la subscripció"
1538
  #: adminpages/discountcodes.php:687
1539
  #: adminpages/membershiplevels.php:560
1540
  #: adminpages/discountcodes.php:689
 
1541
  msgid "Check this to set when membership access expires."
1542
  msgstr "Clica per afegir quan expira l’accés del subscriptor"
1543
 
@@ -1556,6 +1693,8 @@ msgstr "Clica per afegir quan expira l’accés del subscriptor"
1556
  #: adminpages/membershiplevels.php:575
1557
  #: pages/confirmation.php:140
1558
  #: adminpages/discountcodes.php:693
 
 
1559
  msgid "Expires In"
1560
  msgstr "Expira En"
1561
 
@@ -1572,6 +1711,8 @@ msgstr "Expira En"
1572
  #: adminpages/discountcodes.php:707
1573
  #: adminpages/membershiplevels.php:586
1574
  #: adminpages/discountcodes.php:709
 
 
1575
  msgid "Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires."
1576
  msgstr "Indiqueu la durada de l’accés de subcriptors. Recordeu que qualsevol pagament futur (recurrent de subscripció, si escau) es cancel·larà quan la subscripció caduqui."
1577
 
@@ -1581,6 +1722,7 @@ msgstr "Indiqueu la durada de l’accés de subcriptors. Recordeu que qualsevol
1581
  #: adminpages/discountcodes.php:556
1582
  #: adminpages/discountcodes.php:734
1583
  #: adminpages/discountcodes.php:736
 
1584
  msgid "Memberships Discount Codes"
1585
  msgstr "Codis de descompte per a subscripcions"
1586
 
@@ -1590,6 +1732,7 @@ msgstr "Codis de descompte per a subscripcions"
1590
  #: adminpages/discountcodes.php:566
1591
  #: adminpages/discountcodes.php:771
1592
  #: adminpages/discountcodes.php:773
 
1593
  msgid "Search Discount Codes"
1594
  msgstr "Cerca codis de descompte"
1595
 
@@ -1602,6 +1745,7 @@ msgstr "Cerca codis de descompte"
1602
  #: adminpages/reports/login.php:83
1603
  #: adminpages/discountcodes.php:774
1604
  #: adminpages/discountcodes.php:776
 
1605
  msgid "Search"
1606
  msgstr "Cerca"
1607
 
@@ -1611,6 +1755,7 @@ msgstr "Cerca"
1611
  #: adminpages/discountcodes.php:587
1612
  #: adminpages/discountcodes.php:785
1613
  #: adminpages/discountcodes.php:787
 
1614
  msgid "Starts"
1615
  msgstr "Comença"
1616
 
@@ -1639,6 +1784,9 @@ msgstr "Comença"
1639
  #: adminpages/discountcodes.php:788
1640
  #: includes/profile.php:65
1641
  #: adminpages/dashboard.php:228
 
 
 
1642
  msgid "Expires"
1643
  msgstr "Acaba"
1644
 
@@ -1649,6 +1797,7 @@ msgstr "Acaba"
1649
  #: adminpages/admin_header.php:253
1650
  #: adminpages/discountcodes.php:788
1651
  #: adminpages/discountcodes.php:790
 
1652
  msgid "Levels"
1653
  msgstr "Nivells"
1654
 
@@ -1690,6 +1839,8 @@ msgstr "Els codis de descompte et permeten oferir"
1690
  #: adminpages/orders.php:1565
1691
  #: adminpages/orders.php:1564
1692
  #: adminpages/orders.php:1556
 
 
1693
  msgid "edit"
1694
  msgstr "Edita"
1695
 
@@ -1748,6 +1899,7 @@ msgstr "Configuració de correu electrònic"
1748
  #: adminpages/emailsettings.php:70
1749
  #: adminpages/emailsettings.php:61
1750
  #: adminpages/emailsettings.php:88
 
1751
  msgid "By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below."
1752
  msgstr "Per defecte, els correus electrònics generats són enviats desde <em><strong>wordpress@yourdomain.com</strong></em>. Pots modificar-ho utilitzant els camps que hi ha a continuació."
1753
 
@@ -1759,22 +1911,26 @@ msgstr "Per modificar l’aparença dels emails generats pel sistema, afegeix el
1759
  #: adminpages/emailsettings.php:78
1760
  #: adminpages/emailsettings.php:69
1761
  #: adminpages/emailsettings.php:94
 
1762
  msgid "From Email"
1763
  msgstr "Del Correu Electrònic"
1764
 
1765
  #: adminpages/emailsettings.php:86
1766
  #: adminpages/emailsettings.php:77
1767
  #: adminpages/emailsettings.php:102
 
1768
  msgid "From Name"
1769
  msgstr "Del Nom"
1770
 
1771
  #: adminpages/emailsettings.php:94
1772
  #: adminpages/emailsettings.php:110
 
1773
  msgid "Only Filter PMPro Emails?"
1774
  msgstr "Filtra només els correus de PMPro?"
1775
 
1776
  #: adminpages/emailsettings.php:98
1777
  #: adminpages/emailsettings.php:114
 
1778
  #, php-format
1779
  msgid "If unchecked, all emails from \"WordPress &lt;%s&gt;\" will be filtered to use the above settings."
1780
  msgstr "Si no està clicat, tots els correus de \"WordPress &lt;%s&gt;\" seran filtrats per utilitzar la configuració de dalt."
@@ -1943,6 +2099,9 @@ msgstr "Afegeix un nou nivell de subscripció"
1943
  #: adminpages/membershiplevels.php:808
1944
  #: adminpages/reports/history.php:184
1945
  #: adminpages/reports/login.php:181
 
 
 
1946
  msgid "Name"
1947
  msgstr "Nom"
1948
 
@@ -1950,6 +2109,7 @@ msgstr "Nom"
1950
  #: adminpages/membershiplevels.php:314
1951
  #: adminpages/membershiplevels.php:316
1952
  #: adminpages/membershiplevels.php:377
 
1953
  msgid "Confirmation Message"
1954
  msgstr "Missatge de confirmació"
1955
 
@@ -1963,6 +2123,8 @@ msgstr "Missatge de confirmació"
1963
  #: adminpages/membershiplevels.php:639
1964
  #: adminpages/membershiplevels.php:397
1965
  #: adminpages/membershiplevels.php:809
 
 
1966
  msgid "Billing Details"
1967
  msgstr "Detalls de facturació"
1968
 
@@ -1986,6 +2148,9 @@ msgstr "Detalls de facturació"
1986
  #: classes/gateways/class.pmprogateway_stripe.php:2700
1987
  #: classes/gateways/class.pmprogateway_stripe.php:2696
1988
  #: classes/gateways/class.pmprogateway_stripe.php:2698
 
 
 
1989
  msgid "per"
1990
  msgstr "per"
1991
 
@@ -2004,6 +2169,7 @@ msgstr "La integració d’Stripe actualment només suporta períodes de factura
2004
  #: adminpages/discountcodes.php:620
2005
  #: adminpages/membershiplevels.php:448
2006
  #: adminpages/discountcodes.php:622
 
2007
  msgid "Braintree integration currently only supports billing periods of \"Month\" or \"Year\"."
2008
  msgstr "La integració de Braintree actualment només suporta períodes de facturació de “mes” o “any”."
2009
 
@@ -2021,6 +2187,7 @@ msgstr "La integració de Payflow actualment només suporta períodes de factura
2021
  #: adminpages/membershiplevels.php:393
2022
  #: adminpages/membershiplevels.php:396
2023
  #: adminpages/membershiplevels.php:454
 
2024
  msgid "After saving this level, make note of the ID and create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to <em>pmpro_#</em>, where # is the level ID."
2025
  msgstr "Després de salvar aquest nivell, anota’t la ID i crea un \"Plan\" al dashboard de Braintree amb la mateixa configuració i el \"Plan ID\" set to <em>pmpro_#</em>, on # és el level ID."
2026
 
@@ -2043,6 +2210,8 @@ msgstr "Després de salvar aquest nivell, anota’t la ID i crea un \"Plan\" al
2043
  #: adminpages/membershiplevels.php:454
2044
  #: adminpages/membershiplevels.php:459
2045
  #: classes/gateways/class.pmprogateway_cybersource.php:89
 
 
2046
  msgid "Note"
2047
  msgstr "Nota"
2048
 
@@ -2062,6 +2231,7 @@ msgstr "Has de crear un “Plan\" a Braintree dashboard amb la mateixa configura
2062
  #: adminpages/discountcodes.php:634
2063
  #: adminpages/membershiplevels.php:471
2064
  #: adminpages/discountcodes.php:636
 
2065
  msgid "Stripe integration currently does not support billing limits. You can still set an expiration date below."
2066
  msgstr "La integració d’Stripe no suporta límits de facturació actualment. Pots posar una data de límit de facturació a sota."
2067
 
@@ -2073,6 +2243,8 @@ msgstr "La integració d’Stripe no suporta límits de facturació actualment.
2073
  #: adminpages/discountcodes.php:655
2074
  #: adminpages/membershiplevels.php:493
2075
  #: adminpages/discountcodes.php:657
 
 
2076
  msgid "2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount."
2077
  msgstr "La integració de 2Checkout no suporta proves personalitzades. Pots afegir un període de prova configurant un pagament inicial diferent del total de facturació."
2078
 
@@ -2085,6 +2257,7 @@ msgstr "La integració de 2Checkout no suporta proves personalitzades. Pots afeg
2085
  #: adminpages/discountcodes.php:676
2086
  #: adminpages/membershiplevels.php:525
2087
  #: adminpages/discountcodes.php:678
 
2088
  msgid "Stripe integration currently does not support trial amounts greater than $0."
2089
  msgstr "La integració d’Stripe no suporta preus de prova majors que $0."
2090
 
@@ -2097,6 +2270,7 @@ msgstr "La integració d’Stripe no suporta preus de prova majors que $0."
2097
  #: adminpages/discountcodes.php:678
2098
  #: adminpages/membershiplevels.php:527
2099
  #: adminpages/discountcodes.php:680
 
2100
  msgid "Braintree integration currently does not support trial amounts greater than $0."
2101
  msgstr "La integració de Braintree no suporta preus de prova majors que $0."
2102
 
@@ -2109,6 +2283,7 @@ msgstr "La integració de Braintree no suporta preus de prova majors que $0."
2109
  #: adminpages/discountcodes.php:680
2110
  #: adminpages/membershiplevels.php:529
2111
  #: adminpages/discountcodes.php:682
 
2112
  msgid "Payflow integration currently does not support trial amounts greater than $0."
2113
  msgstr "La integració de Payflow no suporta preus de prova majors que $0."
2114
 
@@ -2123,6 +2298,7 @@ msgstr "La integració de Payflow no suporta preus de prova majors que $0."
2123
  #: adminpages/dashboard.php:140
2124
  #: adminpages/membershiplevels.php:550
2125
  #: adminpages/advancedsettings.php:343
 
2126
  msgid "Other Settings"
2127
  msgstr "Configuració, altres"
2128
 
@@ -2158,6 +2334,8 @@ msgstr "Clica per amagar aquest nivell de la pàgina de nivells de subscripció
2158
  #: adminpages/advancedsettings.php:194
2159
  #: adminpages/membershiplevels.php:624
2160
  #: adminpages/advancedsettings.php:196
 
 
2161
  msgid "Content Settings"
2162
  msgstr "Configuració de continguts"
2163
 
@@ -2169,12 +2347,14 @@ msgstr "Configuració de continguts"
2169
  #: adminpages/membershiplevels.php:497
2170
  #: adminpages/membershiplevels.php:500
2171
  #: adminpages/membershiplevels.php:654
 
2172
  msgid "Categories"
2173
  msgstr "Categories"
2174
 
2175
  #: adminpages/membershiplevels.php:516
2176
  #: adminpages/membershiplevels.php:517
2177
  #: adminpages/membershiplevels.php:674
 
2178
  msgid "Save Level"
2179
  msgstr "Salva nivell"
2180
 
@@ -2209,6 +2389,14 @@ msgstr "Salva nivell"
2209
  #: includes/profile.php:918
2210
  #: adminpages/orders.php:960
2211
  #: pages/billing.php:436
 
 
 
 
 
 
 
 
2212
  msgid "Cancel"
2213
  msgstr "Cancel·la"
2214
 
@@ -2249,6 +2437,7 @@ msgstr "Cerca Nivells"
2249
  #: adminpages/membershiplevels.php:579
2250
  #: adminpages/membershiplevels.php:631
2251
  #: adminpages/membershiplevels.php:797
 
2252
  msgid "Drag and drop membership levels to reorder them on the Levels page."
2253
  msgstr "Arrossega i deixa anar els nivells de subscripció per a reordenar-los a la pàgina de nivells"
2254
 
@@ -2273,6 +2462,9 @@ msgstr "Arrossega i deixa anar els nivells de subscripció per a reordenar-los a
2273
  #: pages/confirmation.php:99
2274
  #: pages/invoice.php:89
2275
  #: shortcodes/pmpro_account.php:44
 
 
 
2276
  msgid "Expiration"
2277
  msgstr "Data final (d’expiració)"
2278
 
@@ -2285,6 +2477,7 @@ msgstr "Data final (d’expiració)"
2285
  #: adminpages/membershiplevels.php:587
2286
  #: adminpages/membershiplevels.php:641
2287
  #: adminpages/membershiplevels.php:811
 
2288
  msgid "Allow Signups"
2289
  msgstr "Permet nous “signups”"
2290
 
@@ -2298,6 +2491,7 @@ msgstr "Permet nous “signups”"
2298
  #: adminpages/membershiplevels.php:656
2299
  #: adminpages/membershiplevels.php:840
2300
  #: adminpages/membershiplevels.php:921
 
2301
  msgid "FREE"
2302
  msgstr "GRATUÏT"
2303
 
@@ -2311,6 +2505,7 @@ msgstr "GRATUÏT"
2311
  #: adminpages/membershiplevels.php:665
2312
  #: adminpages/membershiplevels.php:849
2313
  #: adminpages/membershiplevels.php:930
 
2314
  msgid "After"
2315
  msgstr "Després"
2316
 
@@ -2356,6 +2551,7 @@ msgstr "copia"
2356
  #: includes/adminpages.php:149
2357
  #: includes/adminpages.php:153
2358
  #: adminpages/memberslist.php:20
 
2359
  msgid "Members List"
2360
  msgstr "Llistat de subscriptors"
2361
 
@@ -2368,6 +2564,9 @@ msgstr "Llistat de subscriptors"
2368
  #: adminpages/orders.php:994
2369
  #: adminpages/orders.php:1000
2370
  #: adminpages/orders.php:992
 
 
 
2371
  msgid "Export to CSV"
2372
  msgstr "Exporta a CSV"
2373
 
@@ -2395,6 +2594,10 @@ msgstr "Exporta a CSV"
2395
  #: adminpages/orders.php:1012
2396
  #: adminpages/reports/sales.php:311
2397
  #: classes/class-pmpro-members-list-table.php:651
 
 
 
 
2398
  msgid "Show"
2399
  msgstr "Mostra"
2400
 
@@ -2421,6 +2624,10 @@ msgstr "Mostra"
2421
  #: classes/class.pmproemail.php:195
2422
  #: classes/class.pmproemail.php:235
2423
  #: classes/class-pmpro-members-list-table.php:653
 
 
 
 
2424
  msgid "All Levels"
2425
  msgstr "Tots els nivells"
2426
 
@@ -2430,6 +2637,7 @@ msgstr "Tots els nivells"
2430
  #: classes/class-pmpro-members-list-table.php:234
2431
  #: classes/class-pmpro-members-list-table.php:634
2432
  #: classes/class-pmpro-members-list-table.php:663
 
2433
  msgid "Cancelled Members"
2434
  msgstr "Subscriptors cancel·lats"
2435
 
@@ -2439,6 +2647,7 @@ msgstr "Subscriptors cancel·lats"
2439
  #: classes/class-pmpro-members-list-table.php:235
2440
  #: classes/class-pmpro-members-list-table.php:635
2441
  #: classes/class-pmpro-members-list-table.php:664
 
2442
  msgid "Expired Members"
2443
  msgstr "Subscriptors “expirats”"
2444
 
@@ -2449,6 +2658,7 @@ msgstr "Subscriptors “expirats”"
2449
  #: classes/class-pmpro-members-list-table.php:236
2450
  #: classes/class-pmpro-members-list-table.php:636
2451
  #: classes/class-pmpro-members-list-table.php:665
 
2452
  msgid "Old Members"
2453
  msgstr "Subscriptors antics"
2454
 
@@ -2460,6 +2670,9 @@ msgstr "Subscriptors antics"
2460
  #: adminpages/memberslist.php:28
2461
  #: adminpages/reports/history.php:115
2462
  #: adminpages/reports/history.php:119
 
 
 
2463
  msgid "Search Members"
2464
  msgstr "Cerca Subscriptors"
2465
 
@@ -2497,6 +2710,9 @@ msgstr "%d subscriptor no trobat."
2497
  #: adminpages/dashboard.php:223
2498
  #: adminpages/dashboard.php:225
2499
  #: classes/class.memberorder.php:1003
 
 
 
2500
  msgid "Username"
2501
  msgstr "Nom d’usuari"
2502
 
@@ -2539,6 +2755,8 @@ msgstr "Cognoms"
2539
  #: pages/checkout.php:230
2540
  #: pages/confirmation.php:78
2541
  #: pages/invoice.php:68
 
 
2542
  msgid "Billing Address"
2543
  msgstr "Adreça de Facturació"
2544
 
@@ -2574,6 +2792,7 @@ msgstr "Preu"
2574
  #: adminpages/reports/login.php:183
2575
  #: adminpages/dashboard.php:225
2576
  #: adminpages/dashboard.php:227
 
2577
  msgid "Joined"
2578
  msgstr "Afegit"
2579
 
@@ -2597,6 +2816,7 @@ msgstr "Finalitzat"
2597
  #: adminpages/dashboard.php:232
2598
  #: classes/class-pmpro-members-list-table.php:225
2599
  #: adminpages/dashboard.php:234
 
2600
  msgid "No members found."
2601
  msgstr "No s’han trobat subscriptors"
2602
 
@@ -2611,6 +2831,7 @@ msgstr "No s’han trobat subscriptors"
2611
  #: adminpages/reports/login.php:263
2612
  #: classes/class-pmpro-members-list-table.php:228
2613
  #: classes/class-pmpro-members-list-table.php:227
 
2614
  msgid "Search all levels"
2615
  msgstr "Cerca a tots els nivells"
2616
 
@@ -2637,6 +2858,7 @@ msgstr "Comanda esborrada correctament"
2637
  #: adminpages/orders.php:72
2638
  #: adminpages/orders.php:164
2639
  #: adminpages/orders.php:170
 
2640
  msgid "Error deleting order."
2641
  msgstr "Error esborrant comanda."
2642
 
@@ -2645,6 +2867,8 @@ msgstr "Error esborrant comanda."
2645
  #: adminpages/orders.php:169
2646
  #: adminpages/orders.php:309
2647
  #: adminpages/orders.php:315
 
 
2648
  msgid "Order saved successfully."
2649
  msgstr "Comanda salvada correctament."
2650
 
@@ -2659,6 +2883,8 @@ msgstr "Error actualitzant la marca de temps de la comanda (order timestamp)"
2659
  #: adminpages/orders.php:180
2660
  #: adminpages/orders.php:312
2661
  #: adminpages/orders.php:318
 
 
2662
  msgid "Error saving order."
2663
  msgstr "Error guardant la comanda."
2664
 
@@ -2671,6 +2897,8 @@ msgstr "Error guardant la comanda."
2671
  #: classes/class.memberorder.php:963
2672
  #: adminpages/orders.php:389
2673
  #: classes/class.memberorder.php:1005
 
 
2674
  msgid "Order"
2675
  msgstr "Comanda"
2676
 
@@ -2680,6 +2908,8 @@ msgstr "Comanda"
2680
  #: adminpages/orders.php:348
2681
  #: adminpages/orders.php:387
2682
  #: adminpages/orders.php:393
 
 
2683
  msgid "New Order"
2684
  msgstr "Nova comanda"
2685
 
@@ -2689,6 +2919,8 @@ msgstr "Nova comanda"
2689
  #: adminpages/orders.php:371
2690
  #: adminpages/orders.php:433
2691
  #: adminpages/orders.php:439
 
 
2692
  msgid "Randomly generated for you."
2693
  msgstr "Generat aleatoriament per a tu"
2694
 
@@ -2698,6 +2930,8 @@ msgstr "Generat aleatoriament per a tu"
2698
  #: adminpages/orders.php:376
2699
  #: adminpages/orders.php:438
2700
  #: adminpages/orders.php:444
 
 
2701
  msgid "User ID"
2702
  msgstr "ID d’usuari"
2703
 
@@ -2708,6 +2942,9 @@ msgstr "ID d’usuari"
2708
  #: adminpages/emailtemplates.php:130
2709
  #: adminpages/orders.php:451
2710
  #: adminpages/orders.php:457
 
 
 
2711
  msgid "Membership Level ID"
2712
  msgstr "ID del Nivell de subscripció"
2713
 
@@ -2718,6 +2955,8 @@ msgstr "ID del Nivell de subscripció"
2718
  #: adminpages/orders.php:464
2719
  #: includes/privacy.php:245
2720
  #: adminpages/orders.php:470
 
 
2721
  msgid "Billing Name"
2722
  msgstr "Nom de Facturació"
2723
 
@@ -2728,6 +2967,8 @@ msgstr "Nom de Facturació"
2728
  #: adminpages/orders.php:478
2729
  #: includes/privacy.php:249
2730
  #: adminpages/orders.php:484
 
 
2731
  msgid "Billing Street"
2732
  msgstr "Adreça de Facturació"
2733
 
@@ -2740,6 +2981,7 @@ msgstr "Adreça de Facturació"
2740
  #: includes/privacy.php:358
2741
  #: adminpages/orders.php:497
2742
  #: adminpages/orders.php:496
 
2743
  msgid "Billing City"
2744
  msgstr "Ciutat de Facturació"
2745
 
@@ -2751,6 +2993,7 @@ msgstr "Ciutat de Facturació"
2751
  #: includes/privacy.php:257
2752
  #: adminpages/orders.php:510
2753
  #: adminpages/orders.php:509
 
2754
  msgid "Billing State"
2755
  msgstr "Provincia de Facturació"
2756
 
@@ -2763,6 +3006,8 @@ msgstr "Provincia de Facturació"
2763
  #: includes/privacy.php:360
2764
  #: adminpages/orders.php:523
2765
  #: adminpages/orders.php:521
 
 
2766
  msgid "Billing Postal Code"
2767
  msgstr "Codi postal de Facturació"
2768
 
@@ -2775,6 +3020,8 @@ msgstr "Codi postal de Facturació"
2775
  #: includes/privacy.php:362
2776
  #: adminpages/orders.php:536
2777
  #: adminpages/orders.php:533
 
 
2778
  msgid "Billing Country"
2779
  msgstr "País de Facturació"
2780
 
@@ -2786,6 +3033,8 @@ msgstr "País de Facturació"
2786
  #: includes/privacy.php:269
2787
  #: adminpages/orders.php:550
2788
  #: adminpages/orders.php:546
 
 
2789
  msgid "Billing Phone"
2790
  msgstr "Telèfon de Facturació"
2791
 
@@ -2797,6 +3046,8 @@ msgstr "Telèfon de Facturació"
2797
  #: includes/privacy.php:273
2798
  #: adminpages/orders.php:602
2799
  #: adminpages/orders.php:597
 
 
2800
  msgid "Sub Total"
2801
  msgstr "Subtotal"
2802
 
@@ -2814,6 +3065,10 @@ msgstr "Subtotal"
2814
  #: adminpages/orders.php:615
2815
  #: includes/functions.php:2880
2816
  #: adminpages/orders.php:610
 
 
 
 
2817
  msgid "Tax"
2818
  msgstr "Impost"
2819
 
@@ -2825,6 +3080,8 @@ msgstr "Impost"
2825
  #: includes/privacy.php:281
2826
  #: adminpages/orders.php:632
2827
  #: adminpages/orders.php:627
 
 
2828
  msgid "Coupon Amount"
2829
  msgstr "Valor del cupó"
2830
 
@@ -2853,6 +3110,12 @@ msgstr "Valor del cupó"
2853
  #: adminpages/orders.php:645
2854
  #: adminpages/orders.php:1336
2855
  #: adminpages/dashboard.php:295
 
 
 
 
 
 
2856
  msgid "Total"
2857
  msgstr "Total"
2858
 
@@ -2871,6 +3134,8 @@ msgstr "Hauria de ser subtotal+impost+valor del cupó"
2871
  #: includes/privacy.php:289
2872
  #: adminpages/orders.php:664
2873
  #: adminpages/orders.php:659
 
 
2874
  msgid "Payment Type"
2875
  msgstr "Tipus de pagament"
2876
 
@@ -2881,6 +3146,8 @@ msgstr "Tipus de pagament"
2881
  #: adminpages/orders.php:669
2882
  #: adminpages/orders.php:675
2883
  #: adminpages/orders.php:670
 
 
2884
  msgid "e.g. PayPal Express, PayPal Standard, Credit Card."
2885
  msgstr "Per exemple PayPal Express, PayPal Standard, Tarja de crèdit"
2886
 
@@ -2919,6 +3186,11 @@ msgstr "Per exemple PayPal Express, PayPal Standard, Tarja de crèdit"
2919
  #: classes/gateways/class.pmprogateway_stripe.php:1309
2920
  #: adminpages/orders.php:674
2921
  #: classes/gateways/class.pmprogateway_stripe.php:768
 
 
 
 
 
2922
  msgid "Card Type"
2923
  msgstr "Tipus de targeta"
2924
 
@@ -2929,6 +3201,8 @@ msgstr "Tipus de targeta"
2929
  #: adminpages/orders.php:683
2930
  #: adminpages/orders.php:689
2931
  #: adminpages/orders.php:684
 
 
2932
  msgid "e.g. Visa, MasterCard, AMEX, etc"
2933
  msgstr "Per exemple Visa, MasterCard, AMEX, etc"
2934
 
@@ -2946,6 +3220,9 @@ msgstr "Per exemple Visa, MasterCard, AMEX, etc"
2946
  #: includes/privacy.php:297
2947
  #: adminpages/orders.php:693
2948
  #: adminpages/orders.php:688
 
 
 
2949
  msgid "Account Number"
2950
  msgstr "Nombre de Compte"
2951
 
@@ -2955,6 +3232,8 @@ msgstr "Nombre de Compte"
2955
  #: adminpages/orders.php:504
2956
  #: adminpages/orders.php:698
2957
  #: adminpages/orders.php:704
 
 
2958
  msgid "Obscure all but last 4 digits."
2959
  msgstr "Tot amagat menys els últims 4 dígits"
2960
 
@@ -2967,6 +3246,9 @@ msgstr "Tot amagat menys els últims 4 dígits"
2967
  #: includes/privacy.php:301
2968
  #: adminpages/orders.php:713
2969
  #: adminpages/orders.php:724
 
 
 
2970
  msgid "Expiration Month"
2971
  msgstr "Mes de finalització/expiració"
2972
 
@@ -2977,6 +3259,7 @@ msgstr "Mes de finalització/expiració"
2977
  #: adminpages/orders.php:726
2978
  #: includes/privacy.php:305
2979
  #: adminpages/orders.php:732
 
2980
  msgid "Expiration Year"
2981
  msgstr "Any de finalització/expiració"
2982
 
@@ -3007,6 +3290,11 @@ msgstr "Any de finalització/expiració"
3007
  #: adminpages/orders.php:735
3008
  #: adminpages/orders.php:1340
3009
  #: adminpages/dashboard.php:296
 
 
 
 
 
3010
  msgid "Status"
3011
  msgstr "Estat"
3012
 
@@ -3028,6 +3316,10 @@ msgstr "Estat"
3028
  #: adminpages/orders.php:757
3029
  #: adminpages/orders.php:1338
3030
  #: classes/class.memberorder.php:1006
 
 
 
 
3031
  msgid "Gateway"
3032
  msgstr "Passarel·la"
3033
 
@@ -3045,6 +3337,9 @@ msgstr "Passarel·la"
3045
  #: includes/privacy.php:317
3046
  #: adminpages/orders.php:787
3047
  #: adminpages/orders.php:780
 
 
 
3048
  msgid "Gateway Environment"
3049
  msgstr "Entorn de passarel·la"
3050
 
@@ -3064,6 +3359,11 @@ msgstr "Entorn de passarel·la"
3064
  #: classes/class-pmpro-site-health.php:206
3065
  #: adminpages/orders.php:788
3066
  #: classes/class-pmpro-site-health.php:210
 
 
 
 
 
3067
  msgid "Sandbox/Testing"
3068
  msgstr "Sandbox/Proves"
3069
 
@@ -3083,6 +3383,11 @@ msgstr "Sandbox/Proves"
3083
  #: classes/class-pmpro-site-health.php:207
3084
  #: adminpages/orders.php:789
3085
  #: classes/class-pmpro-site-health.php:211
 
 
 
 
 
3086
  msgid "Live/Production"
3087
  msgstr "Live/Producció"
3088
 
@@ -3095,6 +3400,7 @@ msgstr "Live/Producció"
3095
  #: includes/privacy.php:321
3096
  #: adminpages/orders.php:804
3097
  #: adminpages/orders.php:797
 
3098
  msgid "Payment Transaction ID"
3099
  msgstr "ID de la transacció de pagament"
3100
 
@@ -3106,6 +3412,7 @@ msgstr "ID de la transacció de pagament"
3106
  #: adminpages/orders.php:808
3107
  #: adminpages/orders.php:814
3108
  #: adminpages/orders.php:807
 
3109
  msgid "Generated by the gateway. Useful to cross reference orders."
3110
  msgstr "Generat per la passarel·la. Útil per a comandes de referències creuades."
3111
 
@@ -3120,6 +3427,8 @@ msgstr "Generat per la passarel·la. Útil per a comandes de referències creuad
3120
  #: adminpages/orders.php:819
3121
  #: adminpages/orders.php:812
3122
  #: classes/class.memberorder.php:1007
 
 
3123
  msgid "Subscription Transaction ID"
3124
  msgstr "ID de la transacció per a subscripció"
3125
 
@@ -3131,6 +3440,8 @@ msgstr "ID de la transacció per a subscripció"
3131
  #: adminpages/orders.php:824
3132
  #: adminpages/orders.php:830
3133
  #: adminpages/orders.php:822
 
 
3134
  msgid "Generated by the gateway. Useful to cross reference subscriptions."
3135
  msgstr "Generat per la passarel·la. Útil per a subscripcions de referències creuades."
3136
 
@@ -3162,6 +3473,10 @@ msgstr "Generat per la passarel·la. Útil per a subscripcions de referències c
3162
  #: adminpages/orders.php:827
3163
  #: adminpages/orders.php:1341
3164
  #: adminpages/dashboard.php:297
 
 
 
 
3165
  msgid "Date"
3166
  msgstr "Data"
3167
 
@@ -3172,6 +3487,8 @@ msgstr "Data"
3172
  #: adminpages/orders.php:874
3173
  #: adminpages/orders.php:880
3174
  #: adminpages/orders.php:872
 
 
3175
  msgid "Affiliate ID"
3176
  msgstr "ID de subscripció"
3177
 
@@ -3182,6 +3499,8 @@ msgstr "ID de subscripció"
3182
  #: adminpages/orders.php:887
3183
  #: adminpages/orders.php:893
3184
  #: adminpages/orders.php:885
 
 
3185
  msgid "Affiliate SubID"
3186
  msgstr "SubID de subscripció"
3187
 
@@ -3192,6 +3511,8 @@ msgstr "SubID de subscripció"
3192
  #: adminpages/orders.php:923
3193
  #: adminpages/orders.php:929
3194
  #: adminpages/orders.php:921
 
 
3195
  msgid "Notes"
3196
  msgstr "Notes"
3197
 
@@ -3202,6 +3523,8 @@ msgstr "Notes"
3202
  #: adminpages/orders.php:961
3203
  #: adminpages/orders.php:967
3204
  #: adminpages/orders.php:959
 
 
3205
  msgid "Save Order"
3206
  msgstr "Salva Comanda"
3207
 
@@ -3246,6 +3569,9 @@ msgstr "Envia Correu"
3246
  #: adminpages/discountcodes.php:884
3247
  #: classes/class-pmpro-site-health.php:77
3248
  #: adminpages/orders.php:970
 
 
 
3249
  msgid "Orders"
3250
  msgstr "Comandes"
3251
 
@@ -3256,6 +3582,8 @@ msgstr "Comandes"
3256
  #: adminpages/orders.php:973
3257
  #: adminpages/orders.php:979
3258
  #: adminpages/orders.php:971
 
 
3259
  msgid "Add New Order"
3260
  msgstr "Afegeix nova comanda"
3261
 
@@ -3265,6 +3593,8 @@ msgstr "Afegeix nova comanda"
3265
  #: adminpages/orders.php:1018
3266
  #: adminpages/orders.php:1024
3267
  #: adminpages/orders.php:1016
 
 
3268
  msgid "Within a Date Range"
3269
  msgstr "Dins del període"
3270
 
@@ -3274,6 +3604,8 @@ msgstr "Dins del període"
3274
  #: adminpages/orders.php:1020
3275
  #: adminpages/orders.php:1026
3276
  #: adminpages/orders.php:1018
 
 
3277
  msgid "Predefined Date Range"
3278
  msgstr "Període predefinit"
3279
 
@@ -3283,6 +3615,8 @@ msgstr "Període predefinit"
3283
  #: adminpages/orders.php:1022
3284
  #: adminpages/orders.php:1028
3285
  #: adminpages/orders.php:1020
 
 
3286
  msgid "Within a Level"
3287
  msgstr "Dins del nivell"
3288
 
@@ -3292,6 +3626,8 @@ msgstr "Dins del nivell"
3292
  #: adminpages/orders.php:1026
3293
  #: adminpages/orders.php:1032
3294
  #: adminpages/orders.php:1024
 
 
3295
  msgid "Within a Status"
3296
  msgstr "Dins de l’”Status”"
3297
 
@@ -3301,6 +3637,8 @@ msgstr "Dins de l’”Status”"
3301
  #: adminpages/orders.php:1038
3302
  #: adminpages/orders.php:1044
3303
  #: adminpages/orders.php:1036
 
 
3304
  msgid "From"
3305
  msgstr "De"
3306
 
@@ -3310,6 +3648,8 @@ msgstr "De"
3310
  #: adminpages/orders.php:1053
3311
  #: adminpages/orders.php:1059
3312
  #: adminpages/orders.php:1051
 
 
3313
  msgid "To"
3314
  msgstr "per a "
3315
 
@@ -3319,6 +3659,8 @@ msgstr "per a "
3319
  #: adminpages/orders.php:1066
3320
  #: adminpages/orders.php:1072
3321
  #: adminpages/orders.php:1064
 
 
3322
  msgid "filter by "
3323
  msgstr "filtrat per"
3324
 
@@ -3328,6 +3670,8 @@ msgstr "filtrat per"
3328
  #: adminpages/orders.php:1116
3329
  #: adminpages/orders.php:1122
3330
  #: adminpages/orders.php:1114
 
 
3331
  msgid "Filter"
3332
  msgstr "Filtre"
3333
 
@@ -3345,6 +3689,10 @@ msgstr "Filtre"
3345
  #: adminpages/orders.php:1259
3346
  #: adminpages/orders.php:1248
3347
  #: adminpages/orders.php:1251
 
 
 
 
3348
  msgid "Search Orders"
3349
  msgstr "Cerca Comandes"
3350
 
@@ -3356,6 +3704,9 @@ msgstr "Cerca Comandes"
3356
  #: adminpages/orders.php:1326
3357
  #: adminpages/orders.php:1332
3358
  #: adminpages/orders.php:1324
 
 
 
3359
  #, php-format
3360
  msgid "%d orders found."
3361
  msgstr "%d comandes no trobades"
@@ -3379,6 +3730,8 @@ msgstr "%d comandes no trobades"
3379
  #: adminpages/orders.php:1341
3380
  #: adminpages/orders.php:1333
3381
  #: adminpages/dashboard.php:293
 
 
3382
  msgid "User"
3383
  msgstr "Usuari"
3384
 
@@ -3422,6 +3775,8 @@ msgstr "Usuari"
3422
  #: js/blocks.build.js:798
3423
  #: js/blocks.build.js:1004
3424
  #: js/blocks.build.js:1086
 
 
3425
  msgid "Membership Level"
3426
  msgstr "Nivell de subscripció"
3427
 
@@ -3441,6 +3796,9 @@ msgstr "Nivell de subscripció"
3441
  #: adminpages/orders.php:1539
3442
  #: adminpages/orders.php:1337
3443
  #: adminpages/orders.php:1531
 
 
 
3444
  msgid "Payment"
3445
  msgstr "Pagament"
3446
 
@@ -3452,6 +3810,8 @@ msgstr "Pagament"
3452
  #: adminpages/orders.php:1341
3453
  #: adminpages/orders.php:1347
3454
  #: adminpages/orders.php:1339
 
 
3455
  msgid "Transaction IDs"
3456
  msgstr "IDs de transacció"
3457
 
@@ -3473,6 +3833,10 @@ msgstr "IDs de transacció"
3473
  #: adminpages/orders.php:1487
3474
  #: adminpages/dashboard.php:321
3475
  #: adminpages/dashboard.php:336
 
 
 
 
3476
  msgid "deleted"
3477
  msgstr "esborrat"
3478
 
@@ -3485,6 +3849,8 @@ msgstr "esborrat"
3485
  #: adminpages/orders.php:1471
3486
  #: adminpages/orders.php:1548
3487
  #: adminpages/orders.php:1540
 
 
3488
  msgid "Subscription"
3489
  msgstr "Subscripció"
3490
 
@@ -3499,6 +3865,8 @@ msgstr "Subscripció"
3499
  #: adminpages/orders.php:1372
3500
  #: adminpages/orders.php:1375
3501
  #: adminpages/orders.php:1367
 
 
3502
  #, php-format
3503
  msgid "Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?"
3504
  msgstr "Esborra comandes és permanent i pot afectar usuaris actius. Estàs segur que vols esborrar la comanda %s?"
@@ -3527,6 +3895,8 @@ msgstr "correu electrònic"
3527
  #: adminpages/orders.php:1576
3528
  #: adminpages/orders.php:1568
3529
  #: adminpages/dashboard.php:304
 
 
3530
  msgid "No orders found."
3531
  msgstr "No s’han trobat comandes"
3532
 
@@ -3599,6 +3969,7 @@ msgstr "Les següents pàgines han estat creades per a tu"
3599
  #: adminpages/pagesettings.php:167
3600
  #: adminpages/pagesettings.php:182
3601
  #: adminpages/pagesettings.php:186
 
3602
  msgid "Manage the WordPress pages assigned to each required Paid Memberships Pro page."
3603
  msgstr "Utilitza les pàgines de WordPress a cadascuna de les pàgines requerides per al Paid Memberships Pro"
3604
 
@@ -3608,6 +3979,7 @@ msgstr "Utilitza les pàgines de WordPress a cadascuna de les pàgines requeride
3608
  #: adminpages/pagesettings.php:169
3609
  #: adminpages/pagesettings.php:184
3610
  #: adminpages/pagesettings.php:188
 
3611
  msgid "Assign the WordPress pages for each required Paid Memberships Pro page or"
3612
  msgstr "Assigna pàgines al WordPress per cadascuna de les pàgines requerides pel Paid Memberships Pro o"
3613
 
@@ -3617,6 +3989,7 @@ msgstr "Assigna pàgines al WordPress per cadascuna de les pàgines requerides p
3617
  #: adminpages/pagesettings.php:170
3618
  #: adminpages/pagesettings.php:185
3619
  #: adminpages/pagesettings.php:189
 
3620
  msgid "click here to let us generate them for you"
3621
  msgstr "Clica aquí per permetre’ns generar-les per a tu"
3622
 
@@ -3626,6 +3999,7 @@ msgstr "Clica aquí per permetre’ns generar-les per a tu"
3626
  #: adminpages/pagesettings.php:186
3627
  #: adminpages/pagesettings.php:201
3628
  #: adminpages/pagesettings.php:205
 
3629
  msgid "Account Page"
3630
  msgstr "Pàgina de Compte"
3631
 
@@ -3672,6 +4046,14 @@ msgstr "Pàgina de Compte"
3672
  #: adminpages/pagesettings.php:335
3673
  #: adminpages/pagesettings.php:360
3674
  #: adminpages/pagesettings.php:485
 
 
 
 
 
 
 
 
3675
  msgid "Choose One"
3676
  msgstr "Escull-ne un"
3677
 
@@ -3732,6 +4114,16 @@ msgstr "Escull-ne un"
3732
  #: adminpages/pagesettings.php:405
3733
  #: adminpages/pagesettings.php:434
3734
  #: adminpages/pagesettings.php:493
 
 
 
 
 
 
 
 
 
 
3735
  msgid "edit page"
3736
  msgstr "Edita la pàgina"
3737
 
@@ -3789,6 +4181,15 @@ msgstr "Edita la pàgina"
3789
  #: adminpages/pagesettings.php:408
3790
  #: adminpages/pagesettings.php:437
3791
  #: adminpages/pagesettings.php:496
 
 
 
 
 
 
 
 
 
3792
  msgid "view page"
3793
  msgstr "Mira la pàgina"
3794
 
@@ -3842,6 +4243,12 @@ msgstr "Mira la pàgina"
3842
  #: adminpages/pagesettings.php:323
3843
  #: adminpages/pagesettings.php:348
3844
  #: adminpages/pagesettings.php:373
 
 
 
 
 
 
3845
  msgid "Include the shortcode"
3846
  msgstr "Inclou l’”enllaç” (shortcode)"
3847
 
@@ -3853,6 +4260,7 @@ msgstr "Inclou l’”enllaç” (shortcode)"
3853
  #: adminpages/pagesettings.php:203
3854
  #: adminpages/pagesettings.php:225
3855
  #: adminpages/pagesettings.php:229
 
3856
  msgid "Billing Information Page"
3857
  msgstr "Pàgina d’informació de Facturació"
3858
 
@@ -3864,6 +4272,7 @@ msgstr "Pàgina d’informació de Facturació"
3864
  #: adminpages/pagesettings.php:220
3865
  #: adminpages/pagesettings.php:249
3866
  #: adminpages/pagesettings.php:253
 
3867
  msgid "Cancel Page"
3868
  msgstr "Cancel·la pàgina"
3869
 
@@ -3875,6 +4284,7 @@ msgstr "Cancel·la pàgina"
3875
  #: adminpages/pagesettings.php:238
3876
  #: adminpages/pagesettings.php:274
3877
  #: adminpages/pagesettings.php:278
 
3878
  msgid "Checkout Page"
3879
  msgstr "Pàgina de Checkout"
3880
 
@@ -3886,6 +4296,7 @@ msgstr "Pàgina de Checkout"
3886
  #: adminpages/pagesettings.php:256
3887
  #: adminpages/pagesettings.php:299
3888
  #: adminpages/pagesettings.php:303
 
3889
  msgid "Confirmation Page"
3890
  msgstr "Pàgina de Confirmació"
3891
 
@@ -3897,6 +4308,7 @@ msgstr "Pàgina de Confirmació"
3897
  #: adminpages/pagesettings.php:274
3898
  #: adminpages/pagesettings.php:324
3899
  #: adminpages/pagesettings.php:328
 
3900
  msgid "Invoice Page"
3901
  msgstr "Pàgina de Factura"
3902
 
@@ -3908,6 +4320,7 @@ msgstr "Pàgina de Factura"
3908
  #: adminpages/pagesettings.php:292
3909
  #: adminpages/pagesettings.php:349
3910
  #: adminpages/pagesettings.php:353
 
3911
  msgid "Levels Page"
3912
  msgstr "Pàgina de Nivells"
3913
 
@@ -3915,6 +4328,7 @@ msgstr "Pàgina de Nivells"
3915
  #: adminpages/pagesettings.php:391
3916
  #: adminpages/pagesettings.php:457
3917
  #: adminpages/pagesettings.php:461
 
3918
  msgid "Additional Page Settings"
3919
  msgstr "Configuració addicional de pàgina"
3920
 
@@ -3928,6 +4342,9 @@ msgstr "Configuració addicional de pàgina"
3928
  #: adminpages/pagesettings.php:411
3929
  #: adminpages/pagesettings.php:440
3930
  #: adminpages/pagesettings.php:499
 
 
 
3931
  msgid "Generate Page"
3932
  msgstr "Genera pàgina"
3933
 
@@ -3947,6 +4364,8 @@ msgstr "La teva configuració de pagament ha estat actualitzada"
3947
  #: adminpages/paymentsettings.php:112
3948
  #: adminpages/paymentsettings.php:127
3949
  #: classes/class-pmpro-site-health.php:69
 
 
3950
  msgid "Payment Gateway"
3951
  msgstr "Passarela de pagament (Payment Gateway)"
3952
 
@@ -3956,6 +4375,8 @@ msgstr "Passarela de pagament (Payment Gateway)"
3956
  #: adminpages/paymentsettings.php:146
3957
  #: adminpages/paymentsettings.php:112
3958
  #: adminpages/paymentsettings.php:248
 
 
3959
  msgid "SSL Settings"
3960
  msgstr "Configuració SSL"
3961
 
@@ -3966,11 +4387,15 @@ msgstr "Aprèn més sobre <a title=\"Paid Memberships Pro - SSL Settings\" targe
3966
 
3967
  #: adminpages/paymentsettings.php:101
3968
  #: adminpages/paymentsettings.php:122
 
 
3969
  msgid "Choose a Gateway"
3970
  msgstr "Escull una passarel·la"
3971
 
3972
  #: adminpages/paymentsettings.php:148
3973
  #: adminpages/paymentsettings.php:194
 
 
3974
  msgid "Currency and Tax Settings"
3975
  msgstr "Configuració de moneda i impostos"
3976
 
@@ -3981,6 +4406,8 @@ msgstr "Configuració de moneda i impostos"
3981
  #: adminpages/paymentsettings.php:381
3982
  #: adminpages/paymentsettings.php:386
3983
  #: adminpages/paymentsettings.php:199
 
 
3984
  msgid "Currency"
3985
  msgstr "Moneda"
3986
 
@@ -3988,6 +4415,8 @@ msgstr "Moneda"
3988
  #: adminpages/paymentsettings.php:400
3989
  #: adminpages/paymentsettings.php:402
3990
  #: adminpages/paymentsettings.php:215
 
 
3991
  msgid "Not all currencies will be supported by every gateway. Please check with your gateway."
3992
  msgstr "No totes les monedes es poden usar a totes les passarel·les. Si us plau comprova la teva passarel·la."
3993
 
@@ -3997,6 +4426,8 @@ msgstr "No totes les monedes es poden usar a totes les passarel·les. Si us plau
3997
  #: adminpages/paymentsettings.php:406
3998
  #: adminpages/paymentsettings.php:408
3999
  #: adminpages/paymentsettings.php:220
 
 
4000
  msgid "Accepted Credit Card Types"
4001
  msgstr "Tipus de tarjetes de crèdit acceptades."
4002
 
@@ -4006,6 +4437,8 @@ msgstr "Tipus de tarjetes de crèdit acceptades."
4006
  #: adminpages/paymentsettings.php:443
4007
  #: adminpages/paymentsettings.php:445
4008
  #: adminpages/paymentsettings.php:234
 
 
4009
  msgid "Sales Tax"
4010
  msgstr "Impost a la venta"
4011
 
@@ -4019,6 +4452,9 @@ msgstr "Impost a la venta"
4019
  #: pages/billing.php:82
4020
  #: adminpages/paymentsettings.php:234
4021
  #: pages/billing.php:179
 
 
 
4022
  msgid "optional"
4023
  msgstr "opcional"
4024
 
@@ -4028,6 +4464,8 @@ msgstr "opcional"
4028
  #: adminpages/paymentsettings.php:446
4029
  #: adminpages/paymentsettings.php:448
4030
  #: adminpages/paymentsettings.php:237
 
 
4031
  msgid "Tax State"
4032
  msgstr "Estat/país de la taxa"
4033
 
@@ -4037,11 +4475,15 @@ msgstr "Estat/país de la taxa"
4037
  #: adminpages/paymentsettings.php:447
4038
  #: adminpages/paymentsettings.php:449
4039
  #: adminpages/paymentsettings.php:238
 
 
4040
  msgid "abbreviation, e.g. \"PA\""
4041
  msgstr "abreviació, per exemple “PA”"
4042
 
4043
  #: adminpages/paymentsettings.php:193
4044
  #: adminpages/paymentsettings.php:239
 
 
4045
  msgid "Tax Rate"
4046
  msgstr "Tarifa de l’impost"
4047
 
@@ -4051,6 +4493,8 @@ msgstr "Tarifa de l’impost"
4051
  #: adminpages/paymentsettings.php:449
4052
  #: adminpages/paymentsettings.php:451
4053
  #: adminpages/paymentsettings.php:240
 
 
4054
  msgid "decimal, e.g. \"0.06\""
4055
  msgstr "decimal, per exemple \"0.06\""
4056
 
@@ -4065,6 +4509,8 @@ msgstr "Només US. Si es donen els valors, l’impost s’aplicarà per a qualse
4065
  #: adminpages/paymentsettings.php:455
4066
  #: adminpages/paymentsettings.php:457
4067
  #: adminpages/paymentsettings.php:253
 
 
4068
  msgid "Force SSL"
4069
  msgstr "Força SSL"
4070
 
@@ -4073,11 +4519,15 @@ msgstr "Força SSL"
4073
  #: adminpages/paymentsettings.php:461
4074
  #: adminpages/paymentsettings.php:463
4075
  #: adminpages/paymentsettings.php:268
 
 
4076
  msgid "Yes (with JavaScript redirects)"
4077
  msgstr "Sí (amb redirecció de JavaScript)"
4078
 
4079
  #: adminpages/paymentsettings.php:214
4080
  #: adminpages/paymentsettings.php:270
 
 
4081
  msgid "Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops."
4082
  msgstr "Recomanat: Sí. Prova la redirecció de JavaScript si tens problemes amb redireccions amb “loops” infinits."
4083
 
@@ -4087,6 +4537,8 @@ msgstr "Recomanat: Sí. Prova la redirecció de JavaScript si tens problemes amb
4087
  #: adminpages/paymentsettings.php:468
4088
  #: adminpages/paymentsettings.php:470
4089
  #: adminpages/paymentsettings.php:278
 
 
4090
  msgid "SSL Seal Code"
4091
  msgstr "SSL Seal Code"
4092
 
@@ -4096,11 +4548,15 @@ msgstr "El teu<strong><a target=\"_blank\" href=\"http://www.paidmembershipspro.
4096
 
4097
  #: adminpages/paymentsettings.php:228
4098
  #: adminpages/paymentsettings.php:287
 
 
4099
  msgid "Extra HTTPS URL Filter"
4100
  msgstr "Extra HTTPS URL Filtre"
4101
 
4102
  #: adminpages/paymentsettings.php:231
4103
  #: adminpages/paymentsettings.php:290
 
 
4104
  msgid "Pass all generated HTML through a URL filter to add HTTPS to URLs used on secure pages. Check this if you are using SSL and have warnings on your checkout pages."
4105
  msgstr "Passa tot el codi HTML generat a través del filtre URL per a afegir HTTPS a URLs utilitzat a les pàgines segures. Comprova això si estàs utilitzant SSL i tens advertències a les teves pàgines de Checkout."
4106
 
@@ -4118,6 +4574,7 @@ msgstr "Detalls"
4118
  #: adminpages/reports.php:61
4119
  #: adminpages/reports.php:19
4120
  #: adminpages/reports.php:18
 
4121
  msgid "Back to Reports Dashboard"
4122
  msgstr "Torna a l’escriptori de Reports (Reports Dashboard)"
4123
 
@@ -4159,6 +4616,8 @@ msgstr "Avui"
4159
  #: adminpages/reports/sales.php:51
4160
  #: adminpages/orders.php:1077
4161
  #: adminpages/orders.php:1069
 
 
4162
  msgid "This Month"
4163
  msgstr "Aquest mes"
4164
 
@@ -4170,6 +4629,8 @@ msgstr "Aquest mes"
4170
  #: adminpages/reports/login.php:62
4171
  #: adminpages/reports/memberships.php:52
4172
  #: adminpages/reports/sales.php:53
 
 
4173
  msgid "All Time"
4174
  msgstr "Sempre"
4175
 
@@ -4186,6 +4647,8 @@ msgstr "Visites, vistes i informe de Logins "
4186
  #: adminpages/reports/login.php:104
4187
  #: classes/class-pmpro-members-list-table.php:234
4188
  #: classes/class-pmpro-members-list-table.php:233
 
 
4189
  msgid "All Users"
4190
  msgstr "Tots els usuaris"
4191
 
@@ -4193,6 +4656,7 @@ msgstr "Tots els usuaris"
4193
  #: adminpages/reports/login.php:146
4194
  #: adminpages/reports/login.php:148
4195
  #: adminpages/reports/login.php:185
 
4196
  msgid "Last Visit"
4197
  msgstr "Última visita"
4198
 
@@ -4202,6 +4666,7 @@ msgstr "Última visita"
4202
  #: adminpages/reports/login.php:147
4203
  #: adminpages/reports/login.php:149
4204
  #: adminpages/reports/login.php:187
 
4205
  msgid "Visits This Month"
4206
  msgstr "Visites aquest mes"
4207
 
@@ -4217,6 +4682,7 @@ msgstr "Visites totals"
4217
  #: adminpages/reports/login.php:149
4218
  #: adminpages/reports/login.php:151
4219
  #: adminpages/reports/login.php:191
 
4220
  msgid "Views This Month"
4221
  msgstr "Visites aquest mes"
4222
 
@@ -4230,6 +4696,7 @@ msgstr "Visites totals"
4230
  #: adminpages/reports/login.php:151
4231
  #: adminpages/reports/login.php:153
4232
  #: adminpages/reports/login.php:194
 
4233
  msgid "Last Login"
4234
  msgstr "Últim Login"
4235
 
@@ -4239,6 +4706,7 @@ msgstr "Últim Login"
4239
  #: adminpages/reports/login.php:152
4240
  #: adminpages/reports/login.php:154
4241
  #: adminpages/reports/login.php:196
 
4242
  msgid "Logins This Month"
4243
  msgstr "Logins aquest mes"
4244
 
@@ -4277,6 +4745,8 @@ msgstr "Totes les cancel·lacions"
4277
  #: adminpages/reports/sales.php:52
4278
  #: adminpages/orders.php:1081
4279
  #: adminpages/orders.php:1073
 
 
4280
  msgid "This Year"
4281
  msgstr "Aquest any"
4282
 
@@ -4292,6 +4762,8 @@ msgstr "Aquest any"
4292
  #: adminpages/reports/sales.php:295
4293
  #: adminpages/advancedsettings.php:322
4294
  #: adminpages/reports/sales.php:313
 
 
4295
  msgid "Daily"
4296
  msgstr "Diari"
4297
 
@@ -4307,6 +4779,8 @@ msgstr "Diari"
4307
  #: adminpages/reports/sales.php:296
4308
  #: adminpages/advancedsettings.php:328
4309
  #: adminpages/reports/sales.php:314
 
 
4310
  msgid "Monthly"
4311
  msgstr "Mensual"
4312
 
@@ -4320,11 +4794,13 @@ msgstr "Mensual"
4320
  #: adminpages/reports/memberships.php:335
4321
  #: adminpages/reports/sales.php:297
4322
  #: adminpages/reports/sales.php:315
 
4323
  msgid "Annual"
4324
  msgstr "Anual"
4325
 
4326
  #: adminpages/reports/memberships.php:270
4327
  #: adminpages/reports/memberships.php:338
 
4328
  msgid "Signups vs. All Cancellations"
4329
  msgstr "Altes vs. totes les Cancel·lacions"
4330
 
@@ -4332,11 +4808,13 @@ msgstr "Altes vs. totes les Cancel·lacions"
4332
  #: adminpages/reports/memberships.php:263
4333
  #: adminpages/reports/memberships.php:299
4334
  #: adminpages/reports/memberships.php:339
 
4335
  msgid "Signups vs. Cancellations"
4336
  msgstr "Altes vs. Cancel·lacions"
4337
 
4338
  #: adminpages/reports/memberships.php:272
4339
  #: adminpages/reports/memberships.php:340
 
4340
  msgid "Signups vs. Expirations"
4341
  msgstr "Altes vs. Expiracions"
4342
 
@@ -4367,6 +4845,8 @@ msgstr "Altes vs. Expiracions"
4367
  #: adminpages/reports/sales.php:314
4368
  #: adminpages/reports/sales.php:321
4369
  #: adminpages/reports/sales.php:332
 
 
4370
  msgid "for"
4371
  msgstr "per a"
4372
 
@@ -4380,6 +4860,7 @@ msgstr "per a"
4380
  #: adminpages/reports/memberships.php:385
4381
  #: adminpages/reports/sales.php:342
4382
  #: adminpages/reports/sales.php:360
 
4383
  msgid "Generate Report"
4384
  msgstr "Genera Informe"
4385
 
@@ -4422,20 +4903,27 @@ msgstr "Benefici"
4422
 
4423
  #: adminpages/templates/orders-email.php:14
4424
  #: adminpages/templates/orders-print.php:50
 
 
4425
  msgid "Invoice #: "
4426
  msgstr "Factura #: "
4427
 
4428
  #: adminpages/templates/orders-email.php:18
4429
  #: adminpages/templates/orders-print.php:54
 
 
4430
  msgid "Date:"
4431
  msgstr "Data:"
4432
 
4433
  #: adminpages/templates/orders-email.php:24
 
4434
  msgid "Bill to:"
4435
  msgstr "Facturat a:"
4436
 
4437
  #: adminpages/templates/orders-email.php:47
4438
  #: adminpages/templates/orders-print.php:76
 
 
4439
  msgid "Item"
4440
  msgstr "Item"
4441
 
@@ -4444,6 +4932,8 @@ msgstr "Item"
4444
  #: pages/levels.php:36
4445
  #: pages/levels.php:14
4446
  #: pages/levels.php:28
 
 
4447
  msgid "Price"
4448
  msgstr "Preu"
4449
 
@@ -4453,6 +4943,8 @@ msgstr "Preu"
4453
  #: pages/invoice.php:77
4454
  #: includes/functions.php:2842
4455
  #: includes/functions.php:2873
 
 
4456
  msgid "Subtotal"
4457
  msgstr "Subtotal"
4458
 
@@ -4480,6 +4972,7 @@ msgstr "Actualització completa"
4480
  #: includes/cleanup.php:24
4481
  #: classes/class.memberorder.php:959
4482
  #: classes/class.memberorder.php:1001
 
4483
  #, php-format
4484
  msgid "There was an error canceling the subscription for user with ID=%s. You will want to check your payment gateway to see if their subscription is still active."
4485
  msgstr "Hi ha hagut un error cancel·lant la subscripció per a l’usuari ID=%s. Comprova a la passarel·la de pagament si la seva subscripció encara és activa."
@@ -4517,6 +5010,7 @@ msgstr "La subscripció per a %s a %s ha estat cancel·lada"
4517
  #: classes/class.pmproemail.php:178
4518
  #: classes/class.pmproemail.php:269
4519
  #: classes/class.pmproemail.php:262
 
4520
  #, php-format
4521
  msgid "Your membership confirmation for %s"
4522
  msgstr "Confirmació per a la seva subscripció %s"
@@ -4615,6 +5109,20 @@ msgstr "Confirmació per a la seva subscripció %s"
4615
  #: classes/class.pmproemail.php:440
4616
  #: classes/class.pmproemail.php:762
4617
  #: classes/class.pmproemail.php:764
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4618
  msgid "Discount Code"
4619
  msgstr "Codi de descompte"
4620
 
@@ -4654,6 +5162,11 @@ msgstr "Codi de descompte"
4654
  #: classes/class.pmproemail.php:771
4655
  #: classes/class.pmproemail.php:905
4656
  #: classes/class.pmproemail.php:950
 
 
 
 
 
4657
  #, php-format
4658
  msgid "This membership will expire on %s."
4659
  msgstr "Aquesta subscripció expirarà a %s."
@@ -4671,6 +5184,7 @@ msgstr "Checkout de subscriptor per %s a %s"
4671
  #: classes/class.pmproemail.php:463
4672
  #: classes/class.pmproemail.php:475
4673
  #: classes/class.pmproemail.php:468
 
4674
  #, php-format
4675
  msgid "Your billing information has been updated at %s"
4676
  msgstr "S’ha actualitzat la seva informació de facturació a %s"
@@ -4679,6 +5193,7 @@ msgstr "S’ha actualitzat la seva informació de facturació a %s"
4679
  #: classes/class.pmproemail.php:513
4680
  #: classes/class.pmproemail.php:525
4681
  #: classes/class.pmproemail.php:518
 
4682
  #, php-format
4683
  msgid "Billing information has been updated for %s at %s"
4684
  msgstr "Informació de facturació ha estat actualitzat per %s a %s"
@@ -4726,6 +5241,7 @@ msgstr "FACTURA per a %s subscriptor"
4726
  #: classes/class.pmproemail.php:794
4727
  #: classes/class.pmproemail.php:806
4728
  #: classes/class.pmproemail.php:799
 
4729
  #, php-format
4730
  msgid "Your trial at %s is ending soon"
4731
  msgstr "El teu període de prova a %s aviat acabarà."
@@ -4738,6 +5254,7 @@ msgstr "El teu període de prova a %s aviat acabarà."
4738
  #: classes/class.pmproemail.php:831
4739
  #: classes/class.pmproemail.php:843
4740
  #: classes/class.pmproemail.php:836
 
4741
  #, php-format
4742
  msgid "Your membership at %s has ended"
4743
  msgstr "La teva subscripció a %s ha finalitzat"
@@ -4750,6 +5267,7 @@ msgstr "La teva subscripció a %s ha finalitzat"
4750
  #: classes/class.pmproemail.php:858
4751
  #: classes/class.pmproemail.php:870
4752
  #: classes/class.pmproemail.php:863
 
4753
  #, php-format
4754
  msgid "Your membership at %s will end soon"
4755
  msgstr "La teva subscripció a %s finalitzarà aviat."
@@ -4762,6 +5280,7 @@ msgstr "La teva subscripció a %s finalitzarà aviat."
4762
  #: classes/class.pmproemail.php:888
4763
  #: classes/class.pmproemail.php:900
4764
  #: classes/class.pmproemail.php:893
 
4765
  #, php-format
4766
  msgid "Your membership at %s has been changed"
4767
  msgstr "La teva subscripció a %s ha canviat"
@@ -4818,6 +5337,7 @@ msgstr "Aquesta subscripció no expira"
4818
  #: classes/class.pmproemail.php:933
4819
  #: classes/class.pmproemail.php:945
4820
  #: classes/class.pmproemail.php:938
 
4821
  #, php-format
4822
  msgid "Membership for %s at %s has been changed"
4823
  msgstr "Subscripció per %s a %s ha canviat"
@@ -4921,6 +5441,7 @@ msgstr "Un pagament parcial es va fer que no ens podia anular. Contacteu al prop
4921
  #: paid-memberships-pro.php:164
4922
  #: paid-memberships-pro.php:166
4923
  #: paid-memberships-pro.php:167
 
4924
  msgid "Authorize.net"
4925
  msgstr "Authorize.net"
4926
 
@@ -4987,12 +5508,15 @@ msgstr "No podria connectar a Authorize.net"
4987
  #: paid-memberships-pro.php:165
4988
  #: paid-memberships-pro.php:167
4989
  #: paid-memberships-pro.php:168
 
 
4990
  msgid "Braintree Payments"
4991
  msgstr "Pagaments Braintree"
4992
 
4993
  #: classes/gateways/class.pmprogateway_braintree.php:132
4994
  #: classes/gateways/class.pmprogateway_braintree.php:119
4995
  #: classes/gateways/class.pmprogateway_braintree.php:308
 
4996
  msgid "Braintree Settings"
4997
  msgstr "Configuració Braintree"
4998
 
@@ -5006,6 +5530,7 @@ msgstr "Configuració Braintree"
5006
  #: classes/gateways/class.pmprogateway_braintree.php:124
5007
  #: classes/gateways/class.pmprogateway_braintree.php:313
5008
  #: classes/gateways/class.pmprogateway_cybersource.php:94
 
5009
  msgid "Merchant ID"
5010
  msgstr "ID de comerciant"
5011
 
@@ -5015,6 +5540,7 @@ msgstr "ID de comerciant"
5015
  #: adminpages/paymentsettings.php:311
5016
  #: classes/gateways/class.pmprogateway_braintree.php:132
5017
  #: classes/gateways/class.pmprogateway_braintree.php:321
 
5018
  msgid "Public Key"
5019
  msgstr "Clau Pública"
5020
 
@@ -5024,6 +5550,7 @@ msgstr "Clau Pública"
5024
  #: adminpages/paymentsettings.php:319
5025
  #: classes/gateways/class.pmprogateway_braintree.php:140
5026
  #: classes/gateways/class.pmprogateway_braintree.php:329
 
5027
  msgid "Private Key"
5028
  msgstr "Clau Privada"
5029
 
@@ -5033,6 +5560,7 @@ msgstr "Clau Privada"
5033
  #: adminpages/paymentsettings.php:327
5034
  #: classes/gateways/class.pmprogateway_braintree.php:148
5035
  #: classes/gateways/class.pmprogateway_braintree.php:337
 
5036
  msgid "Client-Side Encryption Key"
5037
  msgstr "Clau d’encriptació del Client"
5038
 
@@ -5050,6 +5578,7 @@ msgstr "Clau d’encriptació del Client"
5050
  #: classes/gateways/class.pmprogateway_stripe.php:182
5051
  #: classes/gateways/class.pmprogateway_stripe.php:192
5052
  #: classes/gateways/class.pmprogateway_braintree.php:345
 
5053
  msgid "Web Hook URL"
5054
  msgstr "Web Hook URL"
5055
 
@@ -5060,6 +5589,7 @@ msgstr "Web Hook URL"
5060
  #: adminpages/paymentsettings.php:523
5061
  #: classes/gateways/class.pmprogateway_braintree.php:160
5062
  #: classes/gateways/class.pmprogateway_braintree.php:348
 
5063
  msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to"
5064
  msgstr "Per integrar totalment Braintree, assegura’t de configurar Web Hook URL a"
5065
 
@@ -5086,6 +5616,9 @@ msgstr "Per integrar totalment Braintree, assegura’t de configurar Web Hook UR
5086
  #: classes/gateways/class.pmprogateway_stripe.php:1282
5087
  #: classes/gateways/class.pmprogateway_stripe.php:1288
5088
  #: classes/gateways/class.pmprogateway_stripe.php:747
 
 
 
5089
  msgid "Payment Information"
5090
  msgstr "Informació de pagament"
5091
 
@@ -5112,6 +5645,8 @@ msgstr "Informació de pagament"
5112
  #: classes/gateways/class.pmprogateway_stripe.php:1283
5113
  #: classes/gateways/class.pmprogateway_stripe.php:1289
5114
  #: classes/gateways/class.pmprogateway_stripe.php:748
 
 
5115
  #, php-format
5116
  msgid "We Accept %s"
5117
  msgstr "Acceptem %s"
@@ -5144,6 +5679,9 @@ msgstr "Acceptem %s"
5144
  #: classes/gateways/class.pmprogateway_stripe.php:1316
5145
  #: classes/gateways/class.pmprogateway_stripe.php:1322
5146
  #: classes/gateways/class.pmprogateway_stripe.php:781
 
 
 
5147
  msgid "Card Number"
5148
  msgstr "Nombre de Tarjeta"
5149
 
@@ -5169,6 +5707,8 @@ msgstr "Nombre de Tarjeta"
5169
  #: pages/checkout.php:603
5170
  #: classes/gateways/class.pmprogateway_braintree.php:503
5171
  #: pages/billing.php:410
 
 
5172
  msgid "CVV"
5173
  msgstr "CVV"
5174
 
@@ -5195,6 +5735,8 @@ msgstr "CVV"
5195
  #: classes/gateways/class.pmprogateway_braintree.php:504
5196
  #: pages/billing.php:411
5197
  #: pages/checkout.php:425
 
 
5198
  msgid "what's this?"
5199
  msgstr "què és això?"
5200
 
@@ -5227,6 +5769,8 @@ msgstr "què és això?"
5227
  #: classes/gateways/class.pmprogateway_stripe.php:1338
5228
  #: classes/gateways/class.pmprogateway_stripe.php:1344
5229
  #: classes/gateways/class.pmprogateway_stripe.php:803
 
 
5230
  msgid "Apply"
5231
  msgstr "Aplica"
5232
 
@@ -5242,6 +5786,7 @@ msgstr "Aplica"
5242
  #: classes/gateways/class.pmprogateway_stripe.php:1036
5243
  #: classes/gateways/class.pmprogateway_stripe.php:1040
5244
  #: classes/gateways/class.pmprogateway_braintree.php:574
 
5245
  msgid "Unknown error: Initial payment failed."
5246
  msgstr "Error desconegut: ha fallat el pagament inicial"
5247
 
@@ -5250,6 +5795,8 @@ msgstr "Error desconegut: ha fallat el pagament inicial"
5250
  #: classes/gateways/class.pmprogateway_braintree.php:465
5251
  #: classes/gateways/class.pmprogateway_braintree.php:478
5252
  #: classes/gateways/class.pmprogateway_braintree.php:650
 
 
5253
  msgid "Error during settlement:"
5254
  msgstr "Error durant la liquidació:"
5255
 
@@ -5258,6 +5805,8 @@ msgstr "Error durant la liquidació:"
5258
  #: classes/gateways/class.pmprogateway_braintree.php:474
5259
  #: classes/gateways/class.pmprogateway_braintree.php:487
5260
  #: classes/gateways/class.pmprogateway_braintree.php:659
 
 
5261
  msgid "Error during charge:"
5262
  msgstr "Error durant la càrrega:"
5263
 
@@ -5267,6 +5816,8 @@ msgstr "Error durant la càrrega:"
5267
  #: classes/gateways/class.pmprogateway_braintree.php:566
5268
  #: classes/gateways/class.pmprogateway_braintree.php:579
5269
  #: classes/gateways/class.pmprogateway_braintree.php:762
 
 
5270
  msgid "Failed to update customer."
5271
  msgstr "No s’ha pogut actualitzar el comprador."
5272
 
@@ -5276,6 +5827,8 @@ msgstr "No s’ha pogut actualitzar el comprador."
5276
  #: classes/gateways/class.pmprogateway_braintree.php:614
5277
  #: classes/gateways/class.pmprogateway_braintree.php:627
5278
  #: classes/gateways/class.pmprogateway_braintree.php:810
 
 
5279
  msgid "Failed to create customer."
5280
  msgstr "No s’ha pogut crear el comprador"
5281
 
@@ -5285,6 +5838,8 @@ msgstr "No s’ha pogut crear el comprador"
5285
  #: classes/gateways/class.pmprogateway_braintree.php:621
5286
  #: classes/gateways/class.pmprogateway_braintree.php:634
5287
  #: classes/gateways/class.pmprogateway_braintree.php:817
 
 
5288
  msgid "Error creating customer record with Braintree:"
5289
  msgstr "No s’ha pogut crear el comprador amb Branitree:"
5290
 
@@ -5333,6 +5888,8 @@ msgstr "No s’ha pogut subscriure a Braintree:"
5333
  #: classes/gateways/class.pmprogateway_stripe.php:402
5334
  #: classes/gateways/class.pmprogateway_stripe.php:423
5335
  #: classes/gateways/class.pmprogateway_braintree.php:1036
 
 
5336
  msgid "Could not find the subscription."
5337
  msgstr "No s’ha trobat la subscripció"
5338
 
@@ -5350,6 +5907,7 @@ msgstr "No s’ha trobat la subscripció"
5350
  #: paid-memberships-pro.php:158
5351
  #: paid-memberships-pro.php:160
5352
  #: paid-memberships-pro.php:161
 
5353
  msgid "Pay by Check"
5354
  msgstr "Pagament amb Check"
5355
 
@@ -5469,6 +6027,7 @@ msgstr "S’ha realitzat un pagament parcial que no s’ha pogut tornar. Contac
5469
  #: paid-memberships-pro.php:161
5470
  #: paid-memberships-pro.php:163
5471
  #: paid-memberships-pro.php:164
 
5472
  msgid "PayPal Website Payments Pro"
5473
  msgstr "PayPal Website Payments Pro"
5474
 
@@ -5480,6 +6039,7 @@ msgstr "PayPal Website Payments Pro"
5480
  #: classes/gateways/class.pmprogateway_paypalexpress.php:141
5481
  #: classes/gateways/class.pmprogateway_paypalstandard.php:133
5482
  #: classes/gateways/class.pmprogateway_paypalexpress.php:151
 
5483
  msgid "PayPal Settings"
5484
  msgstr "Configuració PayPal"
5485
 
@@ -5502,6 +6062,7 @@ msgstr "No recomanem utilitzar PayPal Standard. Us recomanem que utilitzeu PayPa
5502
  #: classes/gateways/class.pmprogateway_paypalexpress.php:162
5503
  #: classes/gateways/class.pmprogateway_paypalstandard.php:154
5504
  #: classes/gateways/class.pmprogateway_paypalexpress.php:172
 
5505
  msgid "Gateway Account Email"
5506
  msgstr "Correu electrònic del compte de la Passarel·la"
5507
 
@@ -5522,6 +6083,8 @@ msgstr "Correu electrònic del compte de la Passarel·la"
5522
  #: classes/gateways/class.pmprogateway_paypalstandard.php:162
5523
  #: classes/gateways/class.pmprogateway_twocheckout.php:120
5524
  #: classes/gateways/class.pmprogateway_paypalexpress.php:180
 
 
5525
  msgid "API Username"
5526
  msgstr "API Usuari"
5527
 
@@ -5542,6 +6105,8 @@ msgstr "API Usuari"
5542
  #: classes/gateways/class.pmprogateway_paypalstandard.php:170
5543
  #: classes/gateways/class.pmprogateway_twocheckout.php:129
5544
  #: classes/gateways/class.pmprogateway_paypalexpress.php:188
 
 
5545
  msgid "API Password"
5546
  msgstr "API Clau"
5547
 
@@ -5556,6 +6121,7 @@ msgstr "API Clau"
5556
  #: classes/gateways/class.pmprogateway_paypalexpress.php:186
5557
  #: classes/gateways/class.pmprogateway_paypalstandard.php:178
5558
  #: classes/gateways/class.pmprogateway_paypalexpress.php:196
 
5559
  msgid "API Signature"
5560
  msgstr "API Signatura"
5561
 
@@ -5571,6 +6137,7 @@ msgstr "API Signatura"
5571
  #: classes/gateways/class.pmprogateway_paypalexpress.php:205
5572
  #: classes/gateways/class.pmprogateway_paypalstandard.php:186
5573
  #: classes/gateways/class.pmprogateway_paypalexpress.php:215
 
5574
  msgid "IPN Handler URL"
5575
  msgstr "IPN Handler URL"
5576
 
@@ -5598,6 +6165,7 @@ msgstr "Aquesta URL passa a PayPal per a tots els nous càrrecs i subscripcions.
5598
  #: pages/checkout.php:218
5599
  #: classes/gateways/class.pmprogateway_paypalexpress.php:498
5600
  #: classes/gateways/class.pmprogateway_paypalexpress.php:502
 
5601
  msgid "Check Out with PayPal"
5602
  msgstr "Check Out amb PayPal"
5603
 
@@ -5619,6 +6187,8 @@ msgstr "Check Out amb PayPal"
5619
  #: pages/checkout.php:526
5620
  #: classes/gateways/class.pmprogateway_paypalexpress.php:503
5621
  #: classes/gateways/class.pmprogateway_paypalexpress.php:507
 
 
5622
  msgid "Submit and Check Out"
5623
  msgstr "Envia i fés el Check Out"
5624
 
@@ -5644,6 +6214,9 @@ msgstr "Envia i fés el Check Out"
5644
  #: pages/checkout.php:526
5645
  #: classes/gateways/class.pmprogateway_paypalexpress.php:503
5646
  #: classes/gateways/class.pmprogateway_paypalexpress.php:507
 
 
 
5647
  msgid "Submit and Confirm"
5648
  msgstr "Envia i confirma"
5649
 
@@ -5668,6 +6241,9 @@ msgstr "Envia i confirma"
5668
  #: classes/gateways/class.pmprogateway_paypalexpress.php:841
5669
  #: classes/gateways/class.pmprogateway_paypalexpress.php:845
5670
  #: classes/gateways/class.pmprogateway_paypalexpress.php:854
 
 
 
5671
  msgid "Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward."
5672
  msgstr "Contacteu al propietari del lloc o cancel·leu la vostra subscripció de PayPal per assegurar-te que no et cobraran en el futur."
5673
 
@@ -5683,6 +6259,8 @@ msgstr "Contacteu al propietari del lloc o cancel·leu la vostra subscripció de
5683
  #: paid-memberships-pro.php:162
5684
  #: classes/gateways/class.pmprogateway_paypalexpress.php:94
5685
  #: paid-memberships-pro.php:163
 
 
5686
  msgid "PayPal Express"
5687
  msgstr "PayPal Express"
5688
 
@@ -5695,6 +6273,7 @@ msgstr "PayPal Express"
5695
  #: classes/gateways/class.pmprogateway_paypal.php:199
5696
  #: classes/gateways/class.pmprogateway_paypalexpress.php:208
5697
  #: classes/gateways/class.pmprogateway_paypalexpress.php:218
 
5698
  msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to "
5699
  msgstr "Per integrar completament PayPal, assegura’t de configurar el teu IPN Handler URL a"
5700
 
@@ -5718,6 +6297,8 @@ msgstr "Per integrar completament PayPal, assegura’t de configurar el teu IPN
5718
  #: classes/gateways/class.pmprogateway_paypalexpress.php:401
5719
  #: classes/gateways/class.pmprogateway_paypalexpress.php:352
5720
  #: classes/gateways/class.pmprogateway_paypalexpress.php:411
 
 
5721
  msgid "The PayPal Token was lost."
5722
  msgstr "S’ha perdut el Token de PayPal"
5723
 
@@ -5731,6 +6312,7 @@ msgstr "S’ha perdut el Token de PayPal"
5731
  #: paid-memberships-pro.php:163
5732
  #: paid-memberships-pro.php:165
5733
  #: paid-memberships-pro.php:166
 
5734
  msgid "PayPal Standard"
5735
  msgstr "PayPal Standard"
5736
 
@@ -5759,6 +6341,8 @@ msgstr "El/la %s de la passarela depèn de %s PHP extensió. Si us plau habilita
5759
  #: classes/gateways/class.pmprogateway_stripe.php:258
5760
  #: classes/gateways/class.pmprogateway_stripe.php:216
5761
  #: paid-memberships-pro.php:162
 
 
5762
  msgid "Stripe"
5763
  msgstr "Stripe"
5764
 
@@ -5781,6 +6365,7 @@ msgstr "Configuració d’Stripe"
5781
  #: classes/gateways/class.pmprogateway_stripe.php:570
5782
  #: classes/gateways/class.pmprogateway_stripe.php:576
5783
  #: classes/gateways/class.pmprogateway_stripe.php:340
 
5784
  msgid "Secret Key"
5785
  msgstr "Secret Key"
5786
 
@@ -5796,6 +6381,7 @@ msgstr "Secret Key"
5796
  #: classes/gateways/class.pmprogateway_stripe.php:554
5797
  #: classes/gateways/class.pmprogateway_stripe.php:560
5798
  #: classes/gateways/class.pmprogateway_stripe.php:324
 
5799
  msgid "Publishable Key"
5800
  msgstr "Clau Publicable"
5801
 
@@ -5811,6 +6397,8 @@ msgstr "Clau Publicable"
5811
  #: classes/gateways/class.pmprogateway_stripe.php:629
5812
  #: classes/gateways/class.pmprogateway_stripe.php:635
5813
  #: classes/gateways/class.pmprogateway_stripe.php:399
 
 
5814
  msgid "Show Billing Address Fields"
5815
  msgstr "Mostra els camps d’adreça de facturació"
5816
 
@@ -5825,6 +6413,7 @@ msgstr "Mostra els camps d’adreça de facturació"
5825
  #: classes/gateways/class.pmprogateway_stripe.php:638
5826
  #: classes/gateways/class.pmprogateway_stripe.php:644
5827
  #: classes/gateways/class.pmprogateway_stripe.php:408
 
5828
  msgid "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>"
5829
  msgstr "Stripe no necessita camps d’adreça de facturació. Escull “No” per amagar-los de la pàgina de Checkout.<br /><strong>Si No, assegura’t de desabilitar la verificació de l’adreça a l’escripori de configuració de l’Stripe.</strong>"
5830
 
@@ -5851,6 +6440,8 @@ msgstr "Per integrar totalment l’Stripe, assegura’t de configurar el teu Web
5851
  #: classes/gateways/class.pmprogateway_stripe.php:2650
5852
  #: classes/gateways/class.pmprogateway_stripe.php:2646
5853
  #: classes/gateways/class.pmprogateway_stripe.php:2648
 
 
5854
  msgid "Subscription Updates"
5855
  msgstr "Actualització de subscripcions"
5856
 
@@ -5898,6 +6489,9 @@ msgstr "Actualització de subscripcions, et permet canviar el valor subscripció
5898
  #: pages/billing.php:434
5899
  #: classes/gateways/class.pmprogateway_stripe.php:2651
5900
  #: classes/gateways/class.pmprogateway_stripe.php:2653
 
 
 
5901
  msgid "Update"
5902
  msgstr "Actualitza"
5903
 
@@ -5913,6 +6507,8 @@ msgstr "Actualitza"
5913
  #: classes/gateways/class.pmprogateway_stripe.php:3045
5914
  #: classes/gateways/class.pmprogateway_stripe.php:3041
5915
  #: classes/gateways/class.pmprogateway_stripe.php:3043
 
 
5916
  msgid "Could not cancel the old subscription. Updates have not been processed."
5917
  msgstr "No s’ha pogut cancel·lar l’antiga subscripció. Les actualitzacions no s’han processat."
5918
 
@@ -5959,6 +6555,10 @@ msgstr "Error creant un registre d’usuari amb Stripe:"
5959
  #: classes/gateways/class.pmprogateway_stripe.php:4065
5960
  #: classes/gateways/class.pmprogateway_stripe.php:4062
5961
  #: classes/gateways/class.pmprogateway_stripe.php:4067
 
 
 
 
5962
  msgid "Error getting subscription with Stripe:"
5963
  msgstr "Error agafant la subscripció amb Stripe:"
5964
 
@@ -5996,6 +6596,10 @@ msgstr "Error agafant la subscripció amb Stripe:"
5996
  #: classes/gateways/class.pmprogateway_stripe.php:4166
5997
  #: classes/gateways/class.pmprogateway_stripe.php:4163
5998
  #: classes/gateways/class.pmprogateway_stripe.php:4168
 
 
 
 
5999
  msgid "Error creating plan with Stripe:"
6000
  msgstr "Error creant pla amb Stripe:"
6001
 
@@ -6028,6 +6632,10 @@ msgstr "Error creant pla amb Stripe:"
6028
  #: classes/gateways/class.pmprogateway_stripe.php:4211
6029
  #: classes/gateways/class.pmprogateway_stripe.php:4199
6030
  #: classes/gateways/class.pmprogateway_stripe.php:4213
 
 
 
 
6031
  msgid "Error subscribing customer to plan with Stripe:"
6032
  msgstr "Error subscrivint un pla de comprador amb Stripe:"
6033
 
@@ -6049,6 +6657,7 @@ msgstr "Error subscrivint un pla de comprador amb Stripe:"
6049
  #: classes/gateways/class.pmprogateway_stripe.php:2672
6050
  #: classes/gateways/class.pmprogateway_stripe.php:1731
6051
  #: classes/gateways/class.pmprogateway_stripe.php:1729
 
6052
  msgid "Could not cancel old subscription."
6053
  msgstr "No s’ha pogut cancel·lar l’antiga subscripció. "
6054
 
@@ -6067,6 +6676,7 @@ msgstr "No s’ha pogut cancel·lar l’antiga subscripció. "
6067
  #: classes/gateways/class.pmprogateway_stripe.php:2688
6068
  #: classes/gateways/class.pmprogateway_stripe.php:1747
6069
  #: classes/gateways/class.pmprogateway_stripe.php:1745
 
6070
  msgid "Could not find the customer."
6071
  msgstr "No s’ha trobat el comprador."
6072
 
@@ -6078,6 +6688,7 @@ msgstr "No s’ha trobat el comprador."
6078
  #: paid-memberships-pro.php:125
6079
  #: paid-memberships-pro.php:132
6080
  #: paid-memberships-pro.php:133
 
6081
  msgid "2Checkout"
6082
  msgstr "2Checkout"
6083
 
@@ -6085,24 +6696,28 @@ msgstr "2Checkout"
6085
  #: classes/gateways/class.pmprogateway_twocheckout.php:108
6086
  #: classes/gateways/class.pmprogateway_twocheckout.php:116
6087
  #: classes/gateways/class.pmprogateway_twocheckout.php:115
 
6088
  msgid "2Checkout Settings"
6089
  msgstr "Configuració de 2Checkout"
6090
 
6091
  #: classes/gateways/class.pmprogateway_twocheckout.php:123
6092
  #: classes/gateways/class.pmprogateway_twocheckout.php:125
6093
  #: classes/gateways/class.pmprogateway_twocheckout.php:124
 
6094
  msgid "Go to Account &raquo; User Management in 2Checkout and create a user with API Access and API Updating."
6095
  msgstr "Vés a Account &raquo; User Management in 2Checkout i crea un usuari amb API Access i API Updating."
6096
 
6097
  #: classes/gateways/class.pmprogateway_twocheckout.php:132
6098
  #: classes/gateways/class.pmprogateway_twocheckout.php:134
6099
  #: classes/gateways/class.pmprogateway_twocheckout.php:133
 
6100
  msgid "Password for the API user created."
6101
  msgstr "Clau per a l’usuari de l’API creada."
6102
 
6103
  #: classes/gateways/class.pmprogateway_twocheckout.php:141
6104
  #: classes/gateways/class.pmprogateway_twocheckout.php:152
6105
  #: classes/gateways/class.pmprogateway_twocheckout.php:142
 
6106
  msgid "Click on the profile icon in 2Checkout to find your Account Number."
6107
  msgstr "Clica a la icona del perfil a 2Checkout per trobar el teu Account Number."
6108
 
@@ -6112,12 +6727,14 @@ msgstr "Clica a la icona del perfil a 2Checkout per trobar el teu Account Number
6112
  #: classes/gateways/class.pmprogateway_twocheckout.php:137
6113
  #: classes/gateways/class.pmprogateway_twocheckout.php:157
6114
  #: classes/gateways/class.pmprogateway_twocheckout.php:147
 
6115
  msgid "Secret Word"
6116
  msgstr "Paraula Secreta"
6117
 
6118
  #: classes/gateways/class.pmprogateway_twocheckout.php:150
6119
  #: classes/gateways/class.pmprogateway_twocheckout.php:161
6120
  #: classes/gateways/class.pmprogateway_twocheckout.php:151
 
6121
  msgid "Go to Account &raquo; Site Management. Look under Checkout Options to find the Secret Word."
6122
  msgstr "Vés a Account &raquo; Site Management. Mira sota Checkout Options i troba la Paraula Secreta"
6123
 
@@ -6128,12 +6745,14 @@ msgstr "Vés a Account &raquo; Site Management. Mira sota Checkout Options i tro
6128
  #: classes/gateways/class.pmprogateway_twocheckout.php:145
6129
  #: classes/gateways/class.pmprogateway_twocheckout.php:166
6130
  #: classes/gateways/class.pmprogateway_twocheckout.php:156
 
6131
  msgid "TwoCheckout INS URL"
6132
  msgstr "TwoCheckout INS URL"
6133
 
6134
  #: classes/gateways/class.pmprogateway_twocheckout.php:158
6135
  #: classes/gateways/class.pmprogateway_twocheckout.php:169
6136
  #: classes/gateways/class.pmprogateway_twocheckout.php:159
 
6137
  msgid "To fully integrate with 2Checkout, be sure to use the following for your INS URL and Approved URL"
6138
  msgstr "Per integrar-te totalment amb 2Checkout, assegura’t d’utilitzar la següent INS URL i Approved URL"
6139
 
@@ -6141,6 +6760,7 @@ msgstr "Per integrar-te totalment amb 2Checkout, assegura’t d’utilitzar la s
6141
  #: classes/gateways/class.pmprogateway_twocheckout.php:192
6142
  #: classes/gateways/class.pmprogateway_twocheckout.php:214
6143
  #: classes/gateways/class.pmprogateway_twocheckout.php:205
 
6144
  msgid "Check Out with 2Checkout"
6145
  msgstr "Check Out amb 2Checkout"
6146
 
@@ -6578,6 +7198,8 @@ msgstr "Vietnamese Dong"
6578
  #: includes/functions.php:207
6579
  #: includes/functions.php:393
6580
  #: includes/functions.php:509
 
 
6581
  #, php-format
6582
  msgid "The price for membership is <strong>%s</strong> now"
6583
  msgstr "El preu per a la subscripció és <strong>%s</strong> ara"
@@ -6590,6 +7212,8 @@ msgstr "El preu per a la subscripció és <strong>%s</strong> ara"
6590
  #: includes/functions.php:209
6591
  #: includes/functions.php:398
6592
  #: includes/functions.php:511
 
 
6593
  #, php-format
6594
  msgid "<strong>%s</strong> now"
6595
  msgstr "<strong>%s</strong> ara"
@@ -6699,6 +7323,7 @@ msgstr "i després <strong>%s cada %d %s</strong>."
6699
  #: includes/functions.php:271
6700
  #: pages/levels.php:82
6701
  #: includes/functions.php:446
 
6702
  msgid "After your initial payment, your first payment is Free."
6703
  msgstr "Després del teu pagament inicial, el teu primer pagament és Gratuït."
6704
 
@@ -6714,6 +7339,7 @@ msgstr "Després del teu pagament inicial, el teu primer pagament és Gratuït."
6714
  #: includes/functions.php:275
6715
  #: pages/levels.php:86
6716
  #: includes/functions.php:448
 
6717
  #, php-format
6718
  msgid "After your initial payment, your first %d payments are Free."
6719
  msgstr "Després del teu pagament inicial, el teu %d pagaments són gratuïts."
@@ -6730,6 +7356,7 @@ msgstr "Després del teu pagament inicial, el teu %d pagaments són gratuïts."
6730
  #: includes/functions.php:282
6731
  #: pages/levels.php:93
6732
  #: includes/functions.php:452
 
6733
  #, php-format
6734
  msgid "After your initial payment, your first payment will cost %s."
6735
  msgstr "Després del teu pagament inicial, el teu primer pagament és de %s."
@@ -6791,6 +7418,7 @@ msgstr "La subscripció expira després de %d %s."
6791
  #: includes/functions.php:592
6792
  #: includes/functions.php:615
6793
  #: includes/functions.php:979
 
6794
  msgid "User ID not found."
6795
  msgstr "No s’ha trobat el teu ID d’usuari"
6796
 
@@ -6810,6 +7438,8 @@ msgstr "No s’ha trobat el teu ID d’usuari"
6810
  #: includes/functions.php:635
6811
  #: includes/functions.php:1003
6812
  #: includes/functions.php:1011
 
 
6813
  msgid "Invalid level."
6814
  msgstr "Nivell no vàlid"
6815
 
@@ -6870,6 +7500,7 @@ msgstr "no està canviant?"
6870
  #: includes/functions.php:723
6871
  #: includes/functions.php:746
6872
  #: includes/functions.php:1085
 
6873
  msgid "Error interacting with database"
6874
  msgstr "Error interactuant amb la base de dades"
6875
 
@@ -6906,6 +7537,8 @@ msgstr "Error interactuant amb la base de dades"
6906
  #: includes/functions.php:1342
6907
  #: includes/functions.php:1335
6908
  #: includes/functions.php:1373
 
 
6909
  msgid "Membership level not found."
6910
  msgstr "Nivell de subscripció no trobat."
6911
 
@@ -6921,6 +7554,7 @@ msgstr "Nivell de subscripció no trobat."
6921
  #: includes/functions.php:1196
6922
  #: includes/functions.php:1722
6923
  #: includes/functions.php:1753
 
6924
  msgid "No code was given to check."
6925
  msgstr "No s’ha donat cap codi per a fer el check"
6926
 
@@ -6943,6 +7577,7 @@ msgstr "No s’ha donat cap codi per a fer el check"
6943
  #: includes/functions.php:1205
6944
  #: includes/functions.php:1731
6945
  #: includes/functions.php:1762
 
6946
  msgid "The discount code could not be found."
6947
  msgstr "No s’ha trobat el codi de descompte"
6948
 
@@ -6965,6 +7600,7 @@ msgstr "No s’ha trobat el codi de descompte"
6965
  #: includes/functions.php:1220
6966
  #: includes/functions.php:1746
6967
  #: includes/functions.php:1777
 
6968
  #, php-format
6969
  msgid "This discount code goes into effect on %s."
6970
  msgstr "El codi de descompte serà efectiu a %s."
@@ -6988,6 +7624,7 @@ msgstr "El codi de descompte serà efectiu a %s."
6988
  #: includes/functions.php:1227
6989
  #: includes/functions.php:1753
6990
  #: includes/functions.php:1784
 
6991
  #, php-format
6992
  msgid "This discount code expired on %s."
6993
  msgstr "Aquest codi de descompte ha expirat a %s."
@@ -7011,6 +7648,7 @@ msgstr "Aquest codi de descompte ha expirat a %s."
7011
  #: includes/functions.php:1237
7012
  #: includes/functions.php:1762
7013
  #: includes/functions.php:1793
 
7014
  msgid "This discount code is no longer valid."
7015
  msgstr "Aquest codi de descompte ja no és vàlid."
7016
 
@@ -7032,6 +7670,7 @@ msgstr "Aquest codi de descompte ja no és vàlid."
7032
  #: includes/functions.php:1250
7033
  #: includes/functions.php:1781
7034
  #: includes/functions.php:1812
 
7035
  msgid "This discount code does not apply to this membership level."
7036
  msgstr "Aquest codi de descompte no s’aplica a aquest nivell de subscripció."
7037
 
@@ -7054,6 +7693,7 @@ msgstr "Aquest codi de descompte no s’aplica a aquest nivell de subscripció."
7054
  #: includes/functions.php:1276
7055
  #: includes/functions.php:1819
7056
  #: includes/functions.php:1850
 
7057
  msgid "This discount code is okay."
7058
  msgstr "El codi de descompte és OK"
7059
 
@@ -7076,6 +7716,7 @@ msgstr "El codi de descompte és OK"
7076
  #: includes/functions.php:1395
7077
  #: includes/functions.php:1847
7078
  #: includes/functions.php:1878
 
7079
  msgid "and"
7080
  msgstr "i"
7081
 
@@ -7099,6 +7740,8 @@ msgstr "i"
7099
  #: includes/functions.php:1620
7100
  #: includes/functions.php:2409
7101
  #: includes/functions.php:2440
 
 
7102
  msgid "Sign Up for !!name!! Now"
7103
  msgstr "Sign Up per !!name!! Ara"
7104
 
@@ -7144,6 +7787,10 @@ msgstr "Si us plau especifica un ID de Nivell"
7144
  #: includes/metaboxes.php:19
7145
  #: classes/class.pmproemail.php:888
7146
  #: classes/class.pmproemail.php:933
 
 
 
 
7147
  msgid "None"
7148
  msgstr "Cap"
7149
 
@@ -7155,6 +7802,7 @@ msgstr "La teva clau (license key) ha estat validada."
7155
  #: includes/license.php:81
7156
  #: adminpages/license.php:43
7157
  #: adminpages/license.php:33
 
7158
  msgid "Paid Memberships Pro Support License"
7159
  msgstr "Paid Memberships Pro Support License"
7160
 
@@ -7175,6 +7823,7 @@ msgstr "Visita PMPro <a href=\"http://www.paidmembershipspro.com/login/?redirect
7175
  #: adminpages/license.php:49
7176
  #: adminpages/dashboard.php:178
7177
  #: adminpages/license.php:41
 
7178
  msgid "Your license is invalid or expired."
7179
  msgstr "La teva license és invalida o ha expirat"
7180
 
@@ -7187,6 +7836,7 @@ msgstr "<p><strong>Moltes gràcies!</strong> A valid <strong>%s</strong> license
7187
  #: adminpages/license.php:59
7188
  #: adminpages/license.php:51
7189
  #: adminpages/license.php:53
 
7190
  msgid "Enter license key here..."
7191
  msgstr "Introdueix license key aquí"
7192
 
@@ -7300,6 +7950,8 @@ msgstr "Nivell actual"
7300
  #: includes/profile.php:255
7301
  #: includes/profile.php:186
7302
  #: includes/profile.php:233
 
 
7303
  msgid "Not paying."
7304
  msgstr "Sense pagament fet."
7305
 
@@ -7402,6 +8054,11 @@ msgstr "logout"
7402
  #: adminpages/orders.php:1335
7403
  #: adminpages/dashboard.php:226
7404
  #: adminpages/dashboard.php:294
 
 
 
 
 
7405
  msgid "Level"
7406
  msgstr "Nivell"
7407
 
@@ -7409,6 +8066,7 @@ msgstr "Nivell"
7409
  #: pages/account.php:14
7410
  #: pages/billing.php:18
7411
  #: pages/billing.php:72
 
7412
  msgid "Membership Fee"
7413
  msgstr "Preu de subscripció"
7414
 
@@ -7417,6 +8075,7 @@ msgstr "Preu de subscripció"
7417
  #: pages/billing.php:22
7418
  #: pages/levels.php:70
7419
  #: pages/billing.php:76
 
7420
  #, php-format
7421
  msgid "%s every %d %s."
7422
  msgstr "%s cada %d %s."
@@ -7426,6 +8085,7 @@ msgstr "%s cada %d %s."
7426
  #: pages/billing.php:24
7427
  #: pages/levels.php:66
7428
  #: pages/billing.php:78
 
7429
  #, php-format
7430
  msgid "%s per %s."
7431
  msgstr "%s per %s."
@@ -7436,6 +8096,7 @@ msgstr "%s per %s."
7436
  #: pages/billing.php:29
7437
  #: pages/billing.php:33
7438
  #: pages/billing.php:89
 
7439
  msgid "Duration"
7440
  msgstr "Durada"
7441
 
@@ -7443,6 +8104,7 @@ msgstr "Durada"
7443
  #: pages/billing.php:39
7444
  #: pages/billing.php:43
7445
  #: pages/billing.php:128
 
7446
  msgid "Your payment subscription is managed by PayPal. Please <a href=\"http://www.paypal.com\">login to PayPal here</a> to update your billing information."
7447
  msgstr "El pagament de la teva subscripció és gestionat per PayPal. Si us plau <a href=\"http://www.paypal.com\">login to PayPal aquí</a> per actualitzar la teva informació de pagament."
7448
 
@@ -7462,6 +8124,8 @@ msgstr "El pagament de la teva subscripció és gestionat per PayPal. Si us plau
7462
  #: pages/checkout.php:234
7463
  #: includes/profile.php:759
7464
  #: includes/profile.php:755
 
 
7465
  msgid "First Name"
7466
  msgstr "Nom"
7467
 
@@ -7481,6 +8145,8 @@ msgstr "Nom"
7481
  #: pages/checkout.php:238
7482
  #: includes/profile.php:760
7483
  #: includes/profile.php:756
 
 
7484
  msgid "Last Name"
7485
  msgstr "Cognoms"
7486
 
@@ -7497,6 +8163,7 @@ msgstr "Cognoms"
7497
  #: pages/checkout.php:336
7498
  #: pages/billing.php:174
7499
  #: pages/checkout.php:242
 
7500
  msgid "Address 1"
7501
  msgstr "Adreça 1"
7502
 
@@ -7513,6 +8180,7 @@ msgstr "Adreça 1"
7513
  #: pages/checkout.php:340
7514
  #: pages/billing.php:178
7515
  #: pages/checkout.php:246
 
7516
  msgid "Address 2"
7517
  msgstr "Adreça 2"
7518
 
@@ -7529,6 +8197,7 @@ msgstr "Adreça 2"
7529
  #: pages/checkout.php:350
7530
  #: pages/billing.php:188
7531
  #: pages/checkout.php:253
 
7532
  msgid "City"
7533
  msgstr "Ciutat"
7534
 
@@ -7545,6 +8214,7 @@ msgstr "Ciutat"
7545
  #: pages/checkout.php:354
7546
  #: pages/billing.php:192
7547
  #: pages/checkout.php:257
 
7548
  msgid "State"
7549
  msgstr "State/província"
7550
 
@@ -7561,6 +8231,7 @@ msgstr "State/província"
7561
  #: pages/checkout.php:358
7562
  #: pages/billing.php:196
7563
  #: pages/checkout.php:261
 
7564
  msgid "Postal Code"
7565
  msgstr "Codi Postal"
7566
 
@@ -7577,6 +8248,7 @@ msgstr "Codi Postal"
7577
  #: pages/checkout.php:367
7578
  #: pages/billing.php:205
7579
  #: pages/checkout.php:266
 
7580
  msgid "City, State Zip"
7581
  msgstr "Ciutat, CP"
7582
 
@@ -7593,6 +8265,7 @@ msgstr "Ciutat, CP"
7593
  #: pages/checkout.php:420
7594
  #: pages/billing.php:258
7595
  #: pages/checkout.php:303
 
7596
  msgid "Country"
7597
  msgstr "País"
7598
 
@@ -7609,6 +8282,7 @@ msgstr "País"
7609
  #: pages/checkout.php:445
7610
  #: pages/billing.php:283
7611
  #: pages/checkout.php:319
 
7612
  msgid "Phone"
7613
  msgstr "Telèfon"
7614
 
@@ -7632,6 +8306,7 @@ msgstr "Telèfon"
7632
  #: pages/billing.php:294
7633
  #: pages/checkout.php:164
7634
  #: pages/checkout.php:334
 
7635
  msgid "Email Address"
7636
  msgstr "Correu electrònic"
7637
 
@@ -7648,6 +8323,7 @@ msgstr "Correu electrònic"
7648
  #: pages/checkout.php:469
7649
  #: pages/billing.php:298
7650
  #: pages/checkout.php:341
 
7651
  msgid "Confirm Email"
7652
  msgstr "Confirma Correu electrònic"
7653
 
@@ -7656,6 +8332,7 @@ msgstr "Confirma Correu electrònic"
7656
  #: pages/billing.php:221
7657
  #: pages/billing.php:230
7658
  #: pages/billing.php:321
 
7659
  msgid "Credit Card Information"
7660
  msgstr "Informació de la Tarjeta de Crèdit"
7661
 
@@ -7664,6 +8341,7 @@ msgstr "Informació de la Tarjeta de Crèdit"
7664
  #: pages/billing.php:221
7665
  #: pages/billing.php:230
7666
  #: pages/billing.php:322
 
7667
  #, php-format
7668
  msgid "We accept %s"
7669
  msgstr "Acceptem %s"
@@ -7676,6 +8354,7 @@ msgstr "Acceptem %s"
7676
  #: pages/billing.php:356
7677
  #: pages/billing.php:467
7678
  #: pages/billing.php:477
 
7679
  msgid "This subscription is not recurring. So you don't need to update your billing information."
7680
  msgstr "Aquesta subscripció no és recurrent. Per tant, no necessites actualitzar la teva informació de pagament."
7681
 
@@ -7900,6 +8579,7 @@ msgstr "Check Out amb tarjeta de crèdit aquí"
7900
  #: pages/checkout.php:681
7901
  #: pages/checkout.php:690
7902
  #: pages/checkout.php:476
 
7903
  #, php-format
7904
  msgid "I agree to the %s"
7905
  msgstr "Estic d’acord amb %s"
@@ -7913,6 +8593,7 @@ msgstr "Estic d’acord amb %s"
7913
  #: pages/checkout.php:701
7914
  #: pages/checkout.php:710
7915
  #: pages/checkout.php:514
 
7916
  msgid "Complete Payment"
7917
  msgstr "Completa pagament"
7918
 
@@ -7925,6 +8606,7 @@ msgstr "Completa pagament"
7925
  #: pages/checkout.php:723
7926
  #: pages/checkout.php:732
7927
  #: pages/checkout.php:536
 
7928
  msgid "Processing..."
7929
  msgstr "Processant…"
7930
 
@@ -7966,6 +8648,13 @@ msgstr "Factura #%s a %s"
7966
  #: includes/profile.php:433
7967
  #: adminpages/orders.php:1423
7968
  #: adminpages/orders.php:1433
 
 
 
 
 
 
 
7969
  msgid "Print"
7970
  msgstr "Imprimeix"
7971
 
@@ -8000,6 +8689,7 @@ msgstr "La subscripció acaba"
8000
  #: pages/billing.php:96
8001
  #: pages/confirmation.php:95
8002
  #: pages/invoice.php:85
 
8003
  msgid "Payment Method"
8004
  msgstr "Mètode de pagament"
8005
 
@@ -8015,6 +8705,7 @@ msgstr "Mètode de pagament"
8015
  #: pages/invoice.php:97
8016
  #: pages/invoice.php:125
8017
  #: includes/profile.php:413
 
8018
  msgid "Total Billed"
8019
  msgstr "Total facturat"
8020
 
@@ -8025,6 +8716,7 @@ msgstr "Total facturat"
8025
  #: pages/billing.php:98
8026
  #: pages/confirmation.php:97
8027
  #: pages/invoice.php:87
 
8028
  msgid "ending in"
8029
  msgstr "acaba a"
8030
 
@@ -8038,6 +8730,7 @@ msgstr "A sota hi ha els detalls del teu compte de subscripció. Un correu elect
8038
  #: pages/confirmation.php:103
8039
  #: pages/confirmation.php:138
8040
  #: shortcodes/pmpro_account.php:247
 
8041
  msgid "Pending"
8042
  msgstr "Pendent"
8043
 
@@ -8049,6 +8742,8 @@ msgstr "Pendent"
8049
  #: pages/billing.php:131
8050
  #: pages/confirmation.php:149
8051
  #: pages/invoice.php:155
 
 
8052
  msgid "View Your Membership Account &rarr;"
8053
  msgstr "Mira el teu compte de subscripció &rarr;"
8054
 
@@ -8062,6 +8757,8 @@ msgstr "Si el teu compte no s’activa en uns minuts, si us plau contacta amb l
8062
  #: pages/invoice.php:80
8063
  #: includes/functions.php:2857
8064
  #: includes/functions.php:2888
 
 
8065
  msgid "Coupon"
8066
  msgstr "Cupó"
8067
 
@@ -8087,6 +8784,7 @@ msgstr "&larr; Mira totes les factures"
8087
  #: pages/levels.php:33
8088
  #: pages/levels.php:43
8089
  #: includes/functions.php:396
 
8090
  msgid "Free"
8091
  msgstr "Gratuït"
8092
 
@@ -8145,6 +8843,7 @@ msgstr "&larr; Torna a la pàgina d’inici"
8145
  #: paid-memberships-pro.php:157
8146
  #: paid-memberships-pro.php:159
8147
  #: paid-memberships-pro.php:160
 
8148
  msgid "Testing Only"
8149
  msgstr "Només test"
8150
 
@@ -8156,6 +8855,7 @@ msgstr "Només test"
8156
  #: paid-memberships-pro.php:162
8157
  #: paid-memberships-pro.php:164
8158
  #: paid-memberships-pro.php:165
 
8159
  msgid "PayPal Payflow Pro/PayPal Pro"
8160
  msgstr "PayPal Payflow Pro/PayPal Pro"
8161
 
@@ -8167,12 +8867,14 @@ msgstr "PayPal Payflow Pro/PayPal Pro"
8167
  #: paid-memberships-pro.php:166
8168
  #: paid-memberships-pro.php:168
8169
  #: paid-memberships-pro.php:169
 
8170
  msgid "Cybersource"
8171
  msgstr "Cybersource"
8172
 
8173
  #: paid-memberships-pro.php:156
8174
  #: paid-memberships-pro.php:194
8175
  #: paid-memberships-pro.php:195
 
8176
  msgid "Once a month"
8177
  msgstr "Un cop al mes"
8178
 
@@ -8290,6 +8992,7 @@ msgstr "Error actualitzant la informació de facturació."
8290
  #: classes/class.pmproemail.php:907
8291
  #: includes/email.php:459
8292
  #: classes/class.pmproemail.php:900
 
8293
  msgid "Your membership has been cancelled."
8294
  msgstr "La teva subscripció ha estat cancel·lada."
8295
 
@@ -8589,6 +9292,7 @@ msgstr "El codi <strong>%s</strong> s’ha aplicat a la teva comanda."
8589
  #: services/authnet-silent-post.php:173
8590
  #: services/authnet-silent-post.php:176
8591
  #: services/authnet-silent-post.php:177
 
8592
  msgid "<p>A payment is being held for review within Authorize.net.</p><p>Payment Information From Authorize.net"
8593
  msgstr "<p>Un pagament s’està revisant a Authorize.net.</p><p>Payment Information From Authorize.net"
8594
 
@@ -8605,6 +9309,7 @@ msgstr "%s ha cancel·lat la seva subscripció per Stripe. Si us plau, confirma
8605
  #: pages/account.php:19
8606
  #: includes/email-templates.php:68
8607
  #: shortcodes/pmpro_account.php:43
 
8608
  msgid "Billing"
8609
  msgstr "Facturació"
8610
 
@@ -8659,6 +9364,8 @@ msgstr "Edita el perfil"
8659
  #: includes/profile.php:921
8660
  #: includes/profile.php:880
8661
  #: includes/profile.php:917
 
 
8662
  msgid "Change Password"
8663
  msgstr "Canvia Clau"
8664
 
@@ -8757,6 +9464,8 @@ msgstr "cada"
8757
  #: includes/profile.php:515
8758
  #: includes/profile.php:511
8759
  #: adminpages/advancedsettings.php:331
 
 
8760
  msgid "Never"
8761
  msgstr "Mai"
8762
 
@@ -8816,6 +9525,7 @@ msgstr "Visites avui"
8816
  #: adminpages/reports/login.php:28
8817
  #: adminpages/reports/login.php:29
8818
  #: adminpages/reports/login.php:189
 
8819
  msgid "Visits All Time"
8820
  msgstr "Visites sempre"
8821
 
@@ -8827,6 +9537,7 @@ msgstr "Vistes avui"
8827
  #: adminpages/reports/login.php:33
8828
  #: adminpages/reports/login.php:34
8829
  #: adminpages/reports/login.php:193
 
8830
  msgid "Views All Time"
8831
  msgstr "Vistes sempre"
8832
 
@@ -8838,6 +9549,7 @@ msgstr "Logins avui"
8838
  #: adminpages/reports/login.php:38
8839
  #: adminpages/reports/login.php:39
8840
  #: adminpages/reports/login.php:198
 
8841
  msgid "Logins All Time"
8842
  msgstr "Logins sempre"
8843
 
@@ -8938,6 +9650,7 @@ msgstr "El teu primer %d pagament serà de %s."
8938
  #: pages/account.php:87
8939
  #: pages/account.php:91
8940
  #: adminpages/emailtemplates.php:156
 
8941
  msgid "Billing Information"
8942
  msgstr "Informació de Facturació"
8943
 
@@ -9054,6 +9767,18 @@ msgstr "Configura el teu compte"
9054
  #: js/blocks.build.js:1342
9055
  #: js/blocks.build.js:1502
9056
  #: classes/class-pmpro-admin-activity-email.php:349
 
 
 
 
 
 
 
 
 
 
 
 
9057
  msgid "Paid Memberships Pro"
9058
  msgstr ""
9059
 
@@ -9099,6 +9824,7 @@ msgstr ""
9099
  #: classes/gateways/class.pmprogateway_stripe.php:76
9100
  #: classes/gateways/class.pmprogateway_stripe.php:82
9101
  #: classes/gateways/class.pmprogateway_stripe.php:1338
 
9102
  msgid "The Stripe Gateway requires PHP 5.3.29 or greater. We recommend upgrading to PHP %s or greater. Ask your host to upgrade."
9103
  msgstr ""
9104
 
@@ -9138,6 +9864,8 @@ msgstr ""
9138
  #: adminpages/admin_header.php:226
9139
  #: includes/adminpages.php:52
9140
  #: includes/adminpages.php:158
 
 
9141
  msgid "Members"
9142
  msgstr ""
9143
 
@@ -9182,41 +9910,49 @@ msgstr ""
9182
  #: adminpages/advancedsettings.php:106
9183
  #: includes/updates/upgrade_1.php:7
9184
  #: adminpages/advancedsettings.php:108
 
9185
  msgid "This content is for !!levels!! members only.<br /><a href=\"%s\">Join Now</a>"
9186
  msgstr ""
9187
 
9188
  #: adminpages/advancedsettings.php:111
9189
  #: adminpages/advancedsettings.php:113
 
9190
  msgid "This content is for !!levels!! members only.<br /><a href=\"%s\">Log In</a> <a href=\"%s\">Join Now</a>"
9191
  msgstr ""
9192
 
9193
  #: adminpages/advancedsettings.php:135
9194
  #: adminpages/advancedsettings.php:137
 
9195
  msgid "Restrict Dashboard Access"
9196
  msgstr ""
9197
 
9198
  #: adminpages/advancedsettings.php:140
9199
  #: adminpages/advancedsettings.php:142
 
9200
  msgid "WordPress Dashboard"
9201
  msgstr ""
9202
 
9203
  #: adminpages/advancedsettings.php:143
9204
  #: adminpages/advancedsettings.php:145
 
9205
  msgid "Block all users with the Subscriber role from accessing the Dashboard."
9206
  msgstr ""
9207
 
9208
  #: adminpages/advancedsettings.php:148
9209
  #: adminpages/advancedsettings.php:150
 
9210
  msgid "WordPress Toolbar"
9211
  msgstr ""
9212
 
9213
  #: adminpages/advancedsettings.php:151
9214
  #: adminpages/advancedsettings.php:153
 
9215
  msgid "Hide the Toolbar from all users with the Subscriber role."
9216
  msgstr ""
9217
 
9218
  #: adminpages/advancedsettings.php:159
9219
  #: adminpages/advancedsettings.php:161
 
9220
  msgid "Message Settings"
9221
  msgstr ""
9222
 
@@ -9224,93 +9960,111 @@ msgstr ""
9224
  #: adminpages/advancedsettings.php:186
9225
  #: adminpages/advancedsettings.php:179
9226
  #: adminpages/advancedsettings.php:188
 
9227
  msgid "Available variables"
9228
  msgstr ""
9229
 
9230
  #: adminpages/advancedsettings.php:224
9231
  #: adminpages/advancedsettings.php:226
 
9232
  msgid "Checkout Settings"
9233
  msgstr ""
9234
 
9235
  #: adminpages/advancedsettings.php:257
9236
  #: adminpages/advancedsettings.php:272
 
9237
  msgid "reCAPTCHA Version"
9238
  msgstr ""
9239
 
9240
  #: adminpages/advancedsettings.php:260
9241
  #: adminpages/advancedsettings.php:275
 
9242
  msgid " v2 - Checkbox"
9243
  msgstr ""
9244
 
9245
  #: adminpages/advancedsettings.php:261
9246
  #: adminpages/advancedsettings.php:276
 
9247
  msgid "v3 - Invisible"
9248
  msgstr ""
9249
 
9250
  #: adminpages/advancedsettings.php:263
9251
  #: adminpages/advancedsettings.php:278
 
9252
  msgid "Changing your version will require new API keys."
9253
  msgstr ""
9254
 
9255
  #: adminpages/advancedsettings.php:267
9256
  #: adminpages/advancedsettings.php:282
 
9257
  msgid "reCAPTCHA Site Key"
9258
  msgstr ""
9259
 
9260
  #: adminpages/advancedsettings.php:273
9261
  #: adminpages/advancedsettings.php:288
 
9262
  msgid "reCAPTCHA Secret Key"
9263
  msgstr ""
9264
 
9265
  #: adminpages/advancedsettings.php:283
9266
  #: adminpages/advancedsettings.php:298
 
9267
  msgid "Communication Settings"
9268
  msgstr ""
9269
 
9270
  #: adminpages/advancedsettings.php:286
9271
  #: adminpages/advancedsettings.php:301
 
9272
  msgid "Notifications"
9273
  msgstr ""
9274
 
9275
  #: adminpages/advancedsettings.php:290
9276
  #: adminpages/advancedsettings.php:305
 
9277
  msgid "Show all notifications."
9278
  msgstr ""
9279
 
9280
  #: adminpages/advancedsettings.php:293
9281
  #: adminpages/advancedsettings.php:308
 
9282
  msgid "Show only security notifications."
9283
  msgstr ""
9284
 
9285
  #: adminpages/advancedsettings.php:297
9286
  #: adminpages/advancedsettings.php:312
 
9287
  msgid "Notifications are occasionally shown on the Paid Memberships Pro settings pages."
9288
  msgstr ""
9289
 
9290
  #: adminpages/advancedsettings.php:302
9291
  #: adminpages/advancedsettings.php:317
 
9292
  msgid "Activity Email Frequency"
9293
  msgstr ""
9294
 
9295
  #: adminpages/advancedsettings.php:310
9296
  #: adminpages/advancedsettings.php:325
 
9297
  msgid "Weekly"
9298
  msgstr ""
9299
 
9300
  #: adminpages/advancedsettings.php:320
9301
  #: adminpages/advancedsettings.php:335
 
9302
  msgid "Send periodic sales and revenue updates from this site to the administration email address."
9303
  msgstr ""
9304
 
9305
  #: adminpages/advancedsettings.php:473
9306
  #: adminpages/advancedsettings.php:475
9307
  #: adminpages/advancedsettings.php:490
 
9308
  msgid "Uninstall PMPro on deletion?"
9309
  msgstr ""
9310
 
9311
  #: adminpages/advancedsettings.php:478
9312
  #: adminpages/advancedsettings.php:480
9313
  #: adminpages/advancedsettings.php:495
 
9314
  msgid "Yes - Delete all PMPro Data."
9315
  msgstr ""
9316
 
@@ -9336,6 +10090,7 @@ msgstr ""
9336
 
9337
  #: adminpages/dashboard.php:113
9338
  #: adminpages/membershiplevels.php:779
 
9339
  msgid "Create a Membership Level"
9340
  msgstr ""
9341
 
@@ -9406,6 +10161,7 @@ msgstr ""
9406
  #: adminpages/license.php:43
9407
  #: adminpages/dashboard.php:183
9408
  #: adminpages/license.php:45
 
9409
  msgid "<strong>Thank you!</strong> A valid <strong>%s</strong> license key has been used to activate your support license on this site."
9410
  msgstr ""
9411
 
@@ -9509,6 +10265,9 @@ msgstr ""
9509
  #: adminpages/orders.php:1489
9510
  #: adminpages/dashboard.php:323
9511
  #: adminpages/dashboard.php:338
 
 
 
9512
  msgid "none"
9513
  msgstr ""
9514
 
@@ -9547,6 +10306,7 @@ msgstr ""
9547
  #: adminpages/discountcodes.php:622
9548
  #: adminpages/membershiplevels.php:450
9549
  #: adminpages/discountcodes.php:624
 
9550
  msgid "Stripe integration does not allow billing periods longer than 1 year."
9551
  msgstr ""
9552
 
@@ -9559,31 +10319,39 @@ msgstr ""
9559
  #: adminpages/discountcodes.php:697
9560
  #: adminpages/membershiplevels.php:580
9561
  #: adminpages/discountcodes.php:699
 
 
9562
  msgid "Hour(s)"
9563
  msgstr ""
9564
 
9565
  #: adminpages/discountcodes.php:754
9566
  #: adminpages/discountcodes.php:756
 
9567
  msgid "No Discount Codes Found"
9568
  msgstr ""
9569
 
9570
  #: adminpages/discountcodes.php:755
9571
  #: adminpages/discountcodes.php:757
 
9572
  msgid "Discount codes allow you to override your membership level's default pricing."
9573
  msgstr ""
9574
 
9575
  #: adminpages/discountcodes.php:756
9576
  #: adminpages/discountcodes.php:758
 
9577
  msgid "Create a Discount Code"
9578
  msgstr ""
9579
 
9580
  #: adminpages/discountcodes.php:757
9581
  #: adminpages/discountcodes.php:759
 
9582
  msgid "Documentation: Discount Codes"
9583
  msgstr ""
9584
 
9585
  #: adminpages/discountcodes.php:766
9586
  #: adminpages/discountcodes.php:768
 
 
9587
  msgid "%d discount codes found."
9588
  msgstr ""
9589
 
@@ -9607,6 +10375,15 @@ msgstr ""
9607
  #: includes/profile.php:430
9608
  #: adminpages/orders.php:1388
9609
  #: adminpages/orders.php:1398
 
 
 
 
 
 
 
 
 
9610
  msgid "Edit"
9611
  msgstr ""
9612
 
@@ -9623,6 +10400,14 @@ msgstr ""
9623
  #: adminpages/discountcodes.php:860
9624
  #: adminpages/orders.php:1402
9625
  #: adminpages/orders.php:1413
 
 
 
 
 
 
 
 
9626
  msgid "Copy"
9627
  msgstr ""
9628
 
@@ -9631,15 +10416,18 @@ msgid " View Orders"
9631
  msgstr ""
9632
 
9633
  #: adminpages/emailsettings.php:87
 
9634
  msgid "Send Emails From"
9635
  msgstr ""
9636
 
9637
  #: adminpages/emailsettings.php:119
9638
  #: adminpages/emailsettings.php:173
 
9639
  msgid "Save All Settings"
9640
  msgstr ""
9641
 
9642
  #: adminpages/emailsettings.php:122
 
9643
  msgid "Email Deliverability"
9644
  msgstr ""
9645
 
@@ -9680,192 +10468,241 @@ msgid "Recommended: Leave unchecked. Members will still get an email confirmatio
9680
  msgstr ""
9681
 
9682
  #: adminpages/emailtemplates.php:23
 
9683
  msgid "Select an email template from the dropdown below to customize the subject and body of emails sent through your membership site. You can also disable a specific email or send a test version through this admin page."
9684
  msgstr ""
9685
 
9686
  #: adminpages/emailtemplates.php:23
 
9687
  msgid "Click here for a description of each email sent to your members and admins at different stages of the member experience."
9688
  msgstr ""
9689
 
9690
  #: adminpages/emailtemplates.php:38
 
9691
  msgid "Email Template"
9692
  msgstr ""
9693
 
9694
  #: adminpages/emailtemplates.php:42
 
9695
  msgid "Select a Template to Edit"
9696
  msgstr ""
9697
 
9698
  #: adminpages/emailtemplates.php:58
 
9699
  msgid "Disable this email?"
9700
  msgstr ""
9701
 
9702
  #: adminpages/emailtemplates.php:61
 
9703
  msgid "Emails with this template will not be sent."
9704
  msgstr ""
9705
 
9706
  #: adminpages/emailtemplates.php:66
 
9707
  msgid "Subject"
9708
  msgstr ""
9709
 
9710
  #: adminpages/emailtemplates.php:73
 
9711
  msgid "Body"
9712
  msgstr ""
9713
 
9714
  #: adminpages/emailtemplates.php:84
 
9715
  msgid "Send a test email to "
9716
  msgstr ""
9717
 
9718
  #: adminpages/emailtemplates.php:87
 
9719
  msgid "Save Template and Send Email"
9720
  msgstr ""
9721
 
9722
  #: adminpages/emailtemplates.php:92
 
9723
  msgid "Your current membership will be used for any membership level data."
9724
  msgstr ""
9725
 
9726
  #: adminpages/emailtemplates.php:101
 
9727
  msgid "Save Template"
9728
  msgstr ""
9729
 
9730
  #: adminpages/emailtemplates.php:104
 
9731
  msgid "Reset Template"
9732
  msgstr ""
9733
 
9734
  #: adminpages/emailtemplates.php:114
 
9735
  msgid "Variable Reference"
9736
  msgstr ""
9737
 
9738
  #: adminpages/emailtemplates.php:116
 
9739
  msgid "Use the placeholder variables below to customize your member and admin emails with specific user or membership data."
9740
  msgstr ""
9741
 
9742
  #: adminpages/emailtemplates.php:120
 
9743
  msgid "General Settings / Membership Info"
9744
  msgstr ""
9745
 
9746
  #: adminpages/emailtemplates.php:126
9747
  #: adminpages/emailtemplates.php:136
 
 
9748
  msgid "Display Name (Profile/Edit User > Display name publicly as)"
9749
  msgstr ""
9750
 
9751
  #: adminpages/emailtemplates.php:128
 
9752
  msgid "Site Title"
9753
  msgstr ""
9754
 
9755
  #: adminpages/emailtemplates.php:129
 
9756
  msgid "Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)"
9757
  msgstr ""
9758
 
9759
  #: adminpages/emailtemplates.php:131
 
9760
  msgid "Membership Level Name"
9761
  msgstr ""
9762
 
9763
  #: adminpages/emailtemplates.php:132
 
9764
  msgid "Membership Level Change"
9765
  msgstr ""
9766
 
9767
  #: adminpages/emailtemplates.php:133
 
9768
  msgid "Membership Level Expiration"
9769
  msgstr ""
9770
 
9771
  #: adminpages/emailtemplates.php:134
 
9772
  msgid "Membership Start Date"
9773
  msgstr ""
9774
 
9775
  #: adminpages/emailtemplates.php:135
 
9776
  msgid "Membership End Date"
9777
  msgstr ""
9778
 
9779
  #: adminpages/emailtemplates.php:137
9780
  #: classes/class.memberorder.php:960
9781
  #: classes/class.memberorder.php:1002
 
 
9782
  msgid "User Email"
9783
  msgstr ""
9784
 
9785
  #: adminpages/emailtemplates.php:138
 
9786
  msgid "Login URL"
9787
  msgstr ""
9788
 
9789
  #: adminpages/emailtemplates.php:139
 
9790
  msgid "Membership Levels Page URL"
9791
  msgstr ""
9792
 
9793
  #: adminpages/emailtemplates.php:162
 
9794
  msgid "Billing Info Complete Address"
9795
  msgstr ""
9796
 
9797
  #: adminpages/emailtemplates.php:163
 
9798
  msgid "Billing Info Name"
9799
  msgstr ""
9800
 
9801
  #: adminpages/emailtemplates.php:164
 
9802
  msgid "Billing Info Street Address"
9803
  msgstr ""
9804
 
9805
  #: adminpages/emailtemplates.php:165
 
9806
  msgid "Billing Info City"
9807
  msgstr ""
9808
 
9809
  #: adminpages/emailtemplates.php:166
 
9810
  msgid "Billing Info State"
9811
  msgstr ""
9812
 
9813
  #: adminpages/emailtemplates.php:167
 
9814
  msgid "Billing Info ZIP Code"
9815
  msgstr ""
9816
 
9817
  #: adminpages/emailtemplates.php:168
 
9818
  msgid "Billing Info Country"
9819
  msgstr ""
9820
 
9821
  #: adminpages/emailtemplates.php:169
 
9822
  msgid "Billing Info Phone #"
9823
  msgstr ""
9824
 
9825
  #: adminpages/emailtemplates.php:170
9826
  #: includes/privacy.php:363
 
9827
  msgid "Credit Card Type"
9828
  msgstr ""
9829
 
9830
  #: adminpages/emailtemplates.php:171
 
9831
  msgid "Credit Card Number (last 4 digits)"
9832
  msgstr ""
9833
 
9834
  #: adminpages/emailtemplates.php:172
 
9835
  msgid "Credit Card Expiration Month (mm format)"
9836
  msgstr ""
9837
 
9838
  #: adminpages/emailtemplates.php:173
 
9839
  msgid "Credit Card Expiration Year (yyyy format)"
9840
  msgstr ""
9841
 
9842
  #: adminpages/emailtemplates.php:174
 
9843
  msgid "Membership Level Cost Text"
9844
  msgstr ""
9845
 
9846
  #: adminpages/emailtemplates.php:175
 
9847
  msgid "Payment Instructions (used in Checkout - Email Template)"
9848
  msgstr ""
9849
 
9850
  #: adminpages/emailtemplates.php:176
9851
  #: includes/profile.php:423
9852
  #: includes/profile.php:410
 
 
9853
  msgid "Invoice ID"
9854
  msgstr ""
9855
 
9856
  #: adminpages/emailtemplates.php:177
 
9857
  msgid "Invoice Total"
9858
  msgstr ""
9859
 
9860
  #: adminpages/emailtemplates.php:178
 
9861
  msgid "Invoice Date"
9862
  msgstr ""
9863
 
9864
  #: adminpages/emailtemplates.php:179
 
9865
  msgid "Invoice Page URL"
9866
  msgstr ""
9867
 
9868
  #: adminpages/emailtemplates.php:180
 
9869
  msgid "Discount Code Applied"
9870
  msgstr ""
9871
 
@@ -9883,6 +10720,7 @@ msgstr ""
9883
  #: adminpages/license.php:61
9884
  #: adminpages/license.php:53
9885
  #: adminpages/license.php:55
 
9886
  msgid "Validate Key"
9887
  msgstr ""
9888
 
@@ -9890,14 +10728,17 @@ msgstr ""
9890
  #: adminpages/license.php:87
9891
  #: adminpages/license.php:86
9892
  #: adminpages/license.php:92
 
9893
  msgid "Paid Memberships Pro and our Add Ons are distributed under the <a href=\"%s\" title=\"GPLv2 license\" target=\"_blank\">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge."
9894
  msgstr ""
9895
 
9896
  #: adminpages/membershiplevels.php:391
 
9897
  msgid "Check to include this message in the membership confirmation email."
9898
  msgstr ""
9899
 
9900
  #: adminpages/membershiplevels.php:459
 
9901
  msgid "You will need to create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to %s."
9902
  msgstr ""
9903
 
@@ -9914,27 +10755,34 @@ msgid "WARNING: This level is set with both a recurring billing amount and an ex
9914
  msgstr ""
9915
 
9916
  #: adminpages/membershiplevels.php:640
 
9917
  msgid "Non-members will not see posts in these categories. You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
9918
  msgstr ""
9919
 
9920
  #: adminpages/membershiplevels.php:644
 
9921
  msgid "Non-members will see the title and excerpt for posts in these categories. You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
9922
  msgstr ""
9923
 
9924
  #: adminpages/membershiplevels.php:647
 
9925
  msgid "Non-members will see the title only for posts in these categories. You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
9926
  msgstr ""
9927
 
9928
  #: adminpages/membershiplevels.php:778
9929
  #: adminpages/membershiplevels.php:819
 
 
9930
  msgid "No Membership Levels Found"
9931
  msgstr ""
9932
 
9933
  #: adminpages/membershiplevels.php:780
 
9934
  msgid "Video: Membership Levels"
9935
  msgstr ""
9936
 
9937
  #: adminpages/memberslist.php:41
 
9938
  msgid "Optional: Capture additional member profile fields using the <a href=\"%s\" title=\"Paid Memberships Pro - Register Helper Add On\" target=\"_blank\">Register Helper Add On</a>."
9939
  msgstr ""
9940
 
@@ -9943,42 +10791,57 @@ msgstr ""
9943
  #: adminpages/orders.php:868
9944
  #: includes/profile.php:85
9945
  #: adminpages/orders.php:860
 
 
 
9946
  msgid "at"
9947
  msgstr ""
9948
 
9949
  #: adminpages/orders.php:908
9950
  #: adminpages/orders.php:914
9951
  #: adminpages/orders.php:906
 
 
9952
  msgid "TOS Consent"
9953
  msgstr ""
9954
 
9955
  #: adminpages/orders.php:1024
9956
  #: adminpages/orders.php:1030
9957
  #: adminpages/orders.php:1022
 
 
9958
  msgid "With a Discount Code"
9959
  msgstr ""
9960
 
9961
  #: adminpages/orders.php:1028
9962
  #: adminpages/orders.php:1034
9963
  #: adminpages/orders.php:1026
 
 
9964
  msgid "Only Paid Orders"
9965
  msgstr ""
9966
 
9967
  #: adminpages/orders.php:1030
9968
  #: adminpages/orders.php:1036
9969
  #: adminpages/orders.php:1028
 
 
9970
  msgid "Only Free Orders"
9971
  msgstr ""
9972
 
9973
  #: adminpages/orders.php:1073
9974
  #: adminpages/orders.php:1079
9975
  #: adminpages/orders.php:1071
 
 
9976
  msgid "Last Month"
9977
  msgstr ""
9978
 
9979
  #: adminpages/orders.php:1077
9980
  #: adminpages/orders.php:1083
9981
  #: adminpages/orders.php:1075
 
 
9982
  msgid "Last Year"
9983
  msgstr ""
9984
 
@@ -10017,78 +10880,91 @@ msgstr ""
10017
  #: adminpages/pagesettings.php:174
10018
  #: adminpages/pagesettings.php:189
10019
  #: adminpages/pagesettings.php:193
 
10020
  msgid "Manage Pages"
10021
  msgstr ""
10022
 
10023
  #: adminpages/pagesettings.php:175
10024
  #: adminpages/pagesettings.php:190
10025
  #: adminpages/pagesettings.php:194
 
10026
  msgid "Several frontend pages are required for your Paid Memberships Pro site."
10027
  msgstr ""
10028
 
10029
  #: adminpages/pagesettings.php:176
10030
  #: adminpages/pagesettings.php:191
10031
  #: adminpages/pagesettings.php:195
 
10032
  msgid "Generate Pages For Me"
10033
  msgstr ""
10034
 
10035
  #: adminpages/pagesettings.php:177
10036
  #: adminpages/pagesettings.php:192
10037
  #: adminpages/pagesettings.php:196
 
10038
  msgid "Create Pages Manually"
10039
  msgstr ""
10040
 
10041
  #: adminpages/pagesettings.php:199
10042
  #: adminpages/pagesettings.php:221
10043
  #: adminpages/pagesettings.php:225
 
10044
  msgid "or the Membership Account block"
10045
  msgstr ""
10046
 
10047
  #: adminpages/pagesettings.php:216
10048
  #: adminpages/pagesettings.php:245
10049
  #: adminpages/pagesettings.php:249
 
10050
  msgid "or the Membership Billing block"
10051
  msgstr ""
10052
 
10053
  #: adminpages/pagesettings.php:233
10054
  #: adminpages/pagesettings.php:269
10055
  #: adminpages/pagesettings.php:273
 
10056
  msgid "or the Membership Cancel block"
10057
  msgstr ""
10058
 
10059
  #: adminpages/pagesettings.php:251
10060
  #: adminpages/pagesettings.php:294
10061
  #: adminpages/pagesettings.php:298
 
10062
  msgid "or the Membership Checkout block"
10063
  msgstr ""
10064
 
10065
  #: adminpages/pagesettings.php:269
10066
  #: adminpages/pagesettings.php:319
10067
  #: adminpages/pagesettings.php:323
 
10068
  msgid "or the Membership Confirmation block"
10069
  msgstr ""
10070
 
10071
  #: adminpages/pagesettings.php:287
10072
  #: adminpages/pagesettings.php:344
10073
  #: adminpages/pagesettings.php:348
 
10074
  msgid "or the Membership Invoice block"
10075
  msgstr ""
10076
 
10077
  #: adminpages/pagesettings.php:305
10078
  #: adminpages/pagesettings.php:369
10079
  #: adminpages/pagesettings.php:373
 
10080
  msgid "or the Membership Levels block"
10081
  msgstr ""
10082
 
10083
  #: adminpages/pagesettings.php:315
10084
  #: adminpages/pagesettings.php:379
10085
  #: adminpages/pagesettings.php:383
 
10086
  msgid "Optional: Customize your Membership Levels page using the <a href=\"%s\" title=\"Paid Memberships Pro - Advanced Levels Page Add On\" target=\"_blank\">Advanced Levels Page Add On</a>."
10087
  msgstr ""
10088
 
10089
  #: adminpages/pagesettings.php:321
10090
  #: adminpages/pagesettings.php:385
10091
  #: adminpages/pagesettings.php:389
 
10092
  msgid "Log In Page"
10093
  msgstr ""
10094
 
@@ -10098,12 +10974,15 @@ msgstr ""
10098
  #: adminpages/pagesettings.php:421
10099
  #: adminpages/pagesettings.php:396
10100
  #: adminpages/pagesettings.php:425
 
 
10101
  msgid "Use WordPress Default"
10102
  msgstr ""
10103
 
10104
  #: adminpages/pagesettings.php:344
10105
  #: adminpages/pagesettings.php:409
10106
  #: adminpages/pagesettings.php:413
 
10107
  msgid "Include the shortcode %s or the Log In Form block."
10108
  msgstr ""
10109
 
@@ -10111,18 +10990,21 @@ msgstr ""
10111
  #: includes/adminpages.php:358
10112
  #: adminpages/pagesettings.php:414
10113
  #: adminpages/pagesettings.php:418
 
10114
  msgid "Member Profile Edit Page"
10115
  msgstr ""
10116
 
10117
  #: adminpages/pagesettings.php:372
10118
  #: adminpages/pagesettings.php:438
10119
  #: adminpages/pagesettings.php:442
 
10120
  msgid "Include the shortcode %s or the Member Profile Edit block."
10121
  msgstr ""
10122
 
10123
  #: adminpages/pagesettings.php:382
10124
  #: adminpages/pagesettings.php:448
10125
  #: adminpages/pagesettings.php:452
 
10126
  msgid "Optional: Collect additional member fields at checkout, on the profile, or for admin-use only using the <a href=\"%s\" title=\"Paid Memberships Pro - Register Helper Add On\" target=\"_blank\">Register Helper Add On</a>."
10127
  msgstr ""
10128
 
@@ -10131,10 +11013,14 @@ msgid "Learn more about <a title=\"Paid Memberships Pro - SSL Settings\" target=
10131
  msgstr ""
10132
 
10133
  #: adminpages/paymentsettings.php:142
 
 
10134
  msgid "This gateway is for membership sites with Free levels or for sites that accept payment offline."
10135
  msgstr ""
10136
 
10137
  #: adminpages/paymentsettings.php:142
 
 
10138
  msgid "It is not connected to a live gateway environment and cannot accept payments."
10139
  msgstr ""
10140
 
@@ -10143,6 +11029,8 @@ msgid "US only. If values are given, tax will be applied for any members orderin
10143
  msgstr ""
10144
 
10145
  #: adminpages/paymentsettings.php:260
 
 
10146
  msgid "Your Site URL starts with https:// and so PMPro will allow your entire site to be served over HTTPS."
10147
  msgstr ""
10148
 
@@ -10174,6 +11062,7 @@ msgstr ""
10174
  #: adminpages/reports/history.php:47
10175
  #: classes/class.memberorder.php:967
10176
  #: classes/class.memberorder.php:1009
 
10177
  msgid "Edit User"
10178
  msgstr ""
10179
 
@@ -10184,6 +11073,7 @@ msgstr ""
10184
  #: adminpages/reports/history.php:188
10185
  #: includes/profile.php:411
10186
  #: includes/profile.php:389
 
10187
  msgid "Total Paid"
10188
  msgstr ""
10189
 
@@ -10196,45 +11086,55 @@ msgid "Year to Date"
10196
  msgstr ""
10197
 
10198
  #: adminpages/reports/login.php:186
 
10199
  msgid "Visits This Week"
10200
  msgstr ""
10201
 
10202
  #: adminpages/reports/login.php:188
 
10203
  msgid "Visits This Year"
10204
  msgstr ""
10205
 
10206
  #: adminpages/reports/login.php:190
 
10207
  msgid "Views This Week"
10208
  msgstr ""
10209
 
10210
  #: adminpages/reports/login.php:192
 
10211
  msgid "Views This Year"
10212
  msgstr ""
10213
 
10214
  #: adminpages/reports/login.php:195
 
10215
  msgid "Logins This Week"
10216
  msgstr ""
10217
 
10218
  #: adminpages/reports/login.php:197
 
10219
  msgid "Logins This Year"
10220
  msgstr ""
10221
 
10222
  #: adminpages/reports/memberships.php:356
 
10223
  msgid "All Paid Levels"
10224
  msgstr ""
10225
 
10226
  #: adminpages/reports/memberships.php:357
 
10227
  msgid "All Free Levels"
10228
  msgstr ""
10229
 
10230
  #: adminpages/reports/memberships.php:377
10231
  #: adminpages/reports/sales.php:334
10232
  #: adminpages/reports/sales.php:352
 
10233
  msgid "All Codes"
10234
  msgstr ""
10235
 
10236
  #: adminpages/reports/sales.php:345
10237
  #: adminpages/reports/sales.php:364
 
10238
  msgid "Average line calculated using data prior to current day, month, or year."
10239
  msgstr ""
10240
 
@@ -10392,51 +11292,64 @@ msgstr ""
10392
  #: shortcodes/pmpro_account.php:145
10393
  #: classes/class-pmpro-members-list-table.php:541
10394
  #: classes/class-pmpro-members-list-table.php:570
 
 
 
 
10395
  msgid "&#8212;"
10396
  msgstr ""
10397
 
10398
  #: classes/class.memberorder.php:962
10399
  #: classes/class.memberorder.php:1004
 
10400
  msgid "User Display Name"
10401
  msgstr ""
10402
 
10403
  #: classes/class.memberorder.php:968
10404
  #: classes/class.memberorder.php:1010
 
 
10405
  msgid "Edit Order"
10406
  msgstr ""
10407
 
10408
  #: classes/class.memberorder.php:1141
10409
  #: classes/class.memberorder.php:1183
 
10410
  msgid "This is a test order used with the PMPro Email Templates addon."
10411
  msgstr ""
10412
 
10413
  #: classes/class.pmproemail.php:371
10414
  #: classes/class.pmproemail.php:377
10415
  #: classes/class.pmproemail.php:370
 
10416
  msgid "Member checkout for %s at %s"
10417
  msgstr ""
10418
 
10419
  #: classes/class.pmproemail.php:565
10420
  #: classes/class.pmproemail.php:577
10421
  #: classes/class.pmproemail.php:570
 
10422
  msgid "Membership payment failed at %s"
10423
  msgstr ""
10424
 
10425
  #: classes/class.pmproemail.php:614
10426
  #: classes/class.pmproemail.php:626
10427
  #: classes/class.pmproemail.php:619
 
10428
  msgid "Membership payment failed For %s at %s"
10429
  msgstr ""
10430
 
10431
  #: classes/class.pmproemail.php:663
10432
  #: classes/class.pmproemail.php:675
10433
  #: classes/class.pmproemail.php:668
 
10434
  msgid "Credit card on file expiring soon at %s"
10435
  msgstr ""
10436
 
10437
  #: classes/class.pmproemail.php:715
10438
  #: classes/class.pmproemail.php:727
10439
  #: classes/class.pmproemail.php:720
 
10440
  msgid "Invoice for %s membership"
10441
  msgstr ""
10442
 
@@ -10449,6 +11362,8 @@ msgstr ""
10449
  #: includes/email.php:465
10450
  #: classes/class.pmproemail.php:898
10451
  #: classes/class.pmproemail.php:943
 
 
10452
  msgid "The new level is %s."
10453
  msgstr ""
10454
 
@@ -10461,30 +11376,36 @@ msgstr ""
10461
  #: includes/email.php:475
10462
  #: classes/class.pmproemail.php:909
10463
  #: classes/class.pmproemail.php:954
 
 
10464
  msgid "This membership does not expire."
10465
  msgstr ""
10466
 
10467
  #: classes/class.pmproemail.php:940
10468
  #: classes/class.pmproemail.php:952
10469
  #: classes/class.pmproemail.php:945
 
10470
  msgid "Membership has been cancelled."
10471
  msgstr ""
10472
 
10473
  #: classes/class.pmproemail.php:980
10474
  #: classes/class.pmproemail.php:992
10475
  #: classes/class.pmproemail.php:985
 
10476
  msgid "Invoice for order #: "
10477
  msgstr ""
10478
 
10479
  #: classes/class.pmproemail.php:1030
10480
  #: classes/class.pmproemail.php:1042
10481
  #: classes/class.pmproemail.php:1035
 
10482
  msgid "Payment action required for your %s membership"
10483
  msgstr ""
10484
 
10485
  #: classes/class.pmproemail.php:1068
10486
  #: classes/class.pmproemail.php:1080
10487
  #: classes/class.pmproemail.php:1073
 
10488
  msgid "Payment action required: membership for %s at %s"
10489
  msgstr ""
10490
 
@@ -10496,14 +11417,17 @@ msgstr ""
10496
  #: classes/gateways/class.pmprogateway_stripe.php:91
10497
  #: classes/gateways/class.pmprogateway_stripe.php:97
10498
  #: classes/gateways/class.pmprogateway_stripe.php:1353
 
10499
  msgid "The %s gateway depends on the %s PHP extension. Please enable it, or ask your hosting provider to enable it."
10500
  msgstr ""
10501
 
10502
  #: classes/gateways/class.pmprogateway_braintree.php:144
 
10503
  msgid "Problem loading plans: %s"
10504
  msgstr ""
10505
 
10506
  #: classes/gateways/class.pmprogateway_braintree.php:146
 
10507
  msgid "Problem accessing the Braintree Gateway. Please verify your PMPro Payment Settings (Keys, etc)."
10508
  msgstr ""
10509
 
@@ -10513,27 +11437,49 @@ msgstr ""
10513
  #: classes/gateways/class.pmprogateway_braintree.php:848
10514
  #: classes/gateways/class.pmprogateway_braintree.php:957
10515
  #: classes/gateways/class.pmprogateway_braintree.php:984
 
 
 
 
 
 
 
 
 
 
10516
  msgid "Payment error: Please contact the webmaster (braintree-load-error)"
10517
  msgstr ""
10518
 
10519
  #: classes/gateways/class.pmprogateway_braintree.php:750
 
 
10520
  msgid "Failed to update customer: %s"
10521
  msgstr ""
10522
 
10523
  #: classes/gateways/class.pmprogateway_braintree.php:933
 
 
10524
  msgid "Error subscribing customer to plan with Braintree: %s (%s)"
10525
  msgstr ""
10526
 
10527
  #: classes/gateways/class.pmprogateway_braintree.php:948
 
 
10528
  msgid "Failed to subscribe with Braintree: %s"
10529
  msgstr ""
10530
 
10531
  #: classes/gateways/class.pmprogateway_braintree.php:1018
10532
  #: classes/gateways/class.pmprogateway_braintree.php:1029
 
 
 
 
10533
  msgid "Could not find the subscription. %s"
10534
  msgstr ""
10535
 
10536
  #: classes/gateways/class.pmprogateway_braintree.php:1082
 
 
10537
  msgid "Error getting subscription with Braintree:"
10538
  msgstr ""
10539
 
@@ -10795,6 +11741,7 @@ msgstr ""
10795
  #: classes/gateways/class.pmprogateway_cybersource.php:922
10796
  #: includes/license.php:159
10797
  #: includes/license.php:164
 
10798
  msgid "Unknown error."
10799
  msgstr ""
10800
 
@@ -10810,17 +11757,20 @@ msgstr ""
10810
  #: classes/gateways/class.pmprogateway_paypalexpress.php:155
10811
  #: classes/gateways/class.pmprogateway_paypalstandard.php:147
10812
  #: classes/gateways/class.pmprogateway_paypalexpress.php:165
 
10813
  msgid "Note: We do not recommend using PayPal Standard. We suggest using PayPal Express, Website Payments Pro (Legacy), or PayPal Pro (Payflow Pro). <a target=\"_blank\" href=\"%s\" title=\"More information on why can be found here\">More information on why can be found here</a>."
10814
  msgstr ""
10815
 
10816
  #: classes/gateways/class.pmprogateway_paypal.php:185
10817
  #: classes/gateways/class.pmprogateway_paypalexpress.php:194
10818
  #: classes/gateways/class.pmprogateway_paypalexpress.php:204
 
10819
  msgid "Confirmation Step"
10820
  msgstr ""
10821
 
10822
  #: classes/gateways/class.pmprogateway_paypalexpress.php:346
10823
  #: classes/gateways/class.pmprogateway_paypalexpress.php:356
 
10824
  msgid "Checkout was already processed."
10825
  msgstr ""
10826
 
@@ -10828,6 +11778,8 @@ msgstr ""
10828
  #: classes/gateways/class.pmprogateway_paypalexpress.php:791
10829
  #: classes/gateways/class.pmprogateway_paypalexpress.php:795
10830
  #: classes/gateways/class.pmprogateway_paypalexpress.php:804
 
 
10831
  msgid "Something went wrong creating plan with PayPal; missing PROFILESTATUS."
10832
  msgstr ""
10833
 
@@ -10835,6 +11787,8 @@ msgstr ""
10835
  #: classes/gateways/class.pmprogateway_paypalexpress.php:792
10836
  #: classes/gateways/class.pmprogateway_paypalexpress.php:796
10837
  #: classes/gateways/class.pmprogateway_paypalexpress.php:805
 
 
10838
  msgid "Error creating plan with PayPal."
10839
  msgstr ""
10840
 
@@ -10850,6 +11804,7 @@ msgstr ""
10850
  #: classes/gateways/class.pmprogateway_stripe.php:450
10851
  #: classes/gateways/class.pmprogateway_stripe.php:1790
10852
  #: classes/gateways/class.pmprogateway_stripe.php:1788
 
10853
  msgid "Stripe Connect Settings"
10854
  msgstr ""
10855
 
@@ -10858,6 +11813,7 @@ msgstr ""
10858
  #: classes/gateways/class.pmprogateway_stripe.php:362
10859
  #: classes/gateways/class.pmprogateway_stripe.php:1793
10860
  #: classes/gateways/class.pmprogateway_stripe.php:1791
 
10861
  msgid "Live Mode:"
10862
  msgstr ""
10863
 
@@ -10869,6 +11825,7 @@ msgstr ""
10869
  #: classes/gateways/class.pmprogateway_stripe.php:454
10870
  #: classes/gateways/class.pmprogateway_stripe.php:1795
10871
  #: classes/gateways/class.pmprogateway_stripe.php:1793
 
10872
  msgid "Connected"
10873
  msgstr ""
10874
 
@@ -10880,6 +11837,7 @@ msgstr ""
10880
  #: classes/gateways/class.pmprogateway_stripe.php:458
10881
  #: classes/gateways/class.pmprogateway_stripe.php:1799
10882
  #: classes/gateways/class.pmprogateway_stripe.php:1797
 
10883
  msgid "Not Connected"
10884
  msgstr ""
10885
 
@@ -10891,6 +11849,7 @@ msgstr ""
10891
  #: classes/gateways/class.pmprogateway_stripe.php:465
10892
  #: classes/gateways/class.pmprogateway_stripe.php:1807
10893
  #: classes/gateways/class.pmprogateway_stripe.php:1805
 
10894
  msgid "Your site is using legacy API keys to authenticate with Stripe."
10895
  msgstr ""
10896
 
@@ -10899,6 +11858,7 @@ msgstr ""
10899
  #: classes/gateways/class.pmprogateway_stripe.php:377
10900
  #: classes/gateways/class.pmprogateway_stripe.php:1811
10901
  #: classes/gateways/class.pmprogateway_stripe.php:1809
 
10902
  msgid "Use the \"Connect with Stripe\" button below to securely authenticate with your Stripe account using Stripe Connect. Log in with the current Stripe account used for this site so that existing subscriptions are not affected by the update."
10903
  msgstr ""
10904
 
@@ -10910,6 +11870,7 @@ msgstr ""
10910
  #: classes/gateways/class.pmprogateway_stripe.php:476
10911
  #: classes/gateways/class.pmprogateway_stripe.php:1824
10912
  #: classes/gateways/class.pmprogateway_stripe.php:1822
 
10913
  msgid "Stripe Connection:"
10914
  msgstr ""
10915
 
@@ -10921,6 +11882,7 @@ msgstr ""
10921
  #: classes/gateways/class.pmprogateway_stripe.php:500
10922
  #: classes/gateways/class.pmprogateway_stripe.php:1840
10923
  #: classes/gateways/class.pmprogateway_stripe.php:1838
 
10924
  msgid "Disconnect From Stripe"
10925
  msgstr ""
10926
 
@@ -10929,6 +11891,7 @@ msgstr ""
10929
  #: classes/gateways/class.pmprogateway_stripe.php:403
10930
  #: classes/gateways/class.pmprogateway_stripe.php:1844
10931
  #: classes/gateways/class.pmprogateway_stripe.php:1842
 
10932
  msgid "This will disconnect your site from Stripe. Users will not be able to complete membership checkout or update their billing information. Existing subscriptions will not be affected at the gateway, but new recurring orders will not be created in this site."
10933
  msgstr ""
10934
 
@@ -10940,6 +11903,7 @@ msgstr ""
10940
  #: classes/gateways/class.pmprogateway_stripe.php:514
10941
  #: classes/gateways/class.pmprogateway_stripe.php:1861
10942
  #: classes/gateways/class.pmprogateway_stripe.php:1859
 
10943
  msgid "Connect with Stripe"
10944
  msgstr ""
10945
 
@@ -10948,6 +11912,7 @@ msgstr ""
10948
  #: classes/gateways/class.pmprogateway_stripe.php:422
10949
  #: classes/gateways/class.pmprogateway_stripe.php:1868
10950
  #: classes/gateways/class.pmprogateway_stripe.php:1866
 
10951
  msgid "Note: You have a valid license and are not charged additional platform fees for payment processing."
10952
  msgstr ""
10953
 
@@ -10971,6 +11936,8 @@ msgstr ""
10971
  #: classes/gateways/class.pmprogateway_stripe.php:348
10972
  #: classes/gateways/class.pmprogateway_stripe.php:1882
10973
  #: classes/gateways/class.pmprogateway_stripe.php:1880
 
 
10974
  msgid "Webhook"
10975
  msgstr ""
10976
 
@@ -10987,6 +11954,8 @@ msgstr ""
10987
  #: classes/gateways/class.pmprogateway_stripe.php:383
10988
  #: classes/gateways/class.pmprogateway_stripe.php:1886
10989
  #: classes/gateways/class.pmprogateway_stripe.php:1884
 
 
10990
  msgid "Webhook URL"
10991
  msgstr ""
10992
 
@@ -10995,6 +11964,7 @@ msgstr ""
10995
  #: classes/gateways/class.pmprogateway_stripe.php:452
10996
  #: classes/gateways/class.pmprogateway_stripe.php:1793
10997
  #: classes/gateways/class.pmprogateway_stripe.php:1791
 
10998
  msgid "Test Mode:"
10999
  msgstr ""
11000
 
@@ -11003,6 +11973,7 @@ msgstr ""
11003
  #: classes/gateways/class.pmprogateway_stripe.php:467
11004
  #: classes/gateways/class.pmprogateway_stripe.php:1813
11005
  #: classes/gateways/class.pmprogateway_stripe.php:1811
 
11006
  msgid "Use the \"Connect with Stripe\" button below to securely authenticate with your Stripe account using Stripe Connect in test mode."
11007
  msgstr ""
11008
 
@@ -11011,6 +11982,7 @@ msgstr ""
11011
  #: classes/gateways/class.pmprogateway_stripe.php:501
11012
  #: classes/gateways/class.pmprogateway_stripe.php:1846
11013
  #: classes/gateways/class.pmprogateway_stripe.php:1844
 
11014
  msgid "This will disconnect your site from Stripe in test mode only."
11015
  msgstr ""
11016
 
@@ -11018,6 +11990,7 @@ msgstr ""
11018
  #: classes/gateways/class.pmprogateway_stripe.php:530
11019
  #: classes/gateways/class.pmprogateway_stripe.php:536
11020
  #: classes/gateways/class.pmprogateway_stripe.php:300
 
11021
  msgid "Stripe API Settings (Legacy)"
11022
  msgstr ""
11023
 
@@ -11026,6 +11999,7 @@ msgstr ""
11026
  #: classes/gateways/class.pmprogateway_stripe.php:562
11027
  #: classes/gateways/class.pmprogateway_stripe.php:568
11028
  #: classes/gateways/class.pmprogateway_stripe.php:332
 
11029
  msgid "Your Publishable Key appears incorrect."
11030
  msgstr ""
11031
 
@@ -11039,6 +12013,8 @@ msgstr ""
11039
  #: classes/gateways/class.pmprogateway_stripe.php:612
11040
  #: classes/gateways/class.pmprogateway_stripe.php:352
11041
  #: classes/gateways/class.pmprogateway_stripe.php:376
 
 
11042
  msgid "Create Webhook"
11043
  msgstr ""
11044
 
@@ -11047,6 +12023,7 @@ msgstr ""
11047
  #: classes/gateways/class.pmprogateway_stripe.php:588
11048
  #: classes/gateways/class.pmprogateway_stripe.php:594
11049
  #: classes/gateways/class.pmprogateway_stripe.php:358
 
11050
  msgid "A webhook is set up in Stripe, but it is disabled."
11051
  msgstr ""
11052
 
@@ -11055,6 +12032,7 @@ msgstr ""
11055
  #: classes/gateways/class.pmprogateway_stripe.php:595
11056
  #: classes/gateways/class.pmprogateway_stripe.php:601
11057
  #: classes/gateways/class.pmprogateway_stripe.php:365
 
11058
  msgid "A webhook is set up in Stripe, but it is using an old API version."
11059
  msgstr ""
11060
 
@@ -11063,6 +12041,9 @@ msgstr ""
11063
  #: classes/gateways/class.pmprogateway_stripe.php:595
11064
  #: classes/gateways/class.pmprogateway_stripe.php:601
11065
  #: classes/gateways/class.pmprogateway_stripe.php:365
 
 
 
11066
  msgid "Rebuild Webhook"
11067
  msgstr ""
11068
 
@@ -11080,6 +12061,8 @@ msgstr ""
11080
  #: classes/gateways/class.pmprogateway_stripe.php:863
11081
  #: classes/gateways/class.pmprogateway_stripe.php:371
11082
  #: classes/gateways/class.pmprogateway_stripe.php:503
 
 
11083
  msgid "Your webhook is enabled."
11084
  msgstr ""
11085
 
@@ -11088,6 +12071,7 @@ msgstr ""
11088
  #: classes/gateways/class.pmprogateway_stripe.php:601
11089
  #: classes/gateways/class.pmprogateway_stripe.php:607
11090
  #: classes/gateways/class.pmprogateway_stripe.php:371
 
11091
  msgid "Disable Webhook"
11092
  msgstr ""
11093
 
@@ -11109,6 +12093,8 @@ msgstr ""
11109
  #: classes/gateways/class.pmprogateway_stripe.php:825
11110
  #: classes/gateways/class.pmprogateway_stripe.php:378
11111
  #: classes/gateways/class.pmprogateway_stripe.php:530
 
 
11112
  msgid "A webhook in Stripe is required to process recurring payments, manage failed payments, and synchronize cancellations."
11113
  msgstr ""
11114
 
@@ -11117,6 +12103,7 @@ msgstr ""
11117
  #: classes/gateways/class.pmprogateway_stripe.php:620
11118
  #: classes/gateways/class.pmprogateway_stripe.php:626
11119
  #: classes/gateways/class.pmprogateway_stripe.php:390
 
11120
  msgid "Other Stripe Settings"
11121
  msgstr ""
11122
 
@@ -11125,6 +12112,7 @@ msgstr ""
11125
  #: classes/gateways/class.pmprogateway_stripe.php:624
11126
  #: classes/gateways/class.pmprogateway_stripe.php:630
11127
  #: classes/gateways/class.pmprogateway_stripe.php:394
 
11128
  msgid "Stripe API Version"
11129
  msgstr ""
11130
 
@@ -11133,6 +12121,7 @@ msgstr ""
11133
  #: classes/gateways/class.pmprogateway_stripe.php:643
11134
  #: classes/gateways/class.pmprogateway_stripe.php:649
11135
  #: classes/gateways/class.pmprogateway_stripe.php:413
 
11136
  msgid "Enable Payment Request Button"
11137
  msgstr ""
11138
 
@@ -11141,6 +12130,7 @@ msgstr ""
11141
  #: classes/gateways/class.pmprogateway_stripe.php:661
11142
  #: classes/gateways/class.pmprogateway_stripe.php:667
11143
  #: classes/gateways/class.pmprogateway_stripe.php:431
 
11144
  msgid "Allow users to pay using Apple Pay, Google Pay, or Microsoft Pay depending on their browser. When enabled, your domain will automatically be registered with Apple and a domain association file will be hosted on your site. <a target=\"_blank\" href=\"%s\" title=\"More Information about the domain association file for Apple Pay\">More Information &raquo;</a>"
11145
  msgstr ""
11146
 
@@ -11149,6 +12139,7 @@ msgstr ""
11149
  #: classes/gateways/class.pmprogateway_stripe.php:674
11150
  #: classes/gateways/class.pmprogateway_stripe.php:680
11151
  #: classes/gateways/class.pmprogateway_stripe.php:444
 
11152
  msgid "This webpage is being served over HTTP, but the Stripe Payment Request Button will only work on pages being served over HTTPS. To resolve this, you must <a target=\"_blank\" href=\"%s\" title=\"Configuring WordPress to Always Use HTTPS/SSL\">set up WordPress to always use HTTPS</a>."
11153
  msgstr ""
11154
 
@@ -11157,6 +12148,7 @@ msgstr ""
11157
  #: classes/gateways/class.pmprogateway_stripe.php:676
11158
  #: classes/gateways/class.pmprogateway_stripe.php:682
11159
  #: classes/gateways/class.pmprogateway_stripe.php:446
 
11160
  msgid "It looks like you are using an older Stripe publishable key. In order to use the Payment Request Button feature, you will need to update your API key, which will be prefixed with \"pk_live_\" or \"pk_test_\". <a target=\"_blank\" href=\"%s\" title=\"Stripe Dashboard API Key Settings\">Log in to your Stripe Dashboard to roll your publishable key</a>."
11161
  msgstr ""
11162
 
@@ -11165,6 +12157,7 @@ msgstr ""
11165
  #: classes/gateways/class.pmprogateway_stripe.php:678
11166
  #: classes/gateways/class.pmprogateway_stripe.php:684
11167
  #: classes/gateways/class.pmprogateway_stripe.php:448
 
11168
  msgid "It looks like you are using an older Stripe secret key. In order to use the Payment Request Button feature, you will need to update your API key, which will be prefixed with \"sk_live_\" or \"sk_test_\". <a target=\"_blank\" href=\"%s\" title=\"Stripe Dashboard API Key Settings\">Log in to your Stripe Dashboard to roll your secret key</a>."
11169
  msgstr ""
11170
 
@@ -11173,6 +12166,7 @@ msgstr ""
11173
  #: classes/gateways/class.pmprogateway_stripe.php:680
11174
  #: classes/gateways/class.pmprogateway_stripe.php:686
11175
  #: classes/gateways/class.pmprogateway_stripe.php:450
 
11176
  msgid "Your domain could not be registered with Apple to enable Apple Pay. Please try <a target=\"_blank\" href=\"%s\" title=\"Apple Pay Settings Page in Stripe\">registering your domain manually from the Apple Pay settings page in Stripe</a>."
11177
  msgstr ""
11178
 
@@ -11181,6 +12175,7 @@ msgstr ""
11181
  #: classes/gateways/class.pmprogateway_stripe.php:705
11182
  #: classes/gateways/class.pmprogateway_stripe.php:711
11183
  #: classes/gateways/class.pmprogateway_stripe.php:475
 
11184
  msgid "Optional: Offer PayPal Express as an option at checkout using the <a target=\"_blank\" href=\"%s\" title=\"Paid Memberships Pro - Add PayPal Express Option at Checkout Add On\">Add PayPal Express Add On</a>."
11185
  msgstr ""
11186
 
@@ -11189,6 +12184,7 @@ msgstr ""
11189
  #: classes/gateways/class.pmprogateway_stripe.php:726
11190
  #: classes/gateways/class.pmprogateway_stripe.php:732
11191
  #: classes/gateways/class.pmprogateway_stripe.php:492
 
11192
  msgid "Webhook creation failed. You might already have a webhook set up."
11193
  msgstr ""
11194
 
@@ -11201,6 +12197,7 @@ msgstr ""
11201
  #: classes/gateways/class.pmprogateway_stripe.php:798
11202
  #: classes/gateways/class.pmprogateway_stripe.php:872
11203
  #: classes/gateways/class.pmprogateway_stripe.php:536
 
11204
  msgid "There was an error deleting the webhook."
11205
  msgstr ""
11206
 
@@ -11209,6 +12206,7 @@ msgstr ""
11209
  #: classes/gateways/class.pmprogateway_stripe.php:842
11210
  #: classes/gateways/class.pmprogateway_stripe.php:848
11211
  #: classes/gateways/class.pmprogateway_stripe.php:564
 
11212
  msgid "Webhook creation failed. Please refresh and try again."
11213
  msgstr ""
11214
 
@@ -11217,6 +12215,7 @@ msgstr ""
11217
  #: classes/gateways/class.pmprogateway_stripe.php:898
11218
  #: classes/gateways/class.pmprogateway_stripe.php:904
11219
  #: classes/gateways/class.pmprogateway_stripe.php:592
 
11220
  msgid "Verification steps confirmed. Your payment is processing."
11221
  msgstr ""
11222
 
@@ -11225,6 +12224,7 @@ msgstr ""
11225
  #: classes/gateways/class.pmprogateway_stripe.php:1293
11226
  #: classes/gateways/class.pmprogateway_stripe.php:1299
11227
  #: classes/gateways/class.pmprogateway_stripe.php:758
 
11228
  msgid "Pay with Credit Card"
11229
  msgstr ""
11230
 
@@ -11233,6 +12233,7 @@ msgstr ""
11233
  #: classes/gateways/class.pmprogateway_stripe.php:1327
11234
  #: classes/gateways/class.pmprogateway_stripe.php:1333
11235
  #: classes/gateways/class.pmprogateway_stripe.php:792
 
11236
  msgid "CVC"
11237
  msgstr ""
11238
 
@@ -11275,6 +12276,9 @@ msgstr ""
11275
  #: classes/gateways/class.pmprogateway_stripe.php:4331
11276
  #: classes/gateways/class.pmprogateway_stripe.php:4327
11277
  #: classes/gateways/class.pmprogateway_stripe.php:4333
 
 
 
11278
  msgid "Error: "
11279
  msgstr ""
11280
 
@@ -11285,6 +12289,8 @@ msgstr ""
11285
  #: classes/gateways/class.pmprogateway_stripe.php:4349
11286
  #: classes/gateways/class.pmprogateway_stripe.php:4345
11287
  #: classes/gateways/class.pmprogateway_stripe.php:4347
 
 
11288
  msgid "Error: Unkown error while refunding charge #%s"
11289
  msgstr ""
11290
 
@@ -11294,6 +12300,7 @@ msgstr ""
11294
  #: classes/gateways/class.pmprogateway_stripe.php:3370
11295
  #: classes/gateways/class.pmprogateway_stripe.php:3366
11296
  #: classes/gateways/class.pmprogateway_stripe.php:3368
 
11297
  msgid "Customer authentication is required to complete this transaction. Please complete the verification steps issued by your payment provider."
11298
  msgstr ""
11299
 
@@ -11311,6 +12318,13 @@ msgstr ""
11311
  #: classes/gateways/class.pmprogateway_stripe.php:2546
11312
  #: classes/gateways/class.pmprogateway_stripe.php:2583
11313
  #: classes/gateways/class.pmprogateway_stripe.php:3388
 
 
 
 
 
 
 
11314
  msgid "Customer authentication is required to finish setting up your subscription. Please complete the verification steps issued by your payment provider."
11315
  msgstr ""
11316
 
@@ -11319,6 +12333,7 @@ msgstr ""
11319
  #: classes/gateways/class.pmprogateway_stripe.php:3567
11320
  #: classes/gateways/class.pmprogateway_stripe.php:3573
11321
  #: classes/gateways/class.pmprogateway_stripe.php:1199
 
11322
  msgid "Invalid response from the Stripe Connect server."
11323
  msgstr ""
11324
 
@@ -11328,6 +12343,7 @@ msgstr ""
11328
  #: classes/gateways/class.pmprogateway_stripe.php:3595
11329
  #: classes/gateways/class.pmprogateway_stripe.php:3601
11330
  #: classes/gateways/class.pmprogateway_stripe.php:1227
 
11331
  msgid "<strong>Error:</strong> PMPro could not connect to the Stripe API. Reason: %s"
11332
  msgstr ""
11333
 
@@ -11337,6 +12353,7 @@ msgstr ""
11337
  #: classes/gateways/class.pmprogateway_stripe.php:3631
11338
  #: classes/gateways/class.pmprogateway_stripe.php:3637
11339
  #: classes/gateways/class.pmprogateway_stripe.php:1263
 
11340
  msgid "<strong>Error:</strong> PMPro could not disconnect from the Stripe API. Reason: %s"
11341
  msgstr ""
11342
 
@@ -11347,6 +12364,8 @@ msgstr ""
11347
  #: classes/gateways/class.pmprogateway_stripe.php:3674
11348
  #: classes/gateways/class.pmprogateway_stripe.php:3670
11349
  #: classes/gateways/class.pmprogateway_stripe.php:3672
 
 
11350
  msgid "Last webhook received at"
11351
  msgstr ""
11352
 
@@ -11357,6 +12376,8 @@ msgstr ""
11357
  #: classes/gateways/class.pmprogateway_stripe.php:3676
11358
  #: classes/gateways/class.pmprogateway_stripe.php:3672
11359
  #: classes/gateways/class.pmprogateway_stripe.php:3674
 
 
11360
  msgid "No webhooks have been received."
11361
  msgstr ""
11362
 
@@ -11367,6 +12388,8 @@ msgstr ""
11367
  #: classes/gateways/class.pmprogateway_stripe.php:3680
11368
  #: classes/gateways/class.pmprogateway_stripe.php:3676
11369
  #: classes/gateways/class.pmprogateway_stripe.php:3678
 
 
11370
  msgid "Your webhook may not be working correctly."
11371
  msgstr ""
11372
 
@@ -11377,6 +12400,8 @@ msgstr ""
11377
  #: classes/gateways/class.pmprogateway_stripe.php:3682
11378
  #: classes/gateways/class.pmprogateway_stripe.php:3678
11379
  #: classes/gateways/class.pmprogateway_stripe.php:3680
 
 
11380
  msgid "Click here for info on setting up your webhook with Stripe."
11381
  msgstr ""
11382
 
@@ -11411,6 +12436,7 @@ msgstr ""
11411
  #: blocks/account-page/block.js:59
11412
  #: js/blocks.build.js:303
11413
  #: js/blocks.build.js:342
 
11414
  msgid "Membership Account Page"
11415
  msgstr ""
11416
 
@@ -11423,6 +12449,7 @@ msgstr ""
11423
  #: blocks/cancel-page/block.js:39
11424
  #: js/blocks.build.js:677
11425
  #: js/blocks.build.js:695
 
11426
  msgid "Membership Cancel Page"
11427
  msgstr ""
11428
 
@@ -11435,6 +12462,7 @@ msgstr ""
11435
  #: blocks/confirmation-page/block.js:39
11436
  #: js/blocks.build.js:1136
11437
  #: js/blocks.build.js:1154
 
11438
  msgid "Membership Confirmation Page"
11439
  msgstr ""
11440
 
@@ -13225,14 +14253,17 @@ msgid "This email is sent to the member when the trial portion of their membersh
13225
  msgstr ""
13226
 
13227
  #: includes/email-templates.php:508
 
13228
  msgid "Payment action required for your !!sitename!! membership"
13229
  msgstr ""
13230
 
13231
  #: includes/email-templates.php:509
 
13232
  msgid "Payment Action Required"
13233
  msgstr ""
13234
 
13235
  #: includes/email-templates.php:510
 
13236
  msgid ""
13237
  "<p>Customer authentication is required to finish setting up your subscription at !!sitename!!.</p>\n"
13238
  "\n"
@@ -13241,18 +14272,22 @@ msgid ""
13241
  msgstr ""
13242
 
13243
  #: includes/email-templates.php:514
 
13244
  msgid "This email is sent to the user when an attempted membership checkout requires additional customer authentication."
13245
  msgstr ""
13246
 
13247
  #: includes/email-templates.php:517
 
13248
  msgid "Payment action required: membership for !!user_login!! at !!sitename!!"
13249
  msgstr ""
13250
 
13251
  #: includes/email-templates.php:518
 
13252
  msgid "Payment Action Required (admin)"
13253
  msgstr ""
13254
 
13255
  #: includes/email-templates.php:519
 
13256
  msgid ""
13257
  "<p>A payment at !!sitename!! for !!user_login!! requires additional customer authentication to complete.</p>\n"
13258
  "<p>Below is a copy of the email we sent to !!user_email!! to notify them that they need to complete their payment:</p>\n"
@@ -13264,6 +14299,7 @@ msgid ""
13264
  msgstr ""
13265
 
13266
  #: includes/email-templates.php:526
 
13267
  msgid "This email is sent to the site administrator when an attempted membership checkout requires additional customer authentication."
13268
  msgstr ""
13269
 
@@ -13292,88 +14328,111 @@ msgid "Profile Start Date Issue Detected and Fixed at %s"
13292
  msgstr ""
13293
 
13294
  #: includes/functions.php:406
 
13295
  msgid " and then <strong>%1$s per %2$s for %3$d more %4$s</strong>."
13296
  msgstr ""
13297
 
13298
  #: includes/functions.php:408
 
13299
  msgid " and then <strong>%1$s every %2$d %3$s for %4$d more payments</strong>."
13300
  msgstr ""
13301
 
13302
  #: includes/functions.php:411
 
13303
  msgid " and then <strong>%1$s after %2$d %3$s</strong>."
13304
  msgstr ""
13305
 
13306
  #: includes/functions.php:416
 
13307
  msgid "The price for membership is <strong>%1$s per %2$s</strong>."
13308
  msgstr ""
13309
 
13310
  #: includes/functions.php:418
 
13311
  msgid "<strong>%1$s per %2$s</strong>."
13312
  msgstr ""
13313
 
13314
  #: includes/functions.php:422
 
13315
  msgid "The price for membership is <strong>%1$s every %2$d %3$s</strong>."
13316
  msgstr ""
13317
 
13318
  #: includes/functions.php:424
 
13319
  msgid "<strong>%1$s every %2$d %3$s</strong>."
13320
  msgstr ""
13321
 
13322
  #: includes/functions.php:429
 
13323
  msgid " and then <strong>%1$s per %2$s</strong>."
13324
  msgstr ""
13325
 
13326
  #: includes/functions.php:431
 
13327
  msgid " and then <strong>%1$s every %2$d %3$s</strong>."
13328
  msgstr ""
13329
 
13330
  #: includes/functions.php:454
 
13331
  msgid "After your initial payment, your first %1$d payments will cost %2$s."
13332
  msgstr ""
13333
 
13334
  #: includes/functions.php:464
13335
  #: includes/functions.php:565
 
 
13336
  msgid "Customers in %1$s will be charged %2$s%% tax."
13337
  msgstr ""
13338
 
13339
  #: includes/functions.php:522
 
13340
  msgid "<strong>%1$s per %2$s for %3$d more %4$s</strong>"
13341
  msgstr ""
13342
 
13343
  #: includes/functions.php:524
 
13344
  msgid "<strong>%1$s every %2$d %3$s for %4$d more payments</strong>"
13345
  msgstr ""
13346
 
13347
  #: includes/functions.php:527
 
13348
  msgid "<strong>%1$s after %2$d %3$s</strong>"
13349
  msgstr ""
13350
 
13351
  #: includes/functions.php:530
 
13352
  msgid "<strong>%1$s every %2$s</strong>"
13353
  msgstr ""
13354
 
13355
  #: includes/functions.php:532
 
13356
  msgid "<strong>%1$s every %2$d %3$s</strong>"
13357
  msgstr ""
13358
 
13359
  #: includes/functions.php:582
 
13360
  msgid "Membership expires after %1$d %2$s."
13361
  msgstr ""
13362
 
13363
  #: includes/functions.php:601
 
13364
  msgid "%1$s membership expires after %2$d %3$s"
13365
  msgstr ""
13366
 
13367
  #: includes/functions.php:997
 
13368
  msgid "No membership_id specified in pmpro_changeMembershipLevel."
13369
  msgstr ""
13370
 
13371
  #: includes/functions.php:1191
 
13372
  msgid "Error interacting with database: %s"
13373
  msgstr ""
13374
 
13375
  #: includes/functions.php:2433
13376
  #: includes/functions.php:2464
 
 
13377
  msgid "Sign Up Now"
13378
  msgstr ""
13379
 
@@ -13487,6 +14546,7 @@ msgstr ""
13487
  #: includes/profile.php:843
13488
  #: includes/profile.php:855
13489
  #: includes/profile.php:851
 
13490
  msgid "New passwords do not match."
13491
  msgstr ""
13492
 
@@ -13494,6 +14554,7 @@ msgstr ""
13494
  #: includes/profile.php:839
13495
  #: includes/profile.php:851
13496
  #: includes/profile.php:847
 
13497
  msgid "Please complete all fields."
13498
  msgstr ""
13499
 
@@ -13525,6 +14586,7 @@ msgstr ""
13525
  #: includes/profile.php:891
13526
  #: includes/profile.php:903
13527
  #: includes/profile.php:899
 
13528
  msgid "New Password"
13529
  msgstr ""
13530
 
@@ -13534,6 +14596,7 @@ msgstr ""
13534
  #: includes/profile.php:906
13535
  #: includes/scripts.php:85
13536
  #: includes/profile.php:902
 
13537
  msgid "Strength Indicator"
13538
  msgstr ""
13539
 
@@ -13541,6 +14604,7 @@ msgstr ""
13541
  #: includes/profile.php:898
13542
  #: includes/profile.php:910
13543
  #: includes/profile.php:906
 
13544
  msgid "Confirm New Password"
13545
  msgstr ""
13546
 
@@ -13640,6 +14704,8 @@ msgstr ""
13640
  #: includes/profile.php:499
13641
  #: includes/profile.php:412
13642
  #: includes/profile.php:495
 
 
13643
  msgid "Level ID"
13644
  msgstr ""
13645
 
@@ -13647,6 +14713,7 @@ msgstr ""
13647
  #: includes/profile.php:496
13648
  #: includes/profile.php:502
13649
  #: includes/profile.php:498
 
13650
  msgid "Date Modified"
13651
  msgstr ""
13652
 
@@ -13654,6 +14721,7 @@ msgstr ""
13654
  #: includes/profile.php:497
13655
  #: includes/profile.php:503
13656
  #: includes/profile.php:499
 
13657
  msgid "End Date"
13658
  msgstr ""
13659
 
@@ -13661,6 +14729,7 @@ msgstr ""
13661
  #: includes/profile.php:498
13662
  #: includes/profile.php:504
13663
  #: includes/profile.php:500
 
13664
  msgid "Level Cost"
13665
  msgstr ""
13666
 
@@ -13725,132 +14794,155 @@ msgid "Views Data"
13725
  msgstr ""
13726
 
13727
  #: includes/privacy.php:520
 
13728
  msgid "That post has since been updated."
13729
  msgstr ""
13730
 
13731
  #: includes/profile.php:58
13732
  #: pages/invoice.php:43
13733
  #: shortcodes/pmpro_account.php:244
 
13734
  msgid "Paid"
13735
  msgstr ""
13736
 
13737
  #: includes/profile.php:138
13738
  #: includes/profile.php:114
 
13739
  msgid "Send the user an email about this change."
13740
  msgstr ""
13741
 
13742
  #: includes/profile.php:144
13743
  #: includes/profile.php:120
 
13744
  msgid "Cancel this user's subscription at the gateway."
13745
  msgstr ""
13746
 
13747
  #: includes/profile.php:158
13748
  #: includes/profile.php:134
 
13749
  msgid "TOS Consent History"
13750
  msgstr ""
13751
 
13752
  #: includes/profile.php:410
13753
  #: includes/profile.php:388
 
13754
  msgid "Member History"
13755
  msgstr ""
13756
 
13757
  #: includes/profile.php:413
13758
  #: includes/profile.php:391
 
13759
  msgid "Order History"
13760
  msgstr ""
13761
 
13762
  #: includes/profile.php:414
13763
  #: includes/profile.php:392
 
13764
  msgid "Membership Levels History"
13765
  msgstr ""
13766
 
13767
  #: includes/profile.php:485
13768
  #: includes/profile.php:488
13769
  #: includes/profile.php:475
 
13770
  msgid "No membership orders found."
13771
  msgstr ""
13772
 
13773
  #: includes/profile.php:537
13774
  #: includes/profile.php:546
13775
  #: includes/profile.php:542
 
13776
  msgid "No membership history found."
13777
  msgstr ""
13778
 
13779
  #: includes/profile.php:644
13780
  #: includes/profile.php:656
13781
  #: includes/profile.php:652
 
13782
  msgid "Log in to edit your profile."
13783
  msgstr ""
13784
 
13785
  #: includes/profile.php:679
13786
  #: includes/profile.php:691
13787
  #: includes/profile.php:687
 
13788
  msgid "Please enter a display name."
13789
  msgstr ""
13790
 
13791
  #: includes/profile.php:689
13792
  #: includes/profile.php:701
13793
  #: includes/profile.php:697
 
13794
  msgid "Please enter an email address."
13795
  msgstr ""
13796
 
13797
  #: includes/profile.php:691
13798
  #: includes/profile.php:703
13799
  #: includes/profile.php:699
 
13800
  msgid "The email address isn&#8217;t correct."
13801
  msgstr ""
13802
 
13803
  #: includes/profile.php:695
13804
  #: includes/profile.php:707
13805
  #: includes/profile.php:703
 
13806
  msgid "This email is already registered, please choose another one."
13807
  msgstr ""
13808
 
13809
  #: includes/profile.php:722
13810
  #: includes/profile.php:734
13811
  #: includes/profile.php:730
 
13812
  msgid "Your profile has been updated."
13813
  msgstr ""
13814
 
13815
  #: includes/profile.php:749
13816
  #: includes/profile.php:761
13817
  #: includes/profile.php:757
 
13818
  msgid "Display name publicly as"
13819
  msgstr ""
13820
 
13821
  #: includes/profile.php:762
13822
  #: includes/profile.php:774
13823
  #: includes/profile.php:770
 
13824
  msgid "Site administrators must use the WordPress dashboard to update their email address."
13825
  msgstr ""
13826
 
13827
  #: includes/profile.php:785
13828
  #: includes/profile.php:797
13829
  #: includes/profile.php:793
 
13830
  msgid "Update Profile"
13831
  msgstr ""
13832
 
13833
  #: includes/profile.php:841
13834
  #: includes/profile.php:853
13835
  #: includes/profile.php:849
 
13836
  msgid "Please enter your current password."
13837
  msgstr ""
13838
 
13839
  #: includes/profile.php:845
13840
  #: includes/profile.php:857
13841
  #: includes/profile.php:853
 
13842
  msgid "Your current password is incorrect."
13843
  msgstr ""
13844
 
13845
  #: includes/profile.php:856
13846
  #: includes/profile.php:868
13847
  #: includes/profile.php:864
 
13848
  msgid "Your password has been updated."
13849
  msgstr ""
13850
 
13851
  #: includes/profile.php:886
13852
  #: includes/profile.php:898
13853
  #: includes/profile.php:894
 
13854
  msgid "Current Password"
13855
  msgstr ""
13856
 
@@ -13862,6 +14954,9 @@ msgstr ""
13862
  #: includes/profile.php:896
13863
  #: includes/profile.php:901
13864
  #: includes/profile.php:908
 
 
 
13865
  msgid "Required Field"
13866
  msgstr ""
13867
 
@@ -13911,24 +15006,28 @@ msgid "Customize this menu per level using the <a href=\"%s\" title=\"Paid Membe
13911
  msgstr ""
13912
 
13913
  #: pages/billing.php:136
 
13914
  msgid "Your billing information cannot be updated at this time."
13915
  msgstr ""
13916
 
13917
  #: pages/billing.php:458
13918
  #: shortcodes/pmpro_account.php:68
13919
  #: pages/billing.php:468
 
13920
  msgid "Your membership is not active. <a href='%s'>Renew now.</a>"
13921
  msgstr ""
13922
 
13923
  #: pages/billing.php:461
13924
  #: shortcodes/pmpro_account.php:71
13925
  #: pages/billing.php:471
 
13926
  msgid "You do not have an active membership. <a href='%s'>Register here.</a>"
13927
  msgstr ""
13928
 
13929
  #: pages/billing.php:464
13930
  #: shortcodes/pmpro_account.php:74
13931
  #: pages/billing.php:474
 
13932
  msgid "You do not have an active membership. <a href='%s'>Choose a membership level.</a>"
13933
  msgstr ""
13934
 
@@ -13955,6 +15054,7 @@ msgstr ""
13955
  #: paid-memberships-pro.php:170
13956
  #: paid-memberships-pro.php:172
13957
  #: paid-memberships-pro.php:173
 
13958
  msgid "Default"
13959
  msgstr ""
13960
 
@@ -13980,6 +15080,7 @@ msgstr ""
13980
  #: blocks/account-invoices-section/block.js:39
13981
  #: js/blocks.build.js:119
13982
  #: js/blocks.build.js:137
 
13983
  msgid "Membership Account: Invoices"
13984
  msgstr ""
13985
 
@@ -14018,6 +15119,21 @@ msgstr ""
14018
  #: js/blocks.build.js:1335
14019
  #: js/blocks.build.js:1496
14020
  #: js/blocks.build.js:1560
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14021
  msgid "pmpro"
14022
  msgstr ""
14023
 
@@ -14033,6 +15149,7 @@ msgstr ""
14033
 
14034
  #: blocks/account-links-section/block.js:39
14035
  #: js/blocks.build.js:194
 
14036
  msgid "Membership Account: Member Links"
14037
  msgstr ""
14038
 
@@ -14048,6 +15165,7 @@ msgstr ""
14048
 
14049
  #: blocks/account-membership-section/block.js:39
14050
  #: js/blocks.build.js:251
 
14051
  msgid "Membership Account: My Memberships"
14052
  msgstr ""
14053
 
@@ -14080,6 +15198,7 @@ msgstr ""
14080
  #: blocks/account-profile-section/block.js:40
14081
  #: js/blocks.build.js:492
14082
  #: js/blocks.build.js:510
 
14083
  msgid "Membership Account: Profile"
14084
  msgstr ""
14085
 
@@ -14092,6 +15211,7 @@ msgstr ""
14092
  #: blocks/billing-page/block.js:39
14093
  #: js/blocks.build.js:549
14094
  #: js/blocks.build.js:567
 
14095
  msgid "Membership Billing Page"
14096
  msgstr ""
14097
 
@@ -14117,11 +15237,16 @@ msgstr ""
14117
 
14118
  #: blocks/checkout-button/block.js:41
14119
  #: js/blocks.build.js:758
 
 
 
14120
  msgid "buy"
14121
  msgstr ""
14122
 
14123
  #: blocks/checkout-button/block.js:42
14124
  #: js/blocks.build.js:758
 
 
14125
  msgid "level"
14126
  msgstr ""
14127
 
@@ -14129,6 +15254,7 @@ msgstr ""
14129
  #: blocks/checkout-button/inspector.js:31
14130
  #: js/blocks.build.js:790
14131
  #: js/blocks.build.js:891
 
14132
  msgid "Button Text"
14133
  msgstr ""
14134
 
@@ -14136,6 +15262,7 @@ msgstr ""
14136
  #: blocks/checkout-button/inspector.js:48
14137
  #: js/blocks.build.js:807
14138
  #: js/blocks.build.js:910
 
14139
  msgid "CSS Class"
14140
  msgstr ""
14141
 
@@ -14158,6 +15285,7 @@ msgstr ""
14158
  #: blocks/checkout-page/block.js:52
14159
  #: js/blocks.build.js:973
14160
  #: js/blocks.build.js:1003
 
14161
  msgid "Membership Checkout Form"
14162
  msgstr ""
14163
 
@@ -14183,6 +15311,7 @@ msgstr ""
14183
 
14184
  #: blocks/invoice-page/block.js:39
14185
  #: js/blocks.build.js:1224
 
14186
  msgid "Membership Invoices"
14187
  msgstr ""
14188
 
@@ -14190,6 +15319,7 @@ msgstr ""
14190
  #: blocks/levels-page/block.js:39
14191
  #: js/blocks.build.js:1263
14192
  #: js/blocks.build.js:1281
 
14193
  msgid "Membership Levels List"
14194
  msgstr ""
14195
 
@@ -14222,6 +15352,7 @@ msgstr ""
14222
 
14223
  #: blocks/login/block.js:38
14224
  #: js/blocks.build.js:1335
 
14225
  msgid "log in"
14226
  msgstr ""
14227
 
@@ -14244,6 +15375,7 @@ msgstr ""
14244
  #: blocks/member-profile-edit/block.js:35
14245
  #: js/blocks.build.js:1488
14246
  #: js/blocks.build.js:1504
 
14247
  msgid "Member Profile Edit"
14248
  msgstr ""
14249
 
@@ -14254,11 +15386,22 @@ msgstr ""
14254
 
14255
  #: blocks/member-profile-edit/block.js:27
14256
  #: js/blocks.build.js:1496
 
 
 
 
 
 
 
 
 
 
14257
  msgid "member"
14258
  msgstr ""
14259
 
14260
  #: blocks/member-profile-edit/block.js:28
14261
  #: js/blocks.build.js:1496
 
14262
  msgid "profile"
14263
  msgstr ""
14264
 
@@ -14278,6 +15421,7 @@ msgstr ""
14278
 
14279
  #: adminpages/discountcodes.php:871
14280
  #: adminpages/discountcodes.php:873
 
14281
  msgid "View Orders"
14282
  msgstr ""
14283
 
@@ -14291,6 +15435,7 @@ msgstr ""
14291
  #: classes/gateways/class.pmprogateway_stripe.php:456
14292
  #: classes/gateways/class.pmprogateway_stripe.php:1797
14293
  #: classes/gateways/class.pmprogateway_stripe.php:1795
 
14294
  msgid "Connected with Legacy Keys"
14295
  msgstr ""
14296
 
@@ -14300,6 +15445,7 @@ msgstr ""
14300
  #: classes/gateways/class.pmprogateway_stripe.php:466
14301
  #: classes/gateways/class.pmprogateway_stripe.php:1808
14302
  #: classes/gateways/class.pmprogateway_stripe.php:1806
 
14303
  msgid "You can continue to use the legacy API keys or choose to upgrade to our new Stripe Connect solution below."
14304
  msgstr ""
14305
 
@@ -14309,10 +15455,12 @@ msgstr ""
14309
  #: classes/gateways/class.pmprogateway_stripe.php:468
14310
  #: classes/gateways/class.pmprogateway_stripe.php:1816
14311
  #: classes/gateways/class.pmprogateway_stripe.php:1814
 
14312
  msgid "Read the documentation on switching to Stripe Connect &raquo;"
14313
  msgstr ""
14314
 
14315
  #: adminpages/emailtemplates.php:181
 
14316
  msgid "Custom Level Confirmation Message"
14317
  msgstr ""
14318
 
@@ -14323,6 +15471,7 @@ msgstr ""
14323
  #: classes/class-pmpro-site-health.php:109
14324
  #: classes/class-pmpro-site-health.php:120
14325
  #: classes/class-pmpro-site-health.php:124
 
14326
  msgid "No Levels Found"
14327
  msgstr ""
14328
 
@@ -14330,6 +15479,7 @@ msgstr ""
14330
  #: classes/class-pmpro-site-health.php:128
14331
  #: classes/class-pmpro-site-health.php:139
14332
  #: classes/class-pmpro-site-health.php:143
 
14333
  msgid "%d discount code"
14334
  msgid_plural "%d discount codes"
14335
  msgstr[0] ""
@@ -14339,6 +15489,7 @@ msgstr[1] ""
14339
  #: classes/class-pmpro-site-health.php:144
14340
  #: classes/class-pmpro-site-health.php:155
14341
  #: classes/class-pmpro-site-health.php:159
 
14342
  msgid "%d order"
14343
  msgid_plural "%d orders"
14344
  msgstr[0] ""
@@ -14348,18 +15499,24 @@ msgstr[1] ""
14348
  #: classes/class-pmpro-site-health.php:161
14349
  #: classes/class-pmpro-site-health.php:172
14350
  #: classes/class-pmpro-site-health.php:176
 
14351
  msgid "%s (gateway not registered)"
14352
  msgstr ""
14353
 
14354
  #: classes/class-pmpro-site-health.php:174
14355
  #: classes/class-pmpro-site-health.php:185
14356
  #: classes/class-pmpro-site-health.php:189
 
 
14357
  msgid "Legacy Keys"
14358
  msgstr ""
14359
 
14360
  #: classes/class-pmpro-site-health.php:178
14361
  #: classes/class-pmpro-site-health.php:189
14362
  #: classes/class-pmpro-site-health.php:193
 
 
 
14363
  msgid "Stripe Connect"
14364
  msgstr ""
14365
 
@@ -14367,12 +15524,16 @@ msgstr ""
14367
  #: classes/class-pmpro-site-health.php:202
14368
  #: classes/class-pmpro-site-health.php:213
14369
  #: classes/class-pmpro-site-health.php:217
 
 
14370
  msgid "%s (environment not registered)"
14371
  msgstr ""
14372
 
14373
  #: classes/class-pmpro-site-health.php:226
14374
  #: classes/class-pmpro-site-health.php:268
14375
  #: classes/class-pmpro-site-health.php:272
 
 
14376
  msgid "Unable to verify"
14377
  msgstr ""
14378
 
@@ -14380,22 +15541,26 @@ msgstr ""
14380
  #: classes/class-pmpro-site-health.php:345
14381
  #: classes/class-pmpro-site-health.php:349
14382
  #: classes/class-pmpro-site-health.php:346
 
14383
  msgid "missing"
14384
  msgstr ""
14385
 
14386
  #: classes/gateways/class.pmprogateway_stripe.php:533
14387
  #: classes/gateways/class.pmprogateway_stripe.php:539
14388
  #: classes/gateways/class.pmprogateway_stripe.php:303
 
14389
  msgid "Having trouble connecting through the button above or otherwise need to use your own API keys?"
14390
  msgstr ""
14391
 
14392
  #: classes/gateways/class.pmprogateway_stripe.php:534
14393
  #: classes/gateways/class.pmprogateway_stripe.php:540
14394
  #: classes/gateways/class.pmprogateway_stripe.php:304
 
14395
  msgid "Click here to use the legacy API settings."
14396
  msgstr ""
14397
 
14398
  #: adminpages/license.php:37
 
14399
  msgid "There was an issue validating your license key: %s"
14400
  msgstr ""
14401
 
@@ -14453,12 +15618,14 @@ msgstr ""
14453
  #: classes/class-pmpro-site-health.php:365
14454
  #: classes/class-pmpro-site-health.php:406
14455
  #: classes/class-pmpro-site-health.php:403
 
14456
  msgid "PMPRO_GETFILE_ENABLED is not set"
14457
  msgstr ""
14458
 
14459
  #: classes/class-pmpro-site-health.php:369
14460
  #: classes/class-pmpro-site-health.php:410
14461
  #: classes/class-pmpro-site-health.php:407
 
14462
  msgid "PMPRO_GETFILE_ENABLED is off"
14463
  msgstr ""
14464
 
@@ -14468,6 +15635,7 @@ msgstr ""
14468
  #: classes/class-pmpro-site-health.php:457
14469
  #: classes/class-pmpro-site-health.php:420
14470
  #: classes/class-pmpro-site-health.php:454
 
14471
  msgid "Unable to access .htaccess file"
14472
  msgstr ""
14473
 
@@ -14477,6 +15645,7 @@ msgstr ""
14477
  #: classes/class-pmpro-site-health.php:461
14478
  #: classes/class-pmpro-site-health.php:424
14479
  #: classes/class-pmpro-site-health.php:458
 
14480
  msgid "Off - No .htaccess file"
14481
  msgstr ""
14482
 
@@ -14486,54 +15655,64 @@ msgstr ""
14486
  #: classes/class-pmpro-site-health.php:472
14487
  #: classes/class-pmpro-site-health.php:430
14488
  #: classes/class-pmpro-site-health.php:469
 
 
14489
  msgid "Off"
14490
  msgstr ""
14491
 
14492
  #: classes/class-pmpro-site-health.php:395
14493
  #: classes/class-pmpro-site-health.php:436
14494
  #: classes/class-pmpro-site-health.php:433
 
14495
  msgid "On - .htaccess contains services/getfile.php usage"
14496
  msgstr ""
14497
 
14498
  #: classes/class-pmpro-site-health.php:426
14499
  #: classes/class-pmpro-site-health.php:467
14500
  #: classes/class-pmpro-site-health.php:464
 
14501
  msgid "On - Browser cache enabled for HTML (ExpiresByType text/html), this may interfere with Content Restriction after Login. Remove that line from your .htaccess to resolve this problem."
14502
  msgstr ""
14503
 
14504
  #: classes/class-pmpro-site-health.php:428
14505
  #: classes/class-pmpro-site-health.php:469
14506
  #: classes/class-pmpro-site-health.php:466
 
14507
  msgid "On - Browser cache enabled for HTML (ExpiresDefault), this may interfere with Content Restriction after Login. Remove that line from your .htaccess to resolve this problem."
14508
  msgstr ""
14509
 
14510
  #: classes/class-pmpro-site-health.php:443
14511
  #: classes/class-pmpro-site-health.php:484
14512
  #: classes/class-pmpro-site-health.php:481
 
14513
  msgid "Cron Limit"
14514
  msgstr ""
14515
 
14516
  #: classes/class-pmpro-site-health.php:444
14517
  #: classes/class-pmpro-site-health.php:485
14518
  #: classes/class-pmpro-site-health.php:482
 
14519
  msgid "Default Membership Level"
14520
  msgstr ""
14521
 
14522
  #: classes/class-pmpro-site-health.php:445
14523
  #: classes/class-pmpro-site-health.php:486
14524
  #: classes/class-pmpro-site-health.php:483
 
14525
  msgid "Use Sessions"
14526
  msgstr ""
14527
 
14528
  #: classes/class-pmpro-site-health.php:450
14529
  #: classes/class-pmpro-site-health.php:491
14530
  #: classes/class-pmpro-site-health.php:488
 
14531
  msgid "Authorize.net Silent Post Debug Mode"
14532
  msgstr ""
14533
 
14534
  #: classes/class-pmpro-site-health.php:453
14535
  #: classes/class-pmpro-site-health.php:494
14536
  #: classes/class-pmpro-site-health.php:491
 
14537
  msgid "Braintree Webhook Debug Mode"
14538
  msgstr ""
14539
 
@@ -14544,41 +15723,52 @@ msgstr ""
14544
  #: classes/class-pmpro-site-health.php:500
14545
  #: classes/class-pmpro-site-health.php:503
14546
  #: classes/class-pmpro-site-health.php:494
 
 
 
14547
  msgid "PayPal IPN Debug Mode"
14548
  msgstr ""
14549
 
14550
  #: classes/class-pmpro-site-health.php:465
14551
  #: classes/class-pmpro-site-health.php:506
14552
  #: classes/class-pmpro-site-health.php:503
 
14553
  msgid "Stripe Webhook Delay"
14554
  msgstr ""
14555
 
14556
  #: classes/class-pmpro-site-health.php:466
14557
  #: classes/class-pmpro-site-health.php:507
14558
  #: classes/class-pmpro-site-health.php:504
 
14559
  msgid "Stripe Webhook Debug Mode"
14560
  msgstr ""
14561
 
14562
  #: classes/class-pmpro-site-health.php:469
14563
  #: classes/class-pmpro-site-health.php:510
14564
  #: classes/class-pmpro-site-health.php:507
 
14565
  msgid "2Checkout INS Debug Mode"
14566
  msgstr ""
14567
 
14568
  #: adminpages/advancedsettings.php:243
 
14569
  msgid "Enable Spam Protection?"
14570
  msgstr ""
14571
 
14572
  #: adminpages/advancedsettings.php:249
 
14573
  msgid "Yes - Enable Spam Protection"
14574
  msgstr ""
14575
 
14576
  #: adminpages/advancedsettings.php:251
 
14577
  msgid "Block IPs from checkout if there are more than %d failures within %d minutes."
14578
  msgstr ""
14579
 
14580
  #: adminpages/dashboard.php:186
14581
  #: adminpages/dashboard.php:188
 
 
14582
  msgid "View Plans and Pricing"
14583
  msgstr ""
14584
 
@@ -14593,69 +15783,87 @@ msgstr ""
14593
 
14594
  #: classes/class-pmpro-site-health.php:389
14595
  #: classes/class-pmpro-site-health.php:386
 
14596
  msgid "No Membership Pages Found"
14597
  msgstr ""
14598
 
14599
  #: classes/gateways/class.pmprogateway_stripe.php:847
 
14600
  msgid "Edit customer in Stripe"
14601
  msgstr ""
14602
 
14603
  #: classes/gateways/class.pmprogateway_stripe.php:1387
 
14604
  msgid "Error processing setup intent."
14605
  msgstr ""
14606
 
14607
  #: classes/gateways/class.pmprogateway_stripe.php:1402
 
14608
  msgid "Error processing payment intent."
14609
  msgstr ""
14610
 
14611
  #: classes/gateways/class.pmprogateway_stripe.php:1424
14612
  #: classes/gateways/class.pmprogateway_stripe.php:1679
14613
  #: classes/gateways/class.pmprogateway_stripe.php:1677
 
 
14614
  msgid "Error retrieving payment method."
14615
  msgstr ""
14616
 
14617
  #: classes/gateways/class.pmprogateway_stripe.php:1432
14618
  #: classes/gateways/class.pmprogateway_stripe.php:1687
14619
  #: classes/gateways/class.pmprogateway_stripe.php:1685
 
 
14620
  msgid "Error updating default payment method."
14621
  msgstr ""
14622
 
14623
  #: classes/gateways/class.pmprogateway_stripe.php:1460
 
14624
  msgid "Error creating subscription for customer."
14625
  msgstr ""
14626
 
14627
  #: classes/gateways/class.pmprogateway_stripe.php:1693
14628
  #: classes/gateways/class.pmprogateway_stripe.php:1691
 
14629
  msgid "Error updating payment method for subscription."
14630
  msgstr ""
14631
 
14632
  #: classes/gateways/class.pmprogateway_stripe.php:2088
14633
  #: classes/gateways/class.pmprogateway_stripe.php:2086
14634
  #: classes/gateways/class.pmprogateway_stripe.php:2087
 
14635
  msgid "Error updating customer record with Stripe."
14636
  msgstr ""
14637
 
14638
  #: classes/gateways/class.pmprogateway_stripe.php:2099
14639
  #: classes/gateways/class.pmprogateway_stripe.php:2097
14640
  #: classes/gateways/class.pmprogateway_stripe.php:2098
 
14641
  msgid "Error creating customer record with Stripe."
14642
  msgstr ""
14643
 
14644
  #: classes/gateways/class.pmprogateway_stripe.php:2424
14645
  #: classes/gateways/class.pmprogateway_stripe.php:2420
14646
  #: classes/gateways/class.pmprogateway_stripe.php:2422
 
 
14647
  msgid "Cannot find product for membership level."
14648
  msgstr ""
14649
 
14650
  #: classes/gateways/class.pmprogateway_stripe.php:2430
14651
  #: classes/gateways/class.pmprogateway_stripe.php:2426
14652
  #: classes/gateways/class.pmprogateway_stripe.php:2428
 
 
14653
  msgid "Cannot get price."
14654
  msgstr ""
14655
 
14656
  #: classes/gateways/class.pmprogateway_stripe.php:2580
14657
  #: classes/gateways/class.pmprogateway_stripe.php:2576
14658
  #: classes/gateways/class.pmprogateway_stripe.php:2578
 
 
14659
  msgid "Cannot reuse an old setup intent."
14660
  msgstr ""
14661
 
@@ -14663,6 +15871,9 @@ msgstr ""
14663
  #: classes/gateways/class.pmprogateway_stripe.php:2616
14664
  #: classes/gateways/class.pmprogateway_stripe.php:2610
14665
  #: classes/gateways/class.pmprogateway_stripe.php:2612
 
 
 
14666
  msgid "Error adding metadata to setup intent."
14667
  msgstr ""
14668
 
@@ -14675,6 +15886,8 @@ msgstr ""
14675
  #: classes/gateways/class.pmprogateway_stripe.php:2716
14676
  #: classes/gateways/class.pmprogateway_stripe.php:2712
14677
  #: classes/gateways/class.pmprogateway_stripe.php:2714
 
 
14678
  msgid "Remove"
14679
  msgstr ""
14680
 
@@ -14695,52 +15908,65 @@ msgid "PMPro Builder"
14695
  msgstr ""
14696
 
14697
  #: adminpages/advancedsettings.php:497
 
14698
  msgid "To delete all PMPro data from the database, set to Yes, deactivate PMPro, and then click to delete PMPro from the plugins page."
14699
  msgstr ""
14700
 
14701
  #: adminpages/dashboard.php:181
14702
  #: adminpages/license.php:43
 
14703
  msgid "Your <strong>%1$s</strong> key is active. %1$s accounts include access to documentation and free downloads."
14704
  msgstr ""
14705
 
14706
  #: adminpages/license.php:96
 
14707
  msgid "<strong>Paid Memberships Pro offers plans for automatic updates of Add Ons and premium support.</strong> These plans include a license key which we recommend for all public websites running Paid Memberships Pro. A license key allows you to automatically install Add Ons included in your plan and update active Add Ons included in your plan when a new security, bug fix, or feature enhancement is released."
14708
  msgstr ""
14709
 
14710
  #: adminpages/license.php:100
 
14711
  msgid "<strong>Need help?</strong> Your license allows you to open new tickets in our private support area. Purchases are backed by a 30 day, no questions asked refund policy."
14712
  msgstr ""
14713
 
14714
  #: adminpages/orders.php:1549
 
14715
  msgid "renewal"
14716
  msgstr ""
14717
 
14718
  #: adminpages/reports/sales.php:406
 
14719
  msgid "Renewals"
14720
  msgstr ""
14721
 
14722
  #: adminpages/reports/sales.php:407
 
14723
  msgid "New %s"
14724
  msgstr ""
14725
 
14726
  #: adminpages/reports/sales.php:409
14727
  #: adminpages/reports/sales.php:411
 
 
14728
  msgid "Average: %s"
14729
  msgstr ""
14730
 
14731
  #: adminpages/reports/sales.php:526
 
14732
  msgid "New:"
14733
  msgstr ""
14734
 
14735
  #: adminpages/reports/sales.php:529
 
14736
  msgid "Renewals:"
14737
  msgstr ""
14738
 
14739
  #: adminpages/reports/sales.php:532
 
14740
  msgid "Total:"
14741
  msgstr ""
14742
 
14743
  #: adminpages/reports/sales.php:545
 
14744
  msgid "%s %s for %s"
14745
  msgstr ""
14746
 
@@ -14765,19 +15991,26 @@ msgid "PMPro News and Updates"
14765
  msgstr ""
14766
 
14767
  #: classes/class-pmpro-site-health.php:276
 
 
14768
  msgid "No template overrides"
14769
  msgstr ""
14770
 
14771
  #: classes/class-pmpro-site-health.php:282
 
 
14772
  msgid "Empty override folder -- no template overrides"
14773
  msgstr ""
14774
 
14775
  #: classes/gateways/class.pmprogateway_stripe.php:1868
 
14776
  msgid "Note: You are using the free Stripe payment gateway integration. This includes an additional 1% fee for payment processing. This fee is removed by activating a premium PMPro license."
14777
  msgstr ""
14778
 
14779
  #: classes/gateways/class.pmprogateway_stripe.php:2363
14780
  #: classes/gateways/class.pmprogateway_stripe.php:2365
 
 
14781
  msgid "Could not create price."
14782
  msgstr ""
14783
 
@@ -14837,6 +16070,7 @@ msgid "Paid Memberships Pro Order History"
14837
  msgstr ""
14838
 
14839
  #: includes/privacy.php:512
 
14840
  msgid "%s agreed to %s (ID #%d, last modified %s) on %s."
14841
  msgstr ""
14842
 
@@ -14844,3 +16078,914 @@ msgstr ""
14844
  #: js/blocks.build.js:1433
14845
  msgid "Assign the menu under Appearance > Menus."
14846
  msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  # This file is distributed under the same license as the Paid Memberships Pro plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Paid Memberships Pro 2.8\n"
6
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
7
  "Last-Translator: Paid Memberships Pro <info@paidmembershipspro.com>\n"
8
  "Language-Team: Paid Memberships Pro <info@paidmembershipspro.com>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-05-05T20:36:56+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: paid-memberships-pro\n"
92
  #: adminpages/orders.php:1022
93
  #: adminpages/orders.php:1014
94
  #: includes/metaboxes.php:19
95
+ #: adminpages/orders.php:1015
96
+ #: adminpages/orders.php:1103
97
  msgid "All"
98
  msgstr "Tot"
99
 
137
  #: adminpages/membershiplevels.php:296
138
  #: adminpages/membershiplevels.php:298
139
  #: adminpages/membershiplevels.php:359
140
+ #: adminpages/membershiplevels.php:357
141
  msgid "Description"
142
  msgstr "Descripció"
143
 
218
  #: adminpages/discountcodes.php:866
219
  #: adminpages/orders.php:1417
220
  #: adminpages/orders.php:1419
221
+ #: adminpages/orders.php:1418
222
+ #: adminpages/orders.php:1420
223
+ #: adminpages/discountcodes.php:869
224
+ #: adminpages/discountcodes.php:871
225
+ #: adminpages/membershiplevels.php:885
226
+ #: adminpages/orders.php:1533
227
+ #: adminpages/orders.php:1535
228
  msgid "Delete"
229
  msgstr "Esborra"
230
 
289
  #: adminpages/orders.php:1545
290
  #: adminpages/addons.php:250
291
  #: adminpages/orders.php:912
292
+ #: adminpages/orders.php:583
293
+ #: adminpages/orders.php:913
294
+ #: adminpages/orders.php:1537
295
+ #: adminpages/orders.php:1546
296
+ #: adminpages/orders.php:704
297
+ #: adminpages/orders.php:996
298
+ #: adminpages/orders.php:1689
299
+ #: adminpages/orders.php:1698
300
+ #: classes/class.pmproemail.php:261
301
+ #: classes/class.pmproemail.php:327
302
+ #: includes/profile.php:167
303
+ #: includes/profile.php:483
304
+ #: includes/profile.php:484
305
+ #: includes/profile.php:556
306
+ #: includes/profile.php:557
307
+ #: includes/profile.php:558
308
  msgid "N/A"
309
  msgstr "N/A"
310
 
497
  #: includes/profile.php:758
498
  #: adminpages/orders.php:1437
499
  #: adminpages/orders.php:1440
500
+ #: adminpages/orders.php:392
501
+ #: adminpages/orders.php:1438
502
+ #: adminpages/orders.php:1441
503
+ #: adminpages/orders.php:440
504
+ #: adminpages/orders.php:1553
505
+ #: adminpages/orders.php:1556
506
+ #: includes/profile.php:478
507
+ #: includes/profile.php:798
508
  msgid "Email"
509
  msgstr "Correu electrònic"
510
 
520
  #: adminpages/advancedsettings.php:42
521
  #: adminpages/advancedsettings.php:68
522
  #: adminpages/advancedsettings.php:69
523
+ #: adminpages/advancedsettings.php:76
524
  msgid "Your advanced settings have been updated."
525
  msgstr "La vostra configuració avançada s’han actualitzat."
526
 
541
  #: adminpages/advancedsettings.php:116
542
  #: includes/updates/upgrade_1.php:13
543
  #: adminpages/advancedsettings.php:118
544
+ #: adminpages/advancedsettings.php:126
545
  msgid "This content is for members only. Visit the site and log in/register to read."
546
  msgstr "Aquest contingut és només per a subscriptors. Visita el lloc i registra’t/log in per a llegir."
547
 
560
  #: adminpages/advancedsettings.php:132
561
  #: includes/adminpages.php:73
562
  #: adminpages/advancedsettings.php:134
563
+ #: adminpages/advancedsettings.php:142
564
  msgid "Advanced Settings"
565
  msgstr "Configuració Avançada"
566
 
569
  #: adminpages/advancedsettings.php:92
570
  #: adminpages/advancedsettings.php:164
571
  #: adminpages/advancedsettings.php:166
572
+ #: adminpages/advancedsettings.php:173
573
  msgid "Message for Logged-in Non-members"
574
  msgstr "Missatge per a No subscriptors “Logged-in”"
575
 
578
  #: adminpages/advancedsettings.php:96
579
  #: adminpages/advancedsettings.php:168
580
  #: adminpages/advancedsettings.php:170
581
+ #: adminpages/advancedsettings.php:177
582
  msgid "This message replaces the post content for non-members. Available variables"
583
  msgstr "Aquest missatge reemplaça el contingut de l’entrada per als no membres. Hi ha variables disponibles"
584
 
587
  #: adminpages/advancedsettings.php:101
588
  #: adminpages/advancedsettings.php:173
589
  #: adminpages/advancedsettings.php:175
590
+ #: adminpages/advancedsettings.php:182
591
  msgid "Message for Logged-out Users"
592
  msgstr "Missatge per als usuaris desconnectats (Logged-out)"
593
 
596
  #: adminpages/advancedsettings.php:105
597
  #: adminpages/advancedsettings.php:177
598
  #: adminpages/advancedsettings.php:179
599
+ #: adminpages/advancedsettings.php:186
600
  msgid "This message replaces the post content for logged-out visitors."
601
  msgstr "Aquest missatge remplaça el contingut del post per a visitants desconnectats (logged-out)"
602
 
605
  #: adminpages/advancedsettings.php:110
606
  #: adminpages/advancedsettings.php:182
607
  #: adminpages/advancedsettings.php:184
608
+ #: adminpages/advancedsettings.php:191
609
  msgid "Message for RSS Feed"
610
  msgstr "Missatge per a RSS Feed"
611
 
614
  #: adminpages/advancedsettings.php:114
615
  #: adminpages/advancedsettings.php:186
616
  #: adminpages/advancedsettings.php:188
617
+ #: adminpages/advancedsettings.php:195
618
  msgid "This message replaces the post content in RSS feeds."
619
  msgstr "Aquest missatge reemplaça el contingut del seu missatge en els canals RSS."
620
 
621
  #: adminpages/advancedsettings.php:122
622
  #: adminpages/advancedsettings.php:199
623
  #: adminpages/advancedsettings.php:201
624
+ #: adminpages/advancedsettings.php:208
625
  msgid "Filter searches and archives?"
626
  msgstr "Filtra recerques i arxius?"
627
 
628
  #: adminpages/advancedsettings.php:126
629
  #: adminpages/advancedsettings.php:203
630
  #: adminpages/advancedsettings.php:205
631
+ #: adminpages/advancedsettings.php:212
632
  msgid "No - Non-members will see restricted posts/pages in searches and archives."
633
  msgstr "No - No subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
634
 
635
  #: adminpages/advancedsettings.php:127
636
  #: adminpages/advancedsettings.php:204
637
  #: adminpages/advancedsettings.php:206
638
+ #: adminpages/advancedsettings.php:213
639
  msgid "Yes - Only members will see restricted posts/pages in searches and archives."
640
  msgstr "Sí - Només els subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
641
 
644
  #: adminpages/advancedsettings.php:120
645
  #: adminpages/advancedsettings.php:210
646
  #: adminpages/advancedsettings.php:212
647
+ #: adminpages/advancedsettings.php:219
648
  msgid "Show Excerpts to Non-Members?"
649
  msgstr "Mostrar extractes als no membres?"
650
 
653
  #: adminpages/advancedsettings.php:124
654
  #: adminpages/advancedsettings.php:214
655
  #: adminpages/advancedsettings.php:216
656
+ #: adminpages/advancedsettings.php:223
657
  msgid "No - Hide excerpts."
658
  msgstr "No - Amaga extractes."
659
 
662
  #: adminpages/advancedsettings.php:125
663
  #: adminpages/advancedsettings.php:215
664
  #: adminpages/advancedsettings.php:217
665
+ #: adminpages/advancedsettings.php:224
666
  msgid "Yes - Show excerpts."
667
  msgstr "Sí - Mostra extractes."
668
 
669
  #: adminpages/advancedsettings.php:144
670
  #: adminpages/advancedsettings.php:333
671
  #: adminpages/advancedsettings.php:348
672
+ #: adminpages/advancedsettings.php:355
673
  msgid "Hide Ads From Members?"
674
  msgstr "Amaga els anuncis als subscriptors?"
675
 
735
  #: adminpages/advancedsettings.php:494
736
  #: classes/gateways/class.pmprogateway_stripe.php:404
737
  #: classes/gateways/class.pmprogateway_stripe.php:418
738
+ #: adminpages/paymentsettings.php:279
739
+ #: adminpages/advancedsettings.php:254
740
+ #: adminpages/advancedsettings.php:267
741
+ #: adminpages/advancedsettings.php:359
742
+ #: adminpages/advancedsettings.php:418
743
+ #: adminpages/advancedsettings.php:526
744
+ #: adminpages/membershiplevels.php:939
745
+ #: adminpages/paymentsettings.php:277
746
+ #: classes/gateways/class.pmprogateway_stripe.php:430
747
+ #: classes/gateways/class.pmprogateway_stripe.php:444
748
+ #: includes/profile.php:78
749
  msgid "No"
750
  msgstr "No"
751
 
754
  #: adminpages/advancedsettings.php:136
755
  #: adminpages/advancedsettings.php:338
756
  #: adminpages/advancedsettings.php:353
757
+ #: adminpages/advancedsettings.php:360
758
  msgid "Hide Ads From All Members"
759
  msgstr "Amaga Anuncis de tots els subscriptors"
760
 
763
  #: adminpages/advancedsettings.php:137
764
  #: adminpages/advancedsettings.php:339
765
  #: adminpages/advancedsettings.php:354
766
+ #: adminpages/advancedsettings.php:361
767
  msgid "Hide Ads From Certain Members"
768
  msgstr "Amaga els anuncis a certs subscriptors"
769
 
778
  #: adminpages/advancedsettings.php:145
779
  #: adminpages/advancedsettings.php:346
780
  #: adminpages/advancedsettings.php:361
781
+ #: adminpages/advancedsettings.php:368
782
  msgid "To hide ads in your template code, use code like the following"
783
  msgstr "Per amagar els anuncis al codi de la plantilla, utilitzeu el codi següent"
784
 
787
  #: adminpages/advancedsettings.php:156
788
  #: adminpages/advancedsettings.php:355
789
  #: adminpages/advancedsettings.php:370
790
+ #: adminpages/advancedsettings.php:377
791
  msgid "Choose Levels to Hide Ads From"
792
  msgstr "Escull els nivells on amagar els anuncis"
793
 
806
  #: adminpages/advancedsettings.php:390
807
  #: adminpages/advancedsettings.php:392
808
  #: adminpages/advancedsettings.php:407
809
+ #: adminpages/advancedsettings.php:414
810
  msgid "multisite only"
811
  msgstr "només “multisite”"
812
 
861
  #: adminpages/advancedsettings.php:412
862
  #: classes/gateways/class.pmprogateway_stripe.php:406
863
  #: classes/gateways/class.pmprogateway_stripe.php:420
864
+ #: adminpages/paymentsettings.php:280
865
+ #: adminpages/advancedsettings.php:419
866
+ #: adminpages/membershiplevels.php:934
867
+ #: adminpages/paymentsettings.php:278
868
+ #: classes/gateways/class.pmprogateway_stripe.php:432
869
+ #: classes/gateways/class.pmprogateway_stripe.php:446
870
+ #: includes/profile.php:79
871
  msgid "Yes"
872
  msgstr "Sí"
873
 
876
  #: adminpages/advancedsettings.php:202
877
  #: adminpages/advancedsettings.php:241
878
  #: adminpages/advancedsettings.php:256
879
+ #: adminpages/advancedsettings.php:263
880
  msgid "Use reCAPTCHA?"
881
  msgstr "Utilitzar reCAPTCHA?"
882
 
892
  #: adminpages/advancedsettings.php:208
893
  #: adminpages/advancedsettings.php:247
894
  #: adminpages/advancedsettings.php:262
895
+ #: adminpages/advancedsettings.php:269
896
  msgid "Yes - All memberships."
897
  msgstr "Sí - Tots els subscriptors"
898
 
901
  #: adminpages/advancedsettings.php:210
902
  #: adminpages/advancedsettings.php:249
903
  #: adminpages/advancedsettings.php:264
904
+ #: adminpages/advancedsettings.php:271
905
  msgid "A free reCAPTCHA key is required."
906
  msgstr "Una clau reCAPTCHA gratuïta és necessària"
907
 
910
  #: adminpages/advancedsettings.php:210
911
  #: adminpages/advancedsettings.php:249
912
  #: adminpages/advancedsettings.php:264
913
+ #: adminpages/advancedsettings.php:271
914
  msgid "Click here to signup for reCAPTCHA"
915
  msgstr "Clica aquí per a signar per al reCAPTCHA"
916
 
967
  #: adminpages/advancedsettings.php:542
968
  #: adminpages/pagesettings.php:508
969
  #: adminpages/pagesettings.php:512
970
+ #: adminpages/paymentsettings.php:316
971
+ #: adminpages/advancedsettings.php:574
972
+ #: adminpages/pagesettings.php:511
973
+ #: adminpages/paymentsettings.php:314
974
  msgid "Save Settings"
975
  msgstr "Desa la configuració"
976
 
1046
  #: adminpages/discountcodes.php:796
1047
  #: adminpages/discountcodes.php:354
1048
  #: adminpages/discountcodes.php:798
1049
+ #: adminpages/discountcodes.php:799
1050
  msgid "Code not found."
1051
  msgstr "No s’ha trobat el codi."
1052
 
1069
  #: adminpages/discountcodes.php:735
1070
  #: adminpages/discountcodes.php:377
1071
  #: adminpages/discountcodes.php:737
1072
+ #: adminpages/discountcodes.php:738
1073
  msgid "Add New Discount Code"
1074
  msgstr "Afegeix un nou codi de descompte"
1075
 
1116
  #: adminpages/discountcodes.php:446
1117
  #: adminpages/discountcodes.php:785
1118
  #: adminpages/orders.php:1331
1119
+ #: adminpages/orders.php:1332
1120
+ #: adminpages/reports/login.php:182
1121
+ #: adminpages/templates/orders-email.php:49
1122
+ #: adminpages/templates/orders-print.php:78
1123
+ #: adminpages/membershiplevels.php:345
1124
+ #: adminpages/membershiplevels.php:805
1125
  msgid "ID"
1126
  msgstr "ID"
1127
 
1136
  #: adminpages/orders.php:415
1137
  #: adminpages/orders.php:421
1138
  #: adminpages/discountcodes.php:447
1139
+ #: adminpages/orders.php:422
1140
  msgid "This will be generated when you save."
1141
  msgstr "Es generarà quan salvis."
1142
 
1168
  #: adminpages/discountcodes.php:786
1169
  #: adminpages/orders.php:1332
1170
  #: adminpages/dashboard.php:292
1171
+ #: adminpages/orders.php:429
1172
+ #: adminpages/orders.php:1333
1173
+ #: adminpages/discountcodes.php:787
1174
+ #: adminpages/orders.php:475
1175
+ #: adminpages/orders.php:1426
1176
  msgid "Code"
1177
  msgstr "Codi"
1178
 
1186
  #: adminpages/discountcodes.php:489
1187
  #: includes/profile.php:501
1188
  #: includes/profile.php:497
1189
+ #: includes/profile.php:537
1190
  msgid "Start Date"
1191
  msgstr "Data d’inici"
1192
 
1223
  #: classes/gateways/class.pmprogateway_stripe.php:1320
1224
  #: classes/gateways/class.pmprogateway_stripe.php:1326
1225
  #: classes/gateways/class.pmprogateway_stripe.php:785
1226
+ #: pages/billing.php:381
1227
+ #: classes/gateways/class.pmprogateway_braintree.php:486
1228
+ #: classes/gateways/class.pmprogateway_stripe.php:893
1229
  msgid "Expiration Date"
1230
  msgstr "Data final (d’expiració)"
1231
 
1240
  #: adminpages/discountcodes.php:787
1241
  #: adminpages/discountcodes.php:525
1242
  #: adminpages/discountcodes.php:789
1243
+ #: adminpages/discountcodes.php:790
1244
  msgid "Uses"
1245
  msgstr "Utilitza"
1246
 
1274
  #: adminpages/discountcodes.php:574
1275
  #: adminpages/membershiplevels.php:401
1276
  #: adminpages/discountcodes.php:576
1277
+ #: adminpages/membershiplevels.php:399
1278
  msgid "Initial Payment"
1279
  msgstr "Pagament inicial"
1280
 
1290
  #: adminpages/discountcodes.php:585
1291
  #: adminpages/membershiplevels.php:412
1292
  #: adminpages/discountcodes.php:587
1293
+ #: adminpages/membershiplevels.php:410
1294
  msgid "The initial amount collected at registration."
1295
  msgstr "El pagament inicial efectuat en el registre"
1296
 
1306
  #: adminpages/discountcodes.php:590
1307
  #: adminpages/membershiplevels.php:417
1308
  #: adminpages/discountcodes.php:592
1309
+ #: adminpages/membershiplevels.php:415
1310
  msgid "Recurring Subscription"
1311
  msgstr "Subscripció recurrent"
1312
 
1322
  #: adminpages/discountcodes.php:591
1323
  #: adminpages/membershiplevels.php:418
1324
  #: adminpages/discountcodes.php:593
1325
+ #: adminpages/membershiplevels.php:416
1326
  msgid "Check if this level has a recurring subscription payment."
1327
  msgstr "Clica si aquest nivell té un pagament de subscripció recurrent"
1328
 
1337
  #: adminpages/discountcodes.php:595
1338
  #: adminpages/membershiplevels.php:422
1339
  #: adminpages/discountcodes.php:597
1340
+ #: adminpages/membershiplevels.php:420
1341
  msgid "Billing Amount"
1342
  msgstr "Total a facturar"
1343
 
1375
  #: classes/gateways/class.pmprogateway_stripe.php:2641
1376
  #: classes/gateways/class.pmprogateway_stripe.php:2637
1377
  #: classes/gateways/class.pmprogateway_stripe.php:2639
1378
+ #: classes/gateways/class.pmprogateway_stripe.php:2635
1379
+ #: adminpages/discountcodes.php:700
1380
+ #: adminpages/membershiplevels.php:435
1381
+ #: adminpages/membershiplevels.php:581
1382
+ #: classes/gateways/class.pmprogateway_stripe.php:3092
1383
  msgid "Day(s)"
1384
  msgstr "Dia(es)"
1385
 
1417
  #: classes/gateways/class.pmprogateway_stripe.php:2643
1418
  #: classes/gateways/class.pmprogateway_stripe.php:2639
1419
  #: classes/gateways/class.pmprogateway_stripe.php:2641
1420
+ #: classes/gateways/class.pmprogateway_stripe.php:2637
1421
+ #: adminpages/discountcodes.php:700
1422
+ #: adminpages/membershiplevels.php:435
1423
+ #: adminpages/membershiplevels.php:581
1424
+ #: classes/gateways/class.pmprogateway_stripe.php:3094
1425
  msgid "Month(s)"
1426
  msgstr "Mes(os)"
1427
 
1459
  #: classes/gateways/class.pmprogateway_stripe.php:2642
1460
  #: classes/gateways/class.pmprogateway_stripe.php:2638
1461
  #: classes/gateways/class.pmprogateway_stripe.php:2640
1462
+ #: classes/gateways/class.pmprogateway_stripe.php:2636
1463
+ #: adminpages/discountcodes.php:700
1464
+ #: adminpages/membershiplevels.php:435
1465
+ #: adminpages/membershiplevels.php:581
1466
+ #: classes/gateways/class.pmprogateway_stripe.php:3093
1467
  msgid "Week(s)"
1468
  msgstr "Setmana(es)"
1469
 
1501
  #: classes/gateways/class.pmprogateway_stripe.php:2644
1502
  #: classes/gateways/class.pmprogateway_stripe.php:2640
1503
  #: classes/gateways/class.pmprogateway_stripe.php:2642
1504
+ #: classes/gateways/class.pmprogateway_stripe.php:2638
1505
+ #: adminpages/discountcodes.php:700
1506
+ #: adminpages/membershiplevels.php:435
1507
+ #: adminpages/membershiplevels.php:581
1508
+ #: classes/gateways/class.pmprogateway_stripe.php:3095
1509
  msgid "Year(s)"
1510
  msgstr "Any(s)"
1511
 
1521
  #: adminpages/discountcodes.php:618
1522
  #: adminpages/membershiplevels.php:446
1523
  #: adminpages/discountcodes.php:620
1524
+ #: adminpages/membershiplevels.php:444
1525
  msgid "The amount to be billed one cycle after the initial payment."
1526
  msgstr "Total a facturar en un cicle després del pagament inicial"
1527
 
1537
  #: adminpages/discountcodes.php:628
1538
  #: adminpages/membershiplevels.php:465
1539
  #: adminpages/discountcodes.php:630
1540
+ #: adminpages/membershiplevels.php:463
1541
  msgid "Billing Cycle Limit"
1542
  msgstr "Límit de cicle de facturació"
1543
 
1553
  #: adminpages/discountcodes.php:632
1554
  #: adminpages/membershiplevels.php:469
1555
  #: adminpages/discountcodes.php:634
1556
+ #: adminpages/membershiplevels.php:467
1557
  msgid "The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite."
1558
  msgstr "El <strong>total</strong> de cicles de pagament recurrent per a aquest nivell, incloent el període de prova (si s’aplica) però sense incloure el pagament inicial. Deixa-ho a zero si la subscripció és infinita."
1559
 
1569
  #: adminpages/discountcodes.php:651
1570
  #: adminpages/membershiplevels.php:488
1571
  #: adminpages/discountcodes.php:653
1572
+ #: adminpages/discountcodes.php:654
1573
+ #: adminpages/membershiplevels.php:487
1574
  msgid "Custom Trial"
1575
  msgstr "Prova personalitzada"
1576
 
1587
  #: adminpages/discountcodes.php:653
1588
  #: adminpages/membershiplevels.php:490
1589
  #: adminpages/discountcodes.php:655
1590
+ #: adminpages/discountcodes.php:656
1591
+ #: adminpages/membershiplevels.php:489
1592
  msgid "Check to add a custom trial period."
1593
  msgstr "Clica per afegir un període de prova personalitzat."
1594
 
1605
  #: adminpages/discountcodes.php:661
1606
  #: adminpages/membershiplevels.php:510
1607
  #: adminpages/discountcodes.php:663
1608
+ #: adminpages/discountcodes.php:664
1609
  msgid "Trial Billing Amount"
1610
  msgstr "Facturació per al període de prova"
1611
 
1622
  #: adminpages/discountcodes.php:672
1623
  #: adminpages/membershiplevels.php:521
1624
  #: adminpages/discountcodes.php:674
1625
+ #: adminpages/discountcodes.php:675
1626
  msgid "for the first"
1627
  msgstr "per al primer"
1628
 
1639
  #: adminpages/discountcodes.php:674
1640
  #: adminpages/membershiplevels.php:523
1641
  #: adminpages/discountcodes.php:676
1642
+ #: adminpages/discountcodes.php:677
1643
  msgid "subscription payments"
1644
  msgstr "pagaments de subscripció"
1645
 
1657
  #: adminpages/discountcodes.php:686
1658
  #: adminpages/membershiplevels.php:559
1659
  #: adminpages/discountcodes.php:688
1660
+ #: adminpages/discountcodes.php:689
1661
  msgid "Membership Expiration"
1662
  msgstr "Venciment de la subscripció"
1663
 
1674
  #: adminpages/discountcodes.php:687
1675
  #: adminpages/membershiplevels.php:560
1676
  #: adminpages/discountcodes.php:689
1677
+ #: adminpages/discountcodes.php:690
1678
  msgid "Check this to set when membership access expires."
1679
  msgstr "Clica per afegir quan expira l’accés del subscriptor"
1680
 
1693
  #: adminpages/membershiplevels.php:575
1694
  #: pages/confirmation.php:140
1695
  #: adminpages/discountcodes.php:693
1696
+ #: adminpages/discountcodes.php:694
1697
+ #: adminpages/membershiplevels.php:576
1698
  msgid "Expires In"
1699
  msgstr "Expira En"
1700
 
1711
  #: adminpages/discountcodes.php:707
1712
  #: adminpages/membershiplevels.php:586
1713
  #: adminpages/discountcodes.php:709
1714
+ #: adminpages/discountcodes.php:710
1715
+ #: adminpages/membershiplevels.php:587
1716
  msgid "Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires."
1717
  msgstr "Indiqueu la durada de l’accés de subcriptors. Recordeu que qualsevol pagament futur (recurrent de subscripció, si escau) es cancel·larà quan la subscripció caduqui."
1718
 
1722
  #: adminpages/discountcodes.php:556
1723
  #: adminpages/discountcodes.php:734
1724
  #: adminpages/discountcodes.php:736
1725
+ #: adminpages/discountcodes.php:737
1726
  msgid "Memberships Discount Codes"
1727
  msgstr "Codis de descompte per a subscripcions"
1728
 
1732
  #: adminpages/discountcodes.php:566
1733
  #: adminpages/discountcodes.php:771
1734
  #: adminpages/discountcodes.php:773
1735
+ #: adminpages/discountcodes.php:768
1736
  msgid "Search Discount Codes"
1737
  msgstr "Cerca codis de descompte"
1738
 
1745
  #: adminpages/reports/login.php:83
1746
  #: adminpages/discountcodes.php:774
1747
  #: adminpages/discountcodes.php:776
1748
+ #: adminpages/discountcodes.php:771
1749
  msgid "Search"
1750
  msgstr "Cerca"
1751
 
1755
  #: adminpages/discountcodes.php:587
1756
  #: adminpages/discountcodes.php:785
1757
  #: adminpages/discountcodes.php:787
1758
+ #: adminpages/discountcodes.php:788
1759
  msgid "Starts"
1760
  msgstr "Comença"
1761
 
1784
  #: adminpages/discountcodes.php:788
1785
  #: includes/profile.php:65
1786
  #: adminpages/dashboard.php:228
1787
+ #: adminpages/reports/login.php:187
1788
+ #: adminpages/discountcodes.php:789
1789
+ #: includes/profile.php:75
1790
  msgid "Expires"
1791
  msgstr "Acaba"
1792
 
1797
  #: adminpages/admin_header.php:253
1798
  #: adminpages/discountcodes.php:788
1799
  #: adminpages/discountcodes.php:790
1800
+ #: adminpages/discountcodes.php:791
1801
  msgid "Levels"
1802
  msgstr "Nivells"
1803
 
1839
  #: adminpages/orders.php:1565
1840
  #: adminpages/orders.php:1564
1841
  #: adminpages/orders.php:1556
1842
+ #: adminpages/orders.php:1557
1843
+ #: adminpages/orders.php:1726
1844
  msgid "edit"
1845
  msgstr "Edita"
1846
 
1899
  #: adminpages/emailsettings.php:70
1900
  #: adminpages/emailsettings.php:61
1901
  #: adminpages/emailsettings.php:88
1902
+ #: adminpages/emailsettings.php:87
1903
  msgid "By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below."
1904
  msgstr "Per defecte, els correus electrònics generats són enviats desde <em><strong>wordpress@yourdomain.com</strong></em>. Pots modificar-ho utilitzant els camps que hi ha a continuació."
1905
 
1911
  #: adminpages/emailsettings.php:78
1912
  #: adminpages/emailsettings.php:69
1913
  #: adminpages/emailsettings.php:94
1914
+ #: adminpages/emailsettings.php:93
1915
  msgid "From Email"
1916
  msgstr "Del Correu Electrònic"
1917
 
1918
  #: adminpages/emailsettings.php:86
1919
  #: adminpages/emailsettings.php:77
1920
  #: adminpages/emailsettings.php:102
1921
+ #: adminpages/emailsettings.php:101
1922
  msgid "From Name"
1923
  msgstr "Del Nom"
1924
 
1925
  #: adminpages/emailsettings.php:94
1926
  #: adminpages/emailsettings.php:110
1927
+ #: adminpages/emailsettings.php:109
1928
  msgid "Only Filter PMPro Emails?"
1929
  msgstr "Filtra només els correus de PMPro?"
1930
 
1931
  #: adminpages/emailsettings.php:98
1932
  #: adminpages/emailsettings.php:114
1933
+ #: adminpages/emailsettings.php:113
1934
  #, php-format
1935
  msgid "If unchecked, all emails from \"WordPress &lt;%s&gt;\" will be filtered to use the above settings."
1936
  msgstr "Si no està clicat, tots els correus de \"WordPress &lt;%s&gt;\" seran filtrats per utilitzar la configuració de dalt."
2099
  #: adminpages/membershiplevels.php:808
2100
  #: adminpages/reports/history.php:184
2101
  #: adminpages/reports/login.php:181
2102
+ #: adminpages/reports/login.php:184
2103
+ #: adminpages/membershiplevels.php:352
2104
+ #: adminpages/membershiplevels.php:806
2105
  msgid "Name"
2106
  msgstr "Nom"
2107
 
2109
  #: adminpages/membershiplevels.php:314
2110
  #: adminpages/membershiplevels.php:316
2111
  #: adminpages/membershiplevels.php:377
2112
+ #: adminpages/membershiplevels.php:375
2113
  msgid "Confirmation Message"
2114
  msgstr "Missatge de confirmació"
2115
 
2123
  #: adminpages/membershiplevels.php:639
2124
  #: adminpages/membershiplevels.php:397
2125
  #: adminpages/membershiplevels.php:809
2126
+ #: adminpages/membershiplevels.php:395
2127
+ #: adminpages/membershiplevels.php:807
2128
  msgid "Billing Details"
2129
  msgstr "Detalls de facturació"
2130
 
2148
  #: classes/gateways/class.pmprogateway_stripe.php:2700
2149
  #: classes/gateways/class.pmprogateway_stripe.php:2696
2150
  #: classes/gateways/class.pmprogateway_stripe.php:2698
2151
+ #: classes/gateways/class.pmprogateway_stripe.php:2694
2152
+ #: adminpages/membershiplevels.php:431
2153
+ #: classes/gateways/class.pmprogateway_stripe.php:3151
2154
  msgid "per"
2155
  msgstr "per"
2156
 
2169
  #: adminpages/discountcodes.php:620
2170
  #: adminpages/membershiplevels.php:448
2171
  #: adminpages/discountcodes.php:622
2172
+ #: adminpages/membershiplevels.php:446
2173
  msgid "Braintree integration currently only supports billing periods of \"Month\" or \"Year\"."
2174
  msgstr "La integració de Braintree actualment només suporta períodes de facturació de “mes” o “any”."
2175
 
2187
  #: adminpages/membershiplevels.php:393
2188
  #: adminpages/membershiplevels.php:396
2189
  #: adminpages/membershiplevels.php:454
2190
+ #: adminpages/membershiplevels.php:452
2191
  msgid "After saving this level, make note of the ID and create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to <em>pmpro_#</em>, where # is the level ID."
2192
  msgstr "Després de salvar aquest nivell, anota’t la ID i crea un \"Plan\" al dashboard de Braintree amb la mateixa configuració i el \"Plan ID\" set to <em>pmpro_#</em>, on # és el level ID."
2193
 
2210
  #: adminpages/membershiplevels.php:454
2211
  #: adminpages/membershiplevels.php:459
2212
  #: classes/gateways/class.pmprogateway_cybersource.php:89
2213
+ #: adminpages/membershiplevels.php:452
2214
+ #: adminpages/membershiplevels.php:457
2215
  msgid "Note"
2216
  msgstr "Nota"
2217
 
2231
  #: adminpages/discountcodes.php:634
2232
  #: adminpages/membershiplevels.php:471
2233
  #: adminpages/discountcodes.php:636
2234
+ #: adminpages/membershiplevels.php:469
2235
  msgid "Stripe integration currently does not support billing limits. You can still set an expiration date below."
2236
  msgstr "La integració d’Stripe no suporta límits de facturació actualment. Pots posar una data de límit de facturació a sota."
2237
 
2243
  #: adminpages/discountcodes.php:655
2244
  #: adminpages/membershiplevels.php:493
2245
  #: adminpages/discountcodes.php:657
2246
+ #: adminpages/discountcodes.php:658
2247
+ #: adminpages/membershiplevels.php:492
2248
  msgid "2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount."
2249
  msgstr "La integració de 2Checkout no suporta proves personalitzades. Pots afegir un període de prova configurant un pagament inicial diferent del total de facturació."
2250
 
2257
  #: adminpages/discountcodes.php:676
2258
  #: adminpages/membershiplevels.php:525
2259
  #: adminpages/discountcodes.php:678
2260
+ #: adminpages/discountcodes.php:679
2261
  msgid "Stripe integration currently does not support trial amounts greater than $0."
2262
  msgstr "La integració d’Stripe no suporta preus de prova majors que $0."
2263
 
2270
  #: adminpages/discountcodes.php:678
2271
  #: adminpages/membershiplevels.php:527
2272
  #: adminpages/discountcodes.php:680
2273
+ #: adminpages/discountcodes.php:681
2274
  msgid "Braintree integration currently does not support trial amounts greater than $0."
2275
  msgstr "La integració de Braintree no suporta preus de prova majors que $0."
2276
 
2283
  #: adminpages/discountcodes.php:680
2284
  #: adminpages/membershiplevels.php:529
2285
  #: adminpages/discountcodes.php:682
2286
+ #: adminpages/discountcodes.php:683
2287
  msgid "Payflow integration currently does not support trial amounts greater than $0."
2288
  msgstr "La integració de Payflow no suporta preus de prova majors que $0."
2289
 
2298
  #: adminpages/dashboard.php:140
2299
  #: adminpages/membershiplevels.php:550
2300
  #: adminpages/advancedsettings.php:343
2301
+ #: adminpages/advancedsettings.php:350
2302
  msgid "Other Settings"
2303
  msgstr "Configuració, altres"
2304
 
2334
  #: adminpages/advancedsettings.php:194
2335
  #: adminpages/membershiplevels.php:624
2336
  #: adminpages/advancedsettings.php:196
2337
+ #: adminpages/advancedsettings.php:203
2338
+ #: adminpages/membershiplevels.php:625
2339
  msgid "Content Settings"
2340
  msgstr "Configuració de continguts"
2341
 
2347
  #: adminpages/membershiplevels.php:497
2348
  #: adminpages/membershiplevels.php:500
2349
  #: adminpages/membershiplevels.php:654
2350
+ #: adminpages/membershiplevels.php:655
2351
  msgid "Categories"
2352
  msgstr "Categories"
2353
 
2354
  #: adminpages/membershiplevels.php:516
2355
  #: adminpages/membershiplevels.php:517
2356
  #: adminpages/membershiplevels.php:674
2357
+ #: adminpages/membershiplevels.php:675
2358
  msgid "Save Level"
2359
  msgstr "Salva nivell"
2360
 
2389
  #: includes/profile.php:918
2390
  #: adminpages/orders.php:960
2391
  #: pages/billing.php:436
2392
+ #: adminpages/discountcodes.php:729
2393
+ #: adminpages/orders.php:961
2394
+ #: pages/billing.php:443
2395
+ #: adminpages/discountcodes.php:730
2396
+ #: adminpages/membershiplevels.php:676
2397
+ #: adminpages/orders.php:1044
2398
+ #: includes/profile.php:834
2399
+ #: includes/profile.php:958
2400
  msgid "Cancel"
2401
  msgstr "Cancel·la"
2402
 
2437
  #: adminpages/membershiplevels.php:579
2438
  #: adminpages/membershiplevels.php:631
2439
  #: adminpages/membershiplevels.php:797
2440
+ #: adminpages/membershiplevels.php:795
2441
  msgid "Drag and drop membership levels to reorder them on the Levels page."
2442
  msgstr "Arrossega i deixa anar els nivells de subscripció per a reordenar-los a la pàgina de nivells"
2443
 
2462
  #: pages/confirmation.php:99
2463
  #: pages/invoice.php:89
2464
  #: shortcodes/pmpro_account.php:44
2465
+ #: pages/billing.php:102
2466
+ #: adminpages/membershiplevels.php:808
2467
+ #: adminpages/orders.php:838
2468
  msgid "Expiration"
2469
  msgstr "Data final (d’expiració)"
2470
 
2477
  #: adminpages/membershiplevels.php:587
2478
  #: adminpages/membershiplevels.php:641
2479
  #: adminpages/membershiplevels.php:811
2480
+ #: adminpages/membershiplevels.php:809
2481
  msgid "Allow Signups"
2482
  msgstr "Permet nous “signups”"
2483
 
2491
  #: adminpages/membershiplevels.php:656
2492
  #: adminpages/membershiplevels.php:840
2493
  #: adminpages/membershiplevels.php:921
2494
+ #: adminpages/membershiplevels.php:919
2495
  msgid "FREE"
2496
  msgstr "GRATUÏT"
2497
 
2505
  #: adminpages/membershiplevels.php:665
2506
  #: adminpages/membershiplevels.php:849
2507
  #: adminpages/membershiplevels.php:930
2508
+ #: adminpages/membershiplevels.php:928
2509
  msgid "After"
2510
  msgstr "Després"
2511
 
2551
  #: includes/adminpages.php:149
2552
  #: includes/adminpages.php:153
2553
  #: adminpages/memberslist.php:20
2554
+ #: adminpages/memberslist.php:21
2555
  msgid "Members List"
2556
  msgstr "Llistat de subscriptors"
2557
 
2564
  #: adminpages/orders.php:994
2565
  #: adminpages/orders.php:1000
2566
  #: adminpages/orders.php:992
2567
+ #: adminpages/orders.php:993
2568
+ #: adminpages/memberslist.php:22
2569
+ #: adminpages/orders.php:1076
2570
  msgid "Export to CSV"
2571
  msgstr "Exporta a CSV"
2572
 
2594
  #: adminpages/orders.php:1012
2595
  #: adminpages/reports/sales.php:311
2596
  #: classes/class-pmpro-members-list-table.php:651
2597
+ #: adminpages/orders.php:1013
2598
+ #: classes/class-pmpro-members-list-table.php:657
2599
+ #: adminpages/orders.php:1101
2600
+ #: adminpages/reports/memberships.php:330
2601
  msgid "Show"
2602
  msgstr "Mostra"
2603
 
2624
  #: classes/class.pmproemail.php:195
2625
  #: classes/class.pmproemail.php:235
2626
  #: classes/class-pmpro-members-list-table.php:653
2627
+ #: adminpages/reports/login.php:106
2628
+ #: classes/class-pmpro-members-list-table.php:659
2629
+ #: adminpages/reports/login.php:112
2630
+ #: adminpages/reports/memberships.php:354
2631
  msgid "All Levels"
2632
  msgstr "Tots els nivells"
2633
 
2637
  #: classes/class-pmpro-members-list-table.php:234
2638
  #: classes/class-pmpro-members-list-table.php:634
2639
  #: classes/class-pmpro-members-list-table.php:663
2640
+ #: classes/class-pmpro-members-list-table.php:669
2641
  msgid "Cancelled Members"
2642
  msgstr "Subscriptors cancel·lats"
2643
 
2647
  #: classes/class-pmpro-members-list-table.php:235
2648
  #: classes/class-pmpro-members-list-table.php:635
2649
  #: classes/class-pmpro-members-list-table.php:664
2650
+ #: classes/class-pmpro-members-list-table.php:670
2651
  msgid "Expired Members"
2652
  msgstr "Subscriptors “expirats”"
2653
 
2658
  #: classes/class-pmpro-members-list-table.php:236
2659
  #: classes/class-pmpro-members-list-table.php:636
2660
  #: classes/class-pmpro-members-list-table.php:665
2661
+ #: classes/class-pmpro-members-list-table.php:671
2662
  msgid "Old Members"
2663
  msgstr "Subscriptors antics"
2664
 
2670
  #: adminpages/memberslist.php:28
2671
  #: adminpages/reports/history.php:115
2672
  #: adminpages/reports/history.php:119
2673
+ #: adminpages/reports/login.php:127
2674
+ #: adminpages/memberslist.php:27
2675
+ #: adminpages/reports/login.php:106
2676
  msgid "Search Members"
2677
  msgstr "Cerca Subscriptors"
2678
 
2710
  #: adminpages/dashboard.php:223
2711
  #: adminpages/dashboard.php:225
2712
  #: classes/class.memberorder.php:1003
2713
+ #: adminpages/reports/login.php:183
2714
+ #: adminpages/emailtemplates.php:122
2715
+ #: classes/class.memberorder.php:1012
2716
  msgid "Username"
2717
  msgstr "Nom d’usuari"
2718
 
2755
  #: pages/checkout.php:230
2756
  #: pages/confirmation.php:78
2757
  #: pages/invoice.php:68
2758
+ #: pages/billing.php:162
2759
+ #: adminpages/orders.php:568
2760
  msgid "Billing Address"
2761
  msgstr "Adreça de Facturació"
2762
 
2792
  #: adminpages/reports/login.php:183
2793
  #: adminpages/dashboard.php:225
2794
  #: adminpages/dashboard.php:227
2795
+ #: adminpages/reports/login.php:186
2796
  msgid "Joined"
2797
  msgstr "Afegit"
2798
 
2816
  #: adminpages/dashboard.php:232
2817
  #: classes/class-pmpro-members-list-table.php:225
2818
  #: adminpages/dashboard.php:234
2819
+ #: adminpages/reports/login.php:266
2820
  msgid "No members found."
2821
  msgstr "No s’han trobat subscriptors"
2822
 
2831
  #: adminpages/reports/login.php:263
2832
  #: classes/class-pmpro-members-list-table.php:228
2833
  #: classes/class-pmpro-members-list-table.php:227
2834
+ #: adminpages/reports/login.php:266
2835
  msgid "Search all levels"
2836
  msgstr "Cerca a tots els nivells"
2837
 
2858
  #: adminpages/orders.php:72
2859
  #: adminpages/orders.php:164
2860
  #: adminpages/orders.php:170
2861
+ #: adminpages/orders.php:171
2862
  msgid "Error deleting order."
2863
  msgstr "Error esborrant comanda."
2864
 
2867
  #: adminpages/orders.php:169
2868
  #: adminpages/orders.php:309
2869
  #: adminpages/orders.php:315
2870
+ #: adminpages/orders.php:316
2871
+ #: adminpages/orders.php:342
2872
  msgid "Order saved successfully."
2873
  msgstr "Comanda salvada correctament."
2874
 
2883
  #: adminpages/orders.php:180
2884
  #: adminpages/orders.php:312
2885
  #: adminpages/orders.php:318
2886
+ #: adminpages/orders.php:319
2887
+ #: adminpages/orders.php:345
2888
  msgid "Error saving order."
2889
  msgstr "Error guardant la comanda."
2890
 
2897
  #: classes/class.memberorder.php:963
2898
  #: adminpages/orders.php:389
2899
  #: classes/class.memberorder.php:1005
2900
+ #: adminpages/orders.php:390
2901
+ #: classes/class.memberorder.php:1014
2902
  msgid "Order"
2903
  msgstr "Comanda"
2904
 
2908
  #: adminpages/orders.php:348
2909
  #: adminpages/orders.php:387
2910
  #: adminpages/orders.php:393
2911
+ #: adminpages/orders.php:394
2912
+ #: adminpages/orders.php:454
2913
  msgid "New Order"
2914
  msgstr "Nova comanda"
2915
 
2919
  #: adminpages/orders.php:371
2920
  #: adminpages/orders.php:433
2921
  #: adminpages/orders.php:439
2922
+ #: adminpages/orders.php:440
2923
+ #: adminpages/orders.php:487
2924
  msgid "Randomly generated for you."
2925
  msgstr "Generat aleatoriament per a tu"
2926
 
2930
  #: adminpages/orders.php:376
2931
  #: adminpages/orders.php:438
2932
  #: adminpages/orders.php:444
2933
+ #: adminpages/orders.php:445
2934
+ #: adminpages/orders.php:539
2935
  msgid "User ID"
2936
  msgstr "ID d’usuari"
2937
 
2942
  #: adminpages/emailtemplates.php:130
2943
  #: adminpages/orders.php:451
2944
  #: adminpages/orders.php:457
2945
+ #: adminpages/orders.php:458
2946
+ #: adminpages/emailtemplates.php:125
2947
+ #: adminpages/orders.php:552
2948
  msgid "Membership Level ID"
2949
  msgstr "ID del Nivell de subscripció"
2950
 
2955
  #: adminpages/orders.php:464
2956
  #: includes/privacy.php:245
2957
  #: adminpages/orders.php:470
2958
+ #: adminpages/orders.php:471
2959
+ #: adminpages/orders.php:576
2960
  msgid "Billing Name"
2961
  msgstr "Nom de Facturació"
2962
 
2967
  #: adminpages/orders.php:478
2968
  #: includes/privacy.php:249
2969
  #: adminpages/orders.php:484
2970
+ #: adminpages/orders.php:485
2971
+ #: adminpages/orders.php:590
2972
  msgid "Billing Street"
2973
  msgstr "Adreça de Facturació"
2974
 
2981
  #: includes/privacy.php:358
2982
  #: adminpages/orders.php:497
2983
  #: adminpages/orders.php:496
2984
+ #: adminpages/orders.php:602
2985
  msgid "Billing City"
2986
  msgstr "Ciutat de Facturació"
2987
 
2993
  #: includes/privacy.php:257
2994
  #: adminpages/orders.php:510
2995
  #: adminpages/orders.php:509
2996
+ #: adminpages/orders.php:615
2997
  msgid "Billing State"
2998
  msgstr "Provincia de Facturació"
2999
 
3006
  #: includes/privacy.php:360
3007
  #: adminpages/orders.php:523
3008
  #: adminpages/orders.php:521
3009
+ #: adminpages/orders.php:522
3010
+ #: adminpages/orders.php:627
3011
  msgid "Billing Postal Code"
3012
  msgstr "Codi postal de Facturació"
3013
 
3020
  #: includes/privacy.php:362
3021
  #: adminpages/orders.php:536
3022
  #: adminpages/orders.php:533
3023
+ #: adminpages/orders.php:534
3024
+ #: adminpages/orders.php:639
3025
  msgid "Billing Country"
3026
  msgstr "País de Facturació"
3027
 
3033
  #: includes/privacy.php:269
3034
  #: adminpages/orders.php:550
3035
  #: adminpages/orders.php:546
3036
+ #: adminpages/orders.php:547
3037
+ #: adminpages/orders.php:652
3038
  msgid "Billing Phone"
3039
  msgstr "Telèfon de Facturació"
3040
 
3046
  #: includes/privacy.php:273
3047
  #: adminpages/orders.php:602
3048
  #: adminpages/orders.php:597
3049
+ #: adminpages/orders.php:598
3050
+ #: adminpages/orders.php:719
3051
  msgid "Sub Total"
3052
  msgstr "Subtotal"
3053
 
3065
  #: adminpages/orders.php:615
3066
  #: includes/functions.php:2880
3067
  #: adminpages/orders.php:610
3068
+ #: adminpages/orders.php:611
3069
+ #: includes/functions.php:2902
3070
+ #: adminpages/orders.php:732
3071
+ #: includes/functions.php:2904
3072
  msgid "Tax"
3073
  msgstr "Impost"
3074
 
3080
  #: includes/privacy.php:281
3081
  #: adminpages/orders.php:632
3082
  #: adminpages/orders.php:627
3083
+ #: adminpages/orders.php:628
3084
+ #: adminpages/orders.php:749
3085
  msgid "Coupon Amount"
3086
  msgstr "Valor del cupó"
3087
 
3110
  #: adminpages/orders.php:645
3111
  #: adminpages/orders.php:1336
3112
  #: adminpages/dashboard.php:295
3113
+ #: adminpages/orders.php:646
3114
+ #: adminpages/orders.php:1337
3115
+ #: includes/functions.php:2931
3116
+ #: adminpages/orders.php:767
3117
+ #: adminpages/orders.php:1430
3118
+ #: includes/functions.php:2933
3119
  msgid "Total"
3120
  msgstr "Total"
3121
 
3134
  #: includes/privacy.php:289
3135
  #: adminpages/orders.php:664
3136
  #: adminpages/orders.php:659
3137
+ #: adminpages/orders.php:660
3138
+ #: adminpages/orders.php:781
3139
  msgid "Payment Type"
3140
  msgstr "Tipus de pagament"
3141
 
3146
  #: adminpages/orders.php:669
3147
  #: adminpages/orders.php:675
3148
  #: adminpages/orders.php:670
3149
+ #: adminpages/orders.php:671
3150
+ #: adminpages/orders.php:792
3151
  msgid "e.g. PayPal Express, PayPal Standard, Credit Card."
3152
  msgstr "Per exemple PayPal Express, PayPal Standard, Tarja de crèdit"
3153
 
3186
  #: classes/gateways/class.pmprogateway_stripe.php:1309
3187
  #: adminpages/orders.php:674
3188
  #: classes/gateways/class.pmprogateway_stripe.php:768
3189
+ #: adminpages/orders.php:675
3190
+ #: pages/billing.php:338
3191
+ #: adminpages/orders.php:796
3192
+ #: classes/gateways/class.pmprogateway_braintree.php:473
3193
+ #: classes/gateways/class.pmprogateway_stripe.php:876
3194
  msgid "Card Type"
3195
  msgstr "Tipus de targeta"
3196
 
3201
  #: adminpages/orders.php:683
3202
  #: adminpages/orders.php:689
3203
  #: adminpages/orders.php:684
3204
+ #: adminpages/orders.php:685
3205
+ #: adminpages/orders.php:806
3206
  msgid "e.g. Visa, MasterCard, AMEX, etc"
3207
  msgstr "Per exemple Visa, MasterCard, AMEX, etc"
3208
 
3220
  #: includes/privacy.php:297
3221
  #: adminpages/orders.php:693
3222
  #: adminpages/orders.php:688
3223
+ #: adminpages/orders.php:689
3224
+ #: adminpages/orders.php:810
3225
+ #: classes/gateways/class.pmprogateway_twocheckout.php:145
3226
  msgid "Account Number"
3227
  msgstr "Nombre de Compte"
3228
 
3232
  #: adminpages/orders.php:504
3233
  #: adminpages/orders.php:698
3234
  #: adminpages/orders.php:704
3235
+ #: adminpages/orders.php:699
3236
+ #: adminpages/orders.php:820
3237
  msgid "Obscure all but last 4 digits."
3238
  msgstr "Tot amagat menys els últims 4 dígits"
3239
 
3246
  #: includes/privacy.php:301
3247
  #: adminpages/orders.php:713
3248
  #: adminpages/orders.php:724
3249
+ #: adminpages/orders.php:708
3250
+ #: adminpages/orders.php:719
3251
+ #: adminpages/orders.php:829
3252
  msgid "Expiration Month"
3253
  msgstr "Mes de finalització/expiració"
3254
 
3259
  #: adminpages/orders.php:726
3260
  #: includes/privacy.php:305
3261
  #: adminpages/orders.php:732
3262
+ #: adminpages/orders.php:727
3263
  msgid "Expiration Year"
3264
  msgstr "Any de finalització/expiració"
3265
 
3290
  #: adminpages/orders.php:735
3291
  #: adminpages/orders.php:1340
3292
  #: adminpages/dashboard.php:296
3293
+ #: adminpages/orders.php:1341
3294
+ #: adminpages/orders.php:849
3295
+ #: adminpages/orders.php:1434
3296
+ #: includes/profile.php:455
3297
+ #: includes/profile.php:541
3298
  msgid "Status"
3299
  msgstr "Estat"
3300
 
3316
  #: adminpages/orders.php:757
3317
  #: adminpages/orders.php:1338
3318
  #: classes/class.memberorder.php:1006
3319
+ #: adminpages/orders.php:1339
3320
+ #: adminpages/orders.php:876
3321
+ #: adminpages/orders.php:1432
3322
+ #: classes/class.memberorder.php:1015
3323
  msgid "Gateway"
3324
  msgstr "Passarel·la"
3325
 
3337
  #: includes/privacy.php:317
3338
  #: adminpages/orders.php:787
3339
  #: adminpages/orders.php:780
3340
+ #: adminpages/paymentsettings.php:155
3341
+ #: adminpages/orders.php:899
3342
+ #: adminpages/paymentsettings.php:153
3343
  msgid "Gateway Environment"
3344
  msgstr "Entorn de passarel·la"
3345
 
3359
  #: classes/class-pmpro-site-health.php:206
3360
  #: adminpages/orders.php:788
3361
  #: classes/class-pmpro-site-health.php:210
3362
+ #: adminpages/paymentsettings.php:159
3363
+ #: classes/class-pmpro-site-health.php:213
3364
+ #: adminpages/orders.php:907
3365
+ #: adminpages/paymentsettings.php:157
3366
+ #: classes/class-pmpro-site-health.php:217
3367
  msgid "Sandbox/Testing"
3368
  msgstr "Sandbox/Proves"
3369
 
3383
  #: classes/class-pmpro-site-health.php:207
3384
  #: adminpages/orders.php:789
3385
  #: classes/class-pmpro-site-health.php:211
3386
+ #: adminpages/paymentsettings.php:160
3387
+ #: classes/class-pmpro-site-health.php:214
3388
+ #: adminpages/orders.php:908
3389
+ #: adminpages/paymentsettings.php:158
3390
+ #: classes/class-pmpro-site-health.php:218
3391
  msgid "Live/Production"
3392
  msgstr "Live/Producció"
3393
 
3400
  #: includes/privacy.php:321
3401
  #: adminpages/orders.php:804
3402
  #: adminpages/orders.php:797
3403
+ #: adminpages/orders.php:916
3404
  msgid "Payment Transaction ID"
3405
  msgstr "ID de la transacció de pagament"
3406
 
3412
  #: adminpages/orders.php:808
3413
  #: adminpages/orders.php:814
3414
  #: adminpages/orders.php:807
3415
+ #: adminpages/orders.php:926
3416
  msgid "Generated by the gateway. Useful to cross reference orders."
3417
  msgstr "Generat per la passarel·la. Útil per a comandes de referències creuades."
3418
 
3427
  #: adminpages/orders.php:819
3428
  #: adminpages/orders.php:812
3429
  #: classes/class.memberorder.php:1007
3430
+ #: adminpages/orders.php:931
3431
+ #: classes/class.memberorder.php:1016
3432
  msgid "Subscription Transaction ID"
3433
  msgstr "ID de la transacció per a subscripció"
3434
 
3440
  #: adminpages/orders.php:824
3441
  #: adminpages/orders.php:830
3442
  #: adminpages/orders.php:822
3443
+ #: adminpages/orders.php:823
3444
+ #: adminpages/orders.php:942
3445
  msgid "Generated by the gateway. Useful to cross reference subscriptions."
3446
  msgstr "Generat per la passarel·la. Útil per a subscripcions de referències creuades."
3447
 
3473
  #: adminpages/orders.php:827
3474
  #: adminpages/orders.php:1341
3475
  #: adminpages/dashboard.php:297
3476
+ #: adminpages/orders.php:828
3477
+ #: adminpages/orders.php:1342
3478
+ #: adminpages/orders.php:1435
3479
+ #: includes/profile.php:449
3480
  msgid "Date"
3481
  msgstr "Data"
3482
 
3487
  #: adminpages/orders.php:874
3488
  #: adminpages/orders.php:880
3489
  #: adminpages/orders.php:872
3490
+ #: adminpages/orders.php:873
3491
+ #: adminpages/orders.php:956
3492
  msgid "Affiliate ID"
3493
  msgstr "ID de subscripció"
3494
 
3499
  #: adminpages/orders.php:887
3500
  #: adminpages/orders.php:893
3501
  #: adminpages/orders.php:885
3502
+ #: adminpages/orders.php:886
3503
+ #: adminpages/orders.php:969
3504
  msgid "Affiliate SubID"
3505
  msgstr "SubID de subscripció"
3506
 
3511
  #: adminpages/orders.php:923
3512
  #: adminpages/orders.php:929
3513
  #: adminpages/orders.php:921
3514
+ #: adminpages/orders.php:922
3515
+ #: adminpages/orders.php:1005
3516
  msgid "Notes"
3517
  msgstr "Notes"
3518
 
3523
  #: adminpages/orders.php:961
3524
  #: adminpages/orders.php:967
3525
  #: adminpages/orders.php:959
3526
+ #: adminpages/orders.php:960
3527
+ #: adminpages/orders.php:1043
3528
  msgid "Save Order"
3529
  msgstr "Salva Comanda"
3530
 
3569
  #: adminpages/discountcodes.php:884
3570
  #: classes/class-pmpro-site-health.php:77
3571
  #: adminpages/orders.php:970
3572
+ #: adminpages/orders.php:971
3573
+ #: adminpages/discountcodes.php:889
3574
+ #: adminpages/orders.php:1054
3575
  msgid "Orders"
3576
  msgstr "Comandes"
3577
 
3582
  #: adminpages/orders.php:973
3583
  #: adminpages/orders.php:979
3584
  #: adminpages/orders.php:971
3585
+ #: adminpages/orders.php:972
3586
+ #: adminpages/orders.php:1055
3587
  msgid "Add New Order"
3588
  msgstr "Afegeix nova comanda"
3589
 
3593
  #: adminpages/orders.php:1018
3594
  #: adminpages/orders.php:1024
3595
  #: adminpages/orders.php:1016
3596
+ #: adminpages/orders.php:1017
3597
+ #: adminpages/orders.php:1105
3598
  msgid "Within a Date Range"
3599
  msgstr "Dins del període"
3600
 
3604
  #: adminpages/orders.php:1020
3605
  #: adminpages/orders.php:1026
3606
  #: adminpages/orders.php:1018
3607
+ #: adminpages/orders.php:1019
3608
+ #: adminpages/orders.php:1107
3609
  msgid "Predefined Date Range"
3610
  msgstr "Període predefinit"
3611
 
3615
  #: adminpages/orders.php:1022
3616
  #: adminpages/orders.php:1028
3617
  #: adminpages/orders.php:1020
3618
+ #: adminpages/orders.php:1021
3619
+ #: adminpages/orders.php:1109
3620
  msgid "Within a Level"
3621
  msgstr "Dins del nivell"
3622
 
3626
  #: adminpages/orders.php:1026
3627
  #: adminpages/orders.php:1032
3628
  #: adminpages/orders.php:1024
3629
+ #: adminpages/orders.php:1025
3630
+ #: adminpages/orders.php:1113
3631
  msgid "Within a Status"
3632
  msgstr "Dins de l’”Status”"
3633
 
3637
  #: adminpages/orders.php:1038
3638
  #: adminpages/orders.php:1044
3639
  #: adminpages/orders.php:1036
3640
+ #: adminpages/orders.php:1037
3641
+ #: adminpages/orders.php:1125
3642
  msgid "From"
3643
  msgstr "De"
3644
 
3648
  #: adminpages/orders.php:1053
3649
  #: adminpages/orders.php:1059
3650
  #: adminpages/orders.php:1051
3651
+ #: adminpages/orders.php:1052
3652
+ #: adminpages/orders.php:1140
3653
  msgid "To"
3654
  msgstr "per a "
3655
 
3659
  #: adminpages/orders.php:1066
3660
  #: adminpages/orders.php:1072
3661
  #: adminpages/orders.php:1064
3662
+ #: adminpages/orders.php:1065
3663
+ #: adminpages/orders.php:1153
3664
  msgid "filter by "
3665
  msgstr "filtrat per"
3666
 
3670
  #: adminpages/orders.php:1116
3671
  #: adminpages/orders.php:1122
3672
  #: adminpages/orders.php:1114
3673
+ #: adminpages/orders.php:1115
3674
+ #: adminpages/orders.php:1203
3675
  msgid "Filter"
3676
  msgstr "Filtre"
3677
 
3689
  #: adminpages/orders.php:1259
3690
  #: adminpages/orders.php:1248
3691
  #: adminpages/orders.php:1251
3692
+ #: adminpages/orders.php:1249
3693
+ #: adminpages/orders.php:1252
3694
+ #: adminpages/orders.php:1094
3695
+ #: adminpages/orders.php:1097
3696
  msgid "Search Orders"
3697
  msgstr "Cerca Comandes"
3698
 
3704
  #: adminpages/orders.php:1326
3705
  #: adminpages/orders.php:1332
3706
  #: adminpages/orders.php:1324
3707
+ #: adminpages/orders.php:1325
3708
+ #: adminpages/orders.php:1405
3709
+ #: adminpages/orders.php:1752
3710
  #, php-format
3711
  msgid "%d orders found."
3712
  msgstr "%d comandes no trobades"
3730
  #: adminpages/orders.php:1341
3731
  #: adminpages/orders.php:1333
3732
  #: adminpages/dashboard.php:293
3733
+ #: adminpages/orders.php:1334
3734
+ #: adminpages/orders.php:1427
3735
  msgid "User"
3736
  msgstr "Usuari"
3737
 
3775
  #: js/blocks.build.js:798
3776
  #: js/blocks.build.js:1004
3777
  #: js/blocks.build.js:1086
3778
+ #: blocks/checkout-button/block.js:76
3779
+ #: blocks/checkout-page/block.js:62
3780
  msgid "Membership Level"
3781
  msgstr "Nivell de subscripció"
3782
 
3796
  #: adminpages/orders.php:1539
3797
  #: adminpages/orders.php:1337
3798
  #: adminpages/orders.php:1531
3799
+ #: adminpages/orders.php:1338
3800
+ #: adminpages/orders.php:1532
3801
+ #: adminpages/orders.php:1684
3802
  msgid "Payment"
3803
  msgstr "Pagament"
3804
 
3810
  #: adminpages/orders.php:1341
3811
  #: adminpages/orders.php:1347
3812
  #: adminpages/orders.php:1339
3813
+ #: adminpages/orders.php:1340
3814
+ #: adminpages/orders.php:1433
3815
  msgid "Transaction IDs"
3816
  msgstr "IDs de transacció"
3817
 
3833
  #: adminpages/orders.php:1487
3834
  #: adminpages/dashboard.php:321
3835
  #: adminpages/dashboard.php:336
3836
+ #: adminpages/orders.php:1476
3837
+ #: adminpages/orders.php:1488
3838
+ #: adminpages/orders.php:1600
3839
+ #: adminpages/orders.php:1612
3840
  msgid "deleted"
3841
  msgstr "esborrat"
3842
 
3849
  #: adminpages/orders.php:1471
3850
  #: adminpages/orders.php:1548
3851
  #: adminpages/orders.php:1540
3852
+ #: adminpages/orders.php:1541
3853
+ #: adminpages/orders.php:1693
3854
  msgid "Subscription"
3855
  msgstr "Subscripció"
3856
 
3865
  #: adminpages/orders.php:1372
3866
  #: adminpages/orders.php:1375
3867
  #: adminpages/orders.php:1367
3868
+ #: adminpages/orders.php:1368
3869
+ #: adminpages/orders.php:1457
3870
  #, php-format
3871
  msgid "Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?"
3872
  msgstr "Esborra comandes és permanent i pot afectar usuaris actius. Estàs segur que vols esborrar la comanda %s?"
3895
  #: adminpages/orders.php:1576
3896
  #: adminpages/orders.php:1568
3897
  #: adminpages/dashboard.php:304
3898
+ #: adminpages/orders.php:1569
3899
+ #: adminpages/orders.php:1741
3900
  msgid "No orders found."
3901
  msgstr "No s’han trobat comandes"
3902
 
3969
  #: adminpages/pagesettings.php:167
3970
  #: adminpages/pagesettings.php:182
3971
  #: adminpages/pagesettings.php:186
3972
+ #: adminpages/pagesettings.php:185
3973
  msgid "Manage the WordPress pages assigned to each required Paid Memberships Pro page."
3974
  msgstr "Utilitza les pàgines de WordPress a cadascuna de les pàgines requerides per al Paid Memberships Pro"
3975
 
3979
  #: adminpages/pagesettings.php:169
3980
  #: adminpages/pagesettings.php:184
3981
  #: adminpages/pagesettings.php:188
3982
+ #: adminpages/pagesettings.php:187
3983
  msgid "Assign the WordPress pages for each required Paid Memberships Pro page or"
3984
  msgstr "Assigna pàgines al WordPress per cadascuna de les pàgines requerides pel Paid Memberships Pro o"
3985
 
3989
  #: adminpages/pagesettings.php:170
3990
  #: adminpages/pagesettings.php:185
3991
  #: adminpages/pagesettings.php:189
3992
+ #: adminpages/pagesettings.php:188
3993
  msgid "click here to let us generate them for you"
3994
  msgstr "Clica aquí per permetre’ns generar-les per a tu"
3995
 
3999
  #: adminpages/pagesettings.php:186
4000
  #: adminpages/pagesettings.php:201
4001
  #: adminpages/pagesettings.php:205
4002
+ #: adminpages/pagesettings.php:204
4003
  msgid "Account Page"
4004
  msgstr "Pàgina de Compte"
4005
 
4046
  #: adminpages/pagesettings.php:335
4047
  #: adminpages/pagesettings.php:360
4048
  #: adminpages/pagesettings.php:485
4049
+ #: adminpages/pagesettings.php:211
4050
+ #: adminpages/pagesettings.php:235
4051
+ #: adminpages/pagesettings.php:259
4052
+ #: adminpages/pagesettings.php:284
4053
+ #: adminpages/pagesettings.php:309
4054
+ #: adminpages/pagesettings.php:334
4055
+ #: adminpages/pagesettings.php:359
4056
+ #: adminpages/pagesettings.php:484
4057
  msgid "Choose One"
4058
  msgstr "Escull-ne un"
4059
 
4114
  #: adminpages/pagesettings.php:405
4115
  #: adminpages/pagesettings.php:434
4116
  #: adminpages/pagesettings.php:493
4117
+ #: adminpages/pagesettings.php:219
4118
+ #: adminpages/pagesettings.php:243
4119
+ #: adminpages/pagesettings.php:267
4120
+ #: adminpages/pagesettings.php:292
4121
+ #: adminpages/pagesettings.php:317
4122
+ #: adminpages/pagesettings.php:342
4123
+ #: adminpages/pagesettings.php:367
4124
+ #: adminpages/pagesettings.php:404
4125
+ #: adminpages/pagesettings.php:433
4126
+ #: adminpages/pagesettings.php:492
4127
  msgid "edit page"
4128
  msgstr "Edita la pàgina"
4129
 
4181
  #: adminpages/pagesettings.php:408
4182
  #: adminpages/pagesettings.php:437
4183
  #: adminpages/pagesettings.php:496
4184
+ #: adminpages/pagesettings.php:222
4185
+ #: adminpages/pagesettings.php:270
4186
+ #: adminpages/pagesettings.php:295
4187
+ #: adminpages/pagesettings.php:320
4188
+ #: adminpages/pagesettings.php:345
4189
+ #: adminpages/pagesettings.php:370
4190
+ #: adminpages/pagesettings.php:407
4191
+ #: adminpages/pagesettings.php:436
4192
+ #: adminpages/pagesettings.php:495
4193
  msgid "view page"
4194
  msgstr "Mira la pàgina"
4195
 
4243
  #: adminpages/pagesettings.php:323
4244
  #: adminpages/pagesettings.php:348
4245
  #: adminpages/pagesettings.php:373
4246
+ #: adminpages/pagesettings.php:224
4247
+ #: adminpages/pagesettings.php:272
4248
+ #: adminpages/pagesettings.php:297
4249
+ #: adminpages/pagesettings.php:322
4250
+ #: adminpages/pagesettings.php:347
4251
+ #: adminpages/pagesettings.php:372
4252
  msgid "Include the shortcode"
4253
  msgstr "Inclou l’”enllaç” (shortcode)"
4254
 
4260
  #: adminpages/pagesettings.php:203
4261
  #: adminpages/pagesettings.php:225
4262
  #: adminpages/pagesettings.php:229
4263
+ #: adminpages/pagesettings.php:228
4264
  msgid "Billing Information Page"
4265
  msgstr "Pàgina d’informació de Facturació"
4266
 
4272
  #: adminpages/pagesettings.php:220
4273
  #: adminpages/pagesettings.php:249
4274
  #: adminpages/pagesettings.php:253
4275
+ #: adminpages/pagesettings.php:252
4276
  msgid "Cancel Page"
4277
  msgstr "Cancel·la pàgina"
4278
 
4284
  #: adminpages/pagesettings.php:238
4285
  #: adminpages/pagesettings.php:274
4286
  #: adminpages/pagesettings.php:278
4287
+ #: adminpages/pagesettings.php:277
4288
  msgid "Checkout Page"
4289
  msgstr "Pàgina de Checkout"
4290
 
4296
  #: adminpages/pagesettings.php:256
4297
  #: adminpages/pagesettings.php:299
4298
  #: adminpages/pagesettings.php:303
4299
+ #: adminpages/pagesettings.php:302
4300
  msgid "Confirmation Page"
4301
  msgstr "Pàgina de Confirmació"
4302
 
4308
  #: adminpages/pagesettings.php:274
4309
  #: adminpages/pagesettings.php:324
4310
  #: adminpages/pagesettings.php:328
4311
+ #: adminpages/pagesettings.php:327
4312
  msgid "Invoice Page"
4313
  msgstr "Pàgina de Factura"
4314
 
4320
  #: adminpages/pagesettings.php:292
4321
  #: adminpages/pagesettings.php:349
4322
  #: adminpages/pagesettings.php:353
4323
+ #: adminpages/pagesettings.php:352
4324
  msgid "Levels Page"
4325
  msgstr "Pàgina de Nivells"
4326
 
4328
  #: adminpages/pagesettings.php:391
4329
  #: adminpages/pagesettings.php:457
4330
  #: adminpages/pagesettings.php:461
4331
+ #: adminpages/pagesettings.php:460
4332
  msgid "Additional Page Settings"
4333
  msgstr "Configuració addicional de pàgina"
4334
 
4342
  #: adminpages/pagesettings.php:411
4343
  #: adminpages/pagesettings.php:440
4344
  #: adminpages/pagesettings.php:499
4345
+ #: adminpages/pagesettings.php:410
4346
+ #: adminpages/pagesettings.php:439
4347
+ #: adminpages/pagesettings.php:498
4348
  msgid "Generate Page"
4349
  msgstr "Genera pàgina"
4350
 
4364
  #: adminpages/paymentsettings.php:112
4365
  #: adminpages/paymentsettings.php:127
4366
  #: classes/class-pmpro-site-health.php:69
4367
+ #: adminpages/paymentsettings.php:132
4368
+ #: adminpages/paymentsettings.php:130
4369
  msgid "Payment Gateway"
4370
  msgstr "Passarela de pagament (Payment Gateway)"
4371
 
4375
  #: adminpages/paymentsettings.php:146
4376
  #: adminpages/paymentsettings.php:112
4377
  #: adminpages/paymentsettings.php:248
4378
+ #: adminpages/paymentsettings.php:261
4379
+ #: adminpages/paymentsettings.php:259
4380
  msgid "SSL Settings"
4381
  msgstr "Configuració SSL"
4382
 
4387
 
4388
  #: adminpages/paymentsettings.php:101
4389
  #: adminpages/paymentsettings.php:122
4390
+ #: adminpages/paymentsettings.php:127
4391
+ #: adminpages/paymentsettings.php:125
4392
  msgid "Choose a Gateway"
4393
  msgstr "Escull una passarel·la"
4394
 
4395
  #: adminpages/paymentsettings.php:148
4396
  #: adminpages/paymentsettings.php:194
4397
+ #: adminpages/paymentsettings.php:201
4398
+ #: adminpages/paymentsettings.php:199
4399
  msgid "Currency and Tax Settings"
4400
  msgstr "Configuració de moneda i impostos"
4401
 
4406
  #: adminpages/paymentsettings.php:381
4407
  #: adminpages/paymentsettings.php:386
4408
  #: adminpages/paymentsettings.php:199
4409
+ #: adminpages/paymentsettings.php:206
4410
+ #: adminpages/paymentsettings.php:204
4411
  msgid "Currency"
4412
  msgstr "Moneda"
4413
 
4415
  #: adminpages/paymentsettings.php:400
4416
  #: adminpages/paymentsettings.php:402
4417
  #: adminpages/paymentsettings.php:215
4418
+ #: adminpages/paymentsettings.php:222
4419
+ #: adminpages/paymentsettings.php:220
4420
  msgid "Not all currencies will be supported by every gateway. Please check with your gateway."
4421
  msgstr "No totes les monedes es poden usar a totes les passarel·les. Si us plau comprova la teva passarel·la."
4422
 
4426
  #: adminpages/paymentsettings.php:406
4427
  #: adminpages/paymentsettings.php:408
4428
  #: adminpages/paymentsettings.php:220
4429
+ #: adminpages/paymentsettings.php:227
4430
+ #: adminpages/paymentsettings.php:225
4431
  msgid "Accepted Credit Card Types"
4432
  msgstr "Tipus de tarjetes de crèdit acceptades."
4433
 
4437
  #: adminpages/paymentsettings.php:443
4438
  #: adminpages/paymentsettings.php:445
4439
  #: adminpages/paymentsettings.php:234
4440
+ #: adminpages/paymentsettings.php:241
4441
+ #: adminpages/paymentsettings.php:239
4442
  msgid "Sales Tax"
4443
  msgstr "Impost a la venta"
4444
 
4452
  #: pages/billing.php:82
4453
  #: adminpages/paymentsettings.php:234
4454
  #: pages/billing.php:179
4455
+ #: adminpages/paymentsettings.php:241
4456
+ #: pages/billing.php:181
4457
+ #: adminpages/paymentsettings.php:239
4458
  msgid "optional"
4459
  msgstr "opcional"
4460
 
4464
  #: adminpages/paymentsettings.php:446
4465
  #: adminpages/paymentsettings.php:448
4466
  #: adminpages/paymentsettings.php:237
4467
+ #: adminpages/paymentsettings.php:244
4468
+ #: adminpages/paymentsettings.php:242
4469
  msgid "Tax State"
4470
  msgstr "Estat/país de la taxa"
4471
 
4475
  #: adminpages/paymentsettings.php:447
4476
  #: adminpages/paymentsettings.php:449
4477
  #: adminpages/paymentsettings.php:238
4478
+ #: adminpages/paymentsettings.php:245
4479
+ #: adminpages/paymentsettings.php:243
4480
  msgid "abbreviation, e.g. \"PA\""
4481
  msgstr "abreviació, per exemple “PA”"
4482
 
4483
  #: adminpages/paymentsettings.php:193
4484
  #: adminpages/paymentsettings.php:239
4485
+ #: adminpages/paymentsettings.php:246
4486
+ #: adminpages/paymentsettings.php:244
4487
  msgid "Tax Rate"
4488
  msgstr "Tarifa de l’impost"
4489
 
4493
  #: adminpages/paymentsettings.php:449
4494
  #: adminpages/paymentsettings.php:451
4495
  #: adminpages/paymentsettings.php:240
4496
+ #: adminpages/paymentsettings.php:247
4497
+ #: adminpages/paymentsettings.php:245
4498
  msgid "decimal, e.g. \"0.06\""
4499
  msgstr "decimal, per exemple \"0.06\""
4500
 
4509
  #: adminpages/paymentsettings.php:455
4510
  #: adminpages/paymentsettings.php:457
4511
  #: adminpages/paymentsettings.php:253
4512
+ #: adminpages/paymentsettings.php:266
4513
+ #: adminpages/paymentsettings.php:264
4514
  msgid "Force SSL"
4515
  msgstr "Força SSL"
4516
 
4519
  #: adminpages/paymentsettings.php:461
4520
  #: adminpages/paymentsettings.php:463
4521
  #: adminpages/paymentsettings.php:268
4522
+ #: adminpages/paymentsettings.php:281
4523
+ #: adminpages/paymentsettings.php:279
4524
  msgid "Yes (with JavaScript redirects)"
4525
  msgstr "Sí (amb redirecció de JavaScript)"
4526
 
4527
  #: adminpages/paymentsettings.php:214
4528
  #: adminpages/paymentsettings.php:270
4529
+ #: adminpages/paymentsettings.php:283
4530
+ #: adminpages/paymentsettings.php:281
4531
  msgid "Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops."
4532
  msgstr "Recomanat: Sí. Prova la redirecció de JavaScript si tens problemes amb redireccions amb “loops” infinits."
4533
 
4537
  #: adminpages/paymentsettings.php:468
4538
  #: adminpages/paymentsettings.php:470
4539
  #: adminpages/paymentsettings.php:278
4540
+ #: adminpages/paymentsettings.php:291
4541
+ #: adminpages/paymentsettings.php:289
4542
  msgid "SSL Seal Code"
4543
  msgstr "SSL Seal Code"
4544
 
4548
 
4549
  #: adminpages/paymentsettings.php:228
4550
  #: adminpages/paymentsettings.php:287
4551
+ #: adminpages/paymentsettings.php:306
4552
+ #: adminpages/paymentsettings.php:304
4553
  msgid "Extra HTTPS URL Filter"
4554
  msgstr "Extra HTTPS URL Filtre"
4555
 
4556
  #: adminpages/paymentsettings.php:231
4557
  #: adminpages/paymentsettings.php:290
4558
+ #: adminpages/paymentsettings.php:309
4559
+ #: adminpages/paymentsettings.php:307
4560
  msgid "Pass all generated HTML through a URL filter to add HTTPS to URLs used on secure pages. Check this if you are using SSL and have warnings on your checkout pages."
4561
  msgstr "Passa tot el codi HTML generat a través del filtre URL per a afegir HTTPS a URLs utilitzat a les pàgines segures. Comprova això si estàs utilitzant SSL i tens advertències a les teves pàgines de Checkout."
4562
 
4574
  #: adminpages/reports.php:61
4575
  #: adminpages/reports.php:19
4576
  #: adminpages/reports.php:18
4577
+ #: adminpages/reports.php:21
4578
  msgid "Back to Reports Dashboard"
4579
  msgstr "Torna a l’escriptori de Reports (Reports Dashboard)"
4580
 
4616
  #: adminpages/reports/sales.php:51
4617
  #: adminpages/orders.php:1077
4618
  #: adminpages/orders.php:1069
4619
+ #: adminpages/orders.php:1070
4620
+ #: adminpages/orders.php:1158
4621
  msgid "This Month"
4622
  msgstr "Aquest mes"
4623
 
4629
  #: adminpages/reports/login.php:62
4630
  #: adminpages/reports/memberships.php:52
4631
  #: adminpages/reports/sales.php:53
4632
+ #: adminpages/reports/sales.php:542
4633
+ #: adminpages/reports/sales.php:543
4634
  msgid "All Time"
4635
  msgstr "Sempre"
4636
 
4647
  #: adminpages/reports/login.php:104
4648
  #: classes/class-pmpro-members-list-table.php:234
4649
  #: classes/class-pmpro-members-list-table.php:233
4650
+ #: adminpages/reports/login.php:105
4651
+ #: adminpages/reports/login.php:111
4652
  msgid "All Users"
4653
  msgstr "Tots els usuaris"
4654
 
4656
  #: adminpages/reports/login.php:146
4657
  #: adminpages/reports/login.php:148
4658
  #: adminpages/reports/login.php:185
4659
+ #: adminpages/reports/login.php:188
4660
  msgid "Last Visit"
4661
  msgstr "Última visita"
4662
 
4666
  #: adminpages/reports/login.php:147
4667
  #: adminpages/reports/login.php:149
4668
  #: adminpages/reports/login.php:187
4669
+ #: adminpages/reports/login.php:190
4670
  msgid "Visits This Month"
4671
  msgstr "Visites aquest mes"
4672
 
4682
  #: adminpages/reports/login.php:149
4683
  #: adminpages/reports/login.php:151
4684
  #: adminpages/reports/login.php:191
4685
+ #: adminpages/reports/login.php:194
4686
  msgid "Views This Month"
4687
  msgstr "Visites aquest mes"
4688
 
4696
  #: adminpages/reports/login.php:151
4697
  #: adminpages/reports/login.php:153
4698
  #: adminpages/reports/login.php:194
4699
+ #: adminpages/reports/login.php:197
4700
  msgid "Last Login"
4701
  msgstr "Últim Login"
4702
 
4706
  #: adminpages/reports/login.php:152
4707
  #: adminpages/reports/login.php:154
4708
  #: adminpages/reports/login.php:196
4709
+ #: adminpages/reports/login.php:199
4710
  msgid "Logins This Month"
4711
  msgstr "Logins aquest mes"
4712
 
4745
  #: adminpages/reports/sales.php:52
4746
  #: adminpages/orders.php:1081
4747
  #: adminpages/orders.php:1073
4748
+ #: adminpages/orders.php:1074
4749
+ #: adminpages/orders.php:1162
4750
  msgid "This Year"
4751
  msgstr "Aquest any"
4752
 
4762
  #: adminpages/reports/sales.php:295
4763
  #: adminpages/advancedsettings.php:322
4764
  #: adminpages/reports/sales.php:313
4765
+ #: adminpages/advancedsettings.php:329
4766
+ #: adminpages/reports/memberships.php:332
4767
  msgid "Daily"
4768
  msgstr "Diari"
4769
 
4779
  #: adminpages/reports/sales.php:296
4780
  #: adminpages/advancedsettings.php:328
4781
  #: adminpages/reports/sales.php:314
4782
+ #: adminpages/advancedsettings.php:335
4783
+ #: adminpages/reports/memberships.php:333
4784
  msgid "Monthly"
4785
  msgstr "Mensual"
4786
 
4794
  #: adminpages/reports/memberships.php:335
4795
  #: adminpages/reports/sales.php:297
4796
  #: adminpages/reports/sales.php:315
4797
+ #: adminpages/reports/memberships.php:334
4798
  msgid "Annual"
4799
  msgstr "Anual"
4800
 
4801
  #: adminpages/reports/memberships.php:270
4802
  #: adminpages/reports/memberships.php:338
4803
+ #: adminpages/reports/memberships.php:337
4804
  msgid "Signups vs. All Cancellations"
4805
  msgstr "Altes vs. totes les Cancel·lacions"
4806
 
4808
  #: adminpages/reports/memberships.php:263
4809
  #: adminpages/reports/memberships.php:299
4810
  #: adminpages/reports/memberships.php:339
4811
+ #: adminpages/reports/memberships.php:338
4812
  msgid "Signups vs. Cancellations"
4813
  msgstr "Altes vs. Cancel·lacions"
4814
 
4815
  #: adminpages/reports/memberships.php:272
4816
  #: adminpages/reports/memberships.php:340
4817
+ #: adminpages/reports/memberships.php:339
4818
  msgid "Signups vs. Expirations"
4819
  msgstr "Altes vs. Expiracions"
4820
 
4845
  #: adminpages/reports/sales.php:314
4846
  #: adminpages/reports/sales.php:321
4847
  #: adminpages/reports/sales.php:332
4848
+ #: adminpages/reports/memberships.php:341
4849
+ #: adminpages/reports/memberships.php:352
4850
  msgid "for"
4851
  msgstr "per a"
4852
 
4860
  #: adminpages/reports/memberships.php:385
4861
  #: adminpages/reports/sales.php:342
4862
  #: adminpages/reports/sales.php:360
4863
+ #: adminpages/reports/memberships.php:384
4864
  msgid "Generate Report"
4865
  msgstr "Genera Informe"
4866
 
4903
 
4904
  #: adminpages/templates/orders-email.php:14
4905
  #: adminpages/templates/orders-print.php:50
4906
+ #: adminpages/templates/orders-email.php:17
4907
+ #: adminpages/templates/orders-print.php:53
4908
  msgid "Invoice #: "
4909
  msgstr "Factura #: "
4910
 
4911
  #: adminpages/templates/orders-email.php:18
4912
  #: adminpages/templates/orders-print.php:54
4913
+ #: adminpages/templates/orders-email.php:21
4914
+ #: adminpages/templates/orders-print.php:57
4915
  msgid "Date:"
4916
  msgstr "Data:"
4917
 
4918
  #: adminpages/templates/orders-email.php:24
4919
+ #: adminpages/templates/orders-email.php:27
4920
  msgid "Bill to:"
4921
  msgstr "Facturat a:"
4922
 
4923
  #: adminpages/templates/orders-email.php:47
4924
  #: adminpages/templates/orders-print.php:76
4925
+ #: adminpages/templates/orders-email.php:50
4926
+ #: adminpages/templates/orders-print.php:79
4927
  msgid "Item"
4928
  msgstr "Item"
4929
 
4932
  #: pages/levels.php:36
4933
  #: pages/levels.php:14
4934
  #: pages/levels.php:28
4935
+ #: adminpages/templates/orders-email.php:51
4936
+ #: adminpages/templates/orders-print.php:80
4937
  msgid "Price"
4938
  msgstr "Preu"
4939
 
4943
  #: pages/invoice.php:77
4944
  #: includes/functions.php:2842
4945
  #: includes/functions.php:2873
4946
+ #: includes/functions.php:2895
4947
+ #: includes/functions.php:2897
4948
  msgid "Subtotal"
4949
  msgstr "Subtotal"
4950
 
4972
  #: includes/cleanup.php:24
4973
  #: classes/class.memberorder.php:959
4974
  #: classes/class.memberorder.php:1001
4975
+ #: classes/class.memberorder.php:1010
4976
  #, php-format
4977
  msgid "There was an error canceling the subscription for user with ID=%s. You will want to check your payment gateway to see if their subscription is still active."
4978
  msgstr "Hi ha hagut un error cancel·lant la subscripció per a l’usuari ID=%s. Comprova a la passarel·la de pagament si la seva subscripció encara és activa."
5010
  #: classes/class.pmproemail.php:178
5011
  #: classes/class.pmproemail.php:269
5012
  #: classes/class.pmproemail.php:262
5013
+ #: classes/class.pmproemail.php:395
5014
  #, php-format
5015
  msgid "Your membership confirmation for %s"
5016
  msgstr "Confirmació per a la seva subscripció %s"
5109
  #: classes/class.pmproemail.php:440
5110
  #: classes/class.pmproemail.php:762
5111
  #: classes/class.pmproemail.php:764
5112
+ #: adminpages/orders.php:576
5113
+ #: adminpages/orders.php:1343
5114
+ #: adminpages/orders.php:697
5115
+ #: adminpages/orders.php:1437
5116
+ #: classes/class.pmproemail.php:465
5117
+ #: classes/class.pmproemail.php:471
5118
+ #: classes/class.pmproemail.php:477
5119
+ #: classes/class.pmproemail.php:567
5120
+ #: classes/class.pmproemail.php:573
5121
+ #: classes/class.pmproemail.php:895
5122
+ #: classes/class.pmproemail.php:897
5123
+ #: classes/gateways/class.pmprogateway_braintree.php:516
5124
+ #: classes/gateways/class.pmprogateway_stripe.php:906
5125
+ #: includes/profile.php:454
5126
  msgid "Discount Code"
5127
  msgstr "Codi de descompte"
5128
 
5162
  #: classes/class.pmproemail.php:771
5163
  #: classes/class.pmproemail.php:905
5164
  #: classes/class.pmproemail.php:950
5165
+ #: classes/class.pmproemail.php:485
5166
+ #: classes/class.pmproemail.php:583
5167
+ #: classes/class.pmproemail.php:904
5168
+ #: classes/class.pmproemail.php:1038
5169
+ #: classes/class.pmproemail.php:1083
5170
  #, php-format
5171
  msgid "This membership will expire on %s."
5172
  msgstr "Aquesta subscripció expirarà a %s."
5184
  #: classes/class.pmproemail.php:463
5185
  #: classes/class.pmproemail.php:475
5186
  #: classes/class.pmproemail.php:468
5187
+ #: classes/class.pmproemail.php:601
5188
  #, php-format
5189
  msgid "Your billing information has been updated at %s"
5190
  msgstr "S’ha actualitzat la seva informació de facturació a %s"
5193
  #: classes/class.pmproemail.php:513
5194
  #: classes/class.pmproemail.php:525
5195
  #: classes/class.pmproemail.php:518
5196
+ #: classes/class.pmproemail.php:651
5197
  #, php-format
5198
  msgid "Billing information has been updated for %s at %s"
5199
  msgstr "Informació de facturació ha estat actualitzat per %s a %s"
5241
  #: classes/class.pmproemail.php:794
5242
  #: classes/class.pmproemail.php:806
5243
  #: classes/class.pmproemail.php:799
5244
+ #: classes/class.pmproemail.php:932
5245
  #, php-format
5246
  msgid "Your trial at %s is ending soon"
5247
  msgstr "El teu període de prova a %s aviat acabarà."
5254
  #: classes/class.pmproemail.php:831
5255
  #: classes/class.pmproemail.php:843
5256
  #: classes/class.pmproemail.php:836
5257
+ #: classes/class.pmproemail.php:969
5258
  #, php-format
5259
  msgid "Your membership at %s has ended"
5260
  msgstr "La teva subscripció a %s ha finalitzat"
5267
  #: classes/class.pmproemail.php:858
5268
  #: classes/class.pmproemail.php:870
5269
  #: classes/class.pmproemail.php:863
5270
+ #: classes/class.pmproemail.php:996
5271
  #, php-format
5272
  msgid "Your membership at %s will end soon"
5273
  msgstr "La teva subscripció a %s finalitzarà aviat."
5280
  #: classes/class.pmproemail.php:888
5281
  #: classes/class.pmproemail.php:900
5282
  #: classes/class.pmproemail.php:893
5283
+ #: classes/class.pmproemail.php:1026
5284
  #, php-format
5285
  msgid "Your membership at %s has been changed"
5286
  msgstr "La teva subscripció a %s ha canviat"
5337
  #: classes/class.pmproemail.php:933
5338
  #: classes/class.pmproemail.php:945
5339
  #: classes/class.pmproemail.php:938
5340
+ #: classes/class.pmproemail.php:1071
5341
  #, php-format
5342
  msgid "Membership for %s at %s has been changed"
5343
  msgstr "Subscripció per %s a %s ha canviat"
5441
  #: paid-memberships-pro.php:164
5442
  #: paid-memberships-pro.php:166
5443
  #: paid-memberships-pro.php:167
5444
+ #: paid-memberships-pro.php:173
5445
  msgid "Authorize.net"
5446
  msgstr "Authorize.net"
5447
 
5508
  #: paid-memberships-pro.php:165
5509
  #: paid-memberships-pro.php:167
5510
  #: paid-memberships-pro.php:168
5511
+ #: classes/gateways/class.pmprogateway_braintree.php:258
5512
+ #: paid-memberships-pro.php:174
5513
  msgid "Braintree Payments"
5514
  msgstr "Pagaments Braintree"
5515
 
5516
  #: classes/gateways/class.pmprogateway_braintree.php:132
5517
  #: classes/gateways/class.pmprogateway_braintree.php:119
5518
  #: classes/gateways/class.pmprogateway_braintree.php:308
5519
+ #: classes/gateways/class.pmprogateway_braintree.php:315
5520
  msgid "Braintree Settings"
5521
  msgstr "Configuració Braintree"
5522
 
5530
  #: classes/gateways/class.pmprogateway_braintree.php:124
5531
  #: classes/gateways/class.pmprogateway_braintree.php:313
5532
  #: classes/gateways/class.pmprogateway_cybersource.php:94
5533
+ #: classes/gateways/class.pmprogateway_braintree.php:320
5534
  msgid "Merchant ID"
5535
  msgstr "ID de comerciant"
5536
 
5540
  #: adminpages/paymentsettings.php:311
5541
  #: classes/gateways/class.pmprogateway_braintree.php:132
5542
  #: classes/gateways/class.pmprogateway_braintree.php:321
5543
+ #: classes/gateways/class.pmprogateway_braintree.php:328
5544
  msgid "Public Key"
5545
  msgstr "Clau Pública"
5546
 
5550
  #: adminpages/paymentsettings.php:319
5551
  #: classes/gateways/class.pmprogateway_braintree.php:140
5552
  #: classes/gateways/class.pmprogateway_braintree.php:329
5553
+ #: classes/gateways/class.pmprogateway_braintree.php:336
5554
  msgid "Private Key"
5555
  msgstr "Clau Privada"
5556
 
5560
  #: adminpages/paymentsettings.php:327
5561
  #: classes/gateways/class.pmprogateway_braintree.php:148
5562
  #: classes/gateways/class.pmprogateway_braintree.php:337
5563
+ #: classes/gateways/class.pmprogateway_braintree.php:344
5564
  msgid "Client-Side Encryption Key"
5565
  msgstr "Clau d’encriptació del Client"
5566
 
5578
  #: classes/gateways/class.pmprogateway_stripe.php:182
5579
  #: classes/gateways/class.pmprogateway_stripe.php:192
5580
  #: classes/gateways/class.pmprogateway_braintree.php:345
5581
+ #: classes/gateways/class.pmprogateway_braintree.php:352
5582
  msgid "Web Hook URL"
5583
  msgstr "Web Hook URL"
5584
 
5589
  #: adminpages/paymentsettings.php:523
5590
  #: classes/gateways/class.pmprogateway_braintree.php:160
5591
  #: classes/gateways/class.pmprogateway_braintree.php:348
5592
+ #: classes/gateways/class.pmprogateway_braintree.php:355
5593
  msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to"
5594
  msgstr "Per integrar totalment Braintree, assegura’t de configurar Web Hook URL a"
5595
 
5616
  #: classes/gateways/class.pmprogateway_stripe.php:1282
5617
  #: classes/gateways/class.pmprogateway_stripe.php:1288
5618
  #: classes/gateways/class.pmprogateway_stripe.php:747
5619
+ #: adminpages/orders.php:676
5620
+ #: classes/gateways/class.pmprogateway_braintree.php:461
5621
+ #: classes/gateways/class.pmprogateway_stripe.php:855
5622
  msgid "Payment Information"
5623
  msgstr "Informació de pagament"
5624
 
5645
  #: classes/gateways/class.pmprogateway_stripe.php:1283
5646
  #: classes/gateways/class.pmprogateway_stripe.php:1289
5647
  #: classes/gateways/class.pmprogateway_stripe.php:748
5648
+ #: classes/gateways/class.pmprogateway_braintree.php:462
5649
+ #: classes/gateways/class.pmprogateway_stripe.php:856
5650
  #, php-format
5651
  msgid "We Accept %s"
5652
  msgstr "Acceptem %s"
5679
  #: classes/gateways/class.pmprogateway_stripe.php:1316
5680
  #: classes/gateways/class.pmprogateway_stripe.php:1322
5681
  #: classes/gateways/class.pmprogateway_stripe.php:781
5682
+ #: pages/billing.php:377
5683
+ #: classes/gateways/class.pmprogateway_braintree.php:482
5684
+ #: classes/gateways/class.pmprogateway_stripe.php:889
5685
  msgid "Card Number"
5686
  msgstr "Nombre de Tarjeta"
5687
 
5707
  #: pages/checkout.php:603
5708
  #: classes/gateways/class.pmprogateway_braintree.php:503
5709
  #: pages/billing.php:410
5710
+ #: pages/billing.php:417
5711
+ #: classes/gateways/class.pmprogateway_braintree.php:510
5712
  msgid "CVV"
5713
  msgstr "CVV"
5714
 
5735
  #: classes/gateways/class.pmprogateway_braintree.php:504
5736
  #: pages/billing.php:411
5737
  #: pages/checkout.php:425
5738
+ #: pages/billing.php:418
5739
+ #: classes/gateways/class.pmprogateway_braintree.php:511
5740
  msgid "what's this?"
5741
  msgstr "què és això?"
5742
 
5769
  #: classes/gateways/class.pmprogateway_stripe.php:1338
5770
  #: classes/gateways/class.pmprogateway_stripe.php:1344
5771
  #: classes/gateways/class.pmprogateway_stripe.php:803
5772
+ #: classes/gateways/class.pmprogateway_braintree.php:518
5773
+ #: classes/gateways/class.pmprogateway_stripe.php:911
5774
  msgid "Apply"
5775
  msgstr "Aplica"
5776
 
5786
  #: classes/gateways/class.pmprogateway_stripe.php:1036
5787
  #: classes/gateways/class.pmprogateway_stripe.php:1040
5788
  #: classes/gateways/class.pmprogateway_braintree.php:574
5789
+ #: classes/gateways/class.pmprogateway_braintree.php:581
5790
  msgid "Unknown error: Initial payment failed."
5791
  msgstr "Error desconegut: ha fallat el pagament inicial"
5792
 
5795
  #: classes/gateways/class.pmprogateway_braintree.php:465
5796
  #: classes/gateways/class.pmprogateway_braintree.php:478
5797
  #: classes/gateways/class.pmprogateway_braintree.php:650
5798
+ #: classes/gateways/class.pmprogateway_braintree.php:653
5799
+ #: classes/gateways/class.pmprogateway_braintree.php:660
5800
  msgid "Error during settlement:"
5801
  msgstr "Error durant la liquidació:"
5802
 
5805
  #: classes/gateways/class.pmprogateway_braintree.php:474
5806
  #: classes/gateways/class.pmprogateway_braintree.php:487
5807
  #: classes/gateways/class.pmprogateway_braintree.php:659
5808
+ #: classes/gateways/class.pmprogateway_braintree.php:662
5809
+ #: classes/gateways/class.pmprogateway_braintree.php:669
5810
  msgid "Error during charge:"
5811
  msgstr "Error durant la càrrega:"
5812
 
5816
  #: classes/gateways/class.pmprogateway_braintree.php:566
5817
  #: classes/gateways/class.pmprogateway_braintree.php:579
5818
  #: classes/gateways/class.pmprogateway_braintree.php:762
5819
+ #: classes/gateways/class.pmprogateway_braintree.php:765
5820
+ #: classes/gateways/class.pmprogateway_braintree.php:772
5821
  msgid "Failed to update customer."
5822
  msgstr "No s’ha pogut actualitzar el comprador."
5823
 
5827
  #: classes/gateways/class.pmprogateway_braintree.php:614
5828
  #: classes/gateways/class.pmprogateway_braintree.php:627
5829
  #: classes/gateways/class.pmprogateway_braintree.php:810
5830
+ #: classes/gateways/class.pmprogateway_braintree.php:813
5831
+ #: classes/gateways/class.pmprogateway_braintree.php:820
5832
  msgid "Failed to create customer."
5833
  msgstr "No s’ha pogut crear el comprador"
5834
 
5838
  #: classes/gateways/class.pmprogateway_braintree.php:621
5839
  #: classes/gateways/class.pmprogateway_braintree.php:634
5840
  #: classes/gateways/class.pmprogateway_braintree.php:817
5841
+ #: classes/gateways/class.pmprogateway_braintree.php:820
5842
+ #: classes/gateways/class.pmprogateway_braintree.php:827
5843
  msgid "Error creating customer record with Braintree:"
5844
  msgstr "No s’ha pogut crear el comprador amb Branitree:"
5845
 
5888
  #: classes/gateways/class.pmprogateway_stripe.php:402
5889
  #: classes/gateways/class.pmprogateway_stripe.php:423
5890
  #: classes/gateways/class.pmprogateway_braintree.php:1036
5891
+ #: classes/gateways/class.pmprogateway_braintree.php:1039
5892
+ #: classes/gateways/class.pmprogateway_braintree.php:1046
5893
  msgid "Could not find the subscription."
5894
  msgstr "No s’ha trobat la subscripció"
5895
 
5907
  #: paid-memberships-pro.php:158
5908
  #: paid-memberships-pro.php:160
5909
  #: paid-memberships-pro.php:161
5910
+ #: paid-memberships-pro.php:167
5911
  msgid "Pay by Check"
5912
  msgstr "Pagament amb Check"
5913
 
6027
  #: paid-memberships-pro.php:161
6028
  #: paid-memberships-pro.php:163
6029
  #: paid-memberships-pro.php:164
6030
+ #: paid-memberships-pro.php:170
6031
  msgid "PayPal Website Payments Pro"
6032
  msgstr "PayPal Website Payments Pro"
6033
 
6039
  #: classes/gateways/class.pmprogateway_paypalexpress.php:141
6040
  #: classes/gateways/class.pmprogateway_paypalstandard.php:133
6041
  #: classes/gateways/class.pmprogateway_paypalexpress.php:151
6042
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:152
6043
  msgid "PayPal Settings"
6044
  msgstr "Configuració PayPal"
6045
 
6062
  #: classes/gateways/class.pmprogateway_paypalexpress.php:162
6063
  #: classes/gateways/class.pmprogateway_paypalstandard.php:154
6064
  #: classes/gateways/class.pmprogateway_paypalexpress.php:172
6065
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:173
6066
  msgid "Gateway Account Email"
6067
  msgstr "Correu electrònic del compte de la Passarel·la"
6068
 
6083
  #: classes/gateways/class.pmprogateway_paypalstandard.php:162
6084
  #: classes/gateways/class.pmprogateway_twocheckout.php:120
6085
  #: classes/gateways/class.pmprogateway_paypalexpress.php:180
6086
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:181
6087
+ #: classes/gateways/class.pmprogateway_twocheckout.php:127
6088
  msgid "API Username"
6089
  msgstr "API Usuari"
6090
 
6105
  #: classes/gateways/class.pmprogateway_paypalstandard.php:170
6106
  #: classes/gateways/class.pmprogateway_twocheckout.php:129
6107
  #: classes/gateways/class.pmprogateway_paypalexpress.php:188
6108
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:189
6109
+ #: classes/gateways/class.pmprogateway_twocheckout.php:136
6110
  msgid "API Password"
6111
  msgstr "API Clau"
6112
 
6121
  #: classes/gateways/class.pmprogateway_paypalexpress.php:186
6122
  #: classes/gateways/class.pmprogateway_paypalstandard.php:178
6123
  #: classes/gateways/class.pmprogateway_paypalexpress.php:196
6124
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:197
6125
  msgid "API Signature"
6126
  msgstr "API Signatura"
6127
 
6137
  #: classes/gateways/class.pmprogateway_paypalexpress.php:205
6138
  #: classes/gateways/class.pmprogateway_paypalstandard.php:186
6139
  #: classes/gateways/class.pmprogateway_paypalexpress.php:215
6140
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:216
6141
  msgid "IPN Handler URL"
6142
  msgstr "IPN Handler URL"
6143
 
6165
  #: pages/checkout.php:218
6166
  #: classes/gateways/class.pmprogateway_paypalexpress.php:498
6167
  #: classes/gateways/class.pmprogateway_paypalexpress.php:502
6168
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:503
6169
  msgid "Check Out with PayPal"
6170
  msgstr "Check Out amb PayPal"
6171
 
6187
  #: pages/checkout.php:526
6188
  #: classes/gateways/class.pmprogateway_paypalexpress.php:503
6189
  #: classes/gateways/class.pmprogateway_paypalexpress.php:507
6190
+ #: pages/checkout.php:538
6191
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:508
6192
  msgid "Submit and Check Out"
6193
  msgstr "Envia i fés el Check Out"
6194
 
6214
  #: pages/checkout.php:526
6215
  #: classes/gateways/class.pmprogateway_paypalexpress.php:503
6216
  #: classes/gateways/class.pmprogateway_paypalexpress.php:507
6217
+ #: pages/checkout.php:538
6218
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:508
6219
+ #: classes/gateways/class.pmprogateway_twocheckout.php:212
6220
  msgid "Submit and Confirm"
6221
  msgstr "Envia i confirma"
6222
 
6241
  #: classes/gateways/class.pmprogateway_paypalexpress.php:841
6242
  #: classes/gateways/class.pmprogateway_paypalexpress.php:845
6243
  #: classes/gateways/class.pmprogateway_paypalexpress.php:854
6244
+ #: classes/gateways/class.pmprogateway_paypal.php:726
6245
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:865
6246
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:866
6247
  msgid "Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward."
6248
  msgstr "Contacteu al propietari del lloc o cancel·leu la vostra subscripció de PayPal per assegurar-te que no et cobraran en el futur."
6249
 
6259
  #: paid-memberships-pro.php:162
6260
  #: classes/gateways/class.pmprogateway_paypalexpress.php:94
6261
  #: paid-memberships-pro.php:163
6262
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:95
6263
+ #: paid-memberships-pro.php:169
6264
  msgid "PayPal Express"
6265
  msgstr "PayPal Express"
6266
 
6273
  #: classes/gateways/class.pmprogateway_paypal.php:199
6274
  #: classes/gateways/class.pmprogateway_paypalexpress.php:208
6275
  #: classes/gateways/class.pmprogateway_paypalexpress.php:218
6276
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:219
6277
  msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to "
6278
  msgstr "Per integrar completament PayPal, assegura’t de configurar el teu IPN Handler URL a"
6279
 
6297
  #: classes/gateways/class.pmprogateway_paypalexpress.php:401
6298
  #: classes/gateways/class.pmprogateway_paypalexpress.php:352
6299
  #: classes/gateways/class.pmprogateway_paypalexpress.php:411
6300
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:353
6301
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:412
6302
  msgid "The PayPal Token was lost."
6303
  msgstr "S’ha perdut el Token de PayPal"
6304
 
6312
  #: paid-memberships-pro.php:163
6313
  #: paid-memberships-pro.php:165
6314
  #: paid-memberships-pro.php:166
6315
+ #: paid-memberships-pro.php:172
6316
  msgid "PayPal Standard"
6317
  msgstr "PayPal Standard"
6318
 
6341
  #: classes/gateways/class.pmprogateway_stripe.php:258
6342
  #: classes/gateways/class.pmprogateway_stripe.php:216
6343
  #: paid-memberships-pro.php:162
6344
+ #: classes/gateways/class.pmprogateway_stripe.php:234
6345
+ #: paid-memberships-pro.php:168
6346
  msgid "Stripe"
6347
  msgstr "Stripe"
6348
 
6365
  #: classes/gateways/class.pmprogateway_stripe.php:570
6366
  #: classes/gateways/class.pmprogateway_stripe.php:576
6367
  #: classes/gateways/class.pmprogateway_stripe.php:340
6368
+ #: classes/gateways/class.pmprogateway_stripe.php:366
6369
  msgid "Secret Key"
6370
  msgstr "Secret Key"
6371
 
6381
  #: classes/gateways/class.pmprogateway_stripe.php:554
6382
  #: classes/gateways/class.pmprogateway_stripe.php:560
6383
  #: classes/gateways/class.pmprogateway_stripe.php:324
6384
+ #: classes/gateways/class.pmprogateway_stripe.php:350
6385
  msgid "Publishable Key"
6386
  msgstr "Clau Publicable"
6387
 
6397
  #: classes/gateways/class.pmprogateway_stripe.php:629
6398
  #: classes/gateways/class.pmprogateway_stripe.php:635
6399
  #: classes/gateways/class.pmprogateway_stripe.php:399
6400
+ #: adminpages/orders.php:570
6401
+ #: classes/gateways/class.pmprogateway_stripe.php:425
6402
  msgid "Show Billing Address Fields"
6403
  msgstr "Mostra els camps d’adreça de facturació"
6404
 
6413
  #: classes/gateways/class.pmprogateway_stripe.php:638
6414
  #: classes/gateways/class.pmprogateway_stripe.php:644
6415
  #: classes/gateways/class.pmprogateway_stripe.php:408
6416
+ #: classes/gateways/class.pmprogateway_stripe.php:434
6417
  msgid "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.<br /><strong>If No, make sure you disable address verification in the Stripe dashboard settings.</strong>"
6418
  msgstr "Stripe no necessita camps d’adreça de facturació. Escull “No” per amagar-los de la pàgina de Checkout.<br /><strong>Si No, assegura’t de desabilitar la verificació de l’adreça a l’escripori de configuració de l’Stripe.</strong>"
6419
 
6440
  #: classes/gateways/class.pmprogateway_stripe.php:2650
6441
  #: classes/gateways/class.pmprogateway_stripe.php:2646
6442
  #: classes/gateways/class.pmprogateway_stripe.php:2648
6443
+ #: classes/gateways/class.pmprogateway_stripe.php:2644
6444
+ #: classes/gateways/class.pmprogateway_stripe.php:3101
6445
  msgid "Subscription Updates"
6446
  msgstr "Actualització de subscripcions"
6447
 
6489
  #: pages/billing.php:434
6490
  #: classes/gateways/class.pmprogateway_stripe.php:2651
6491
  #: classes/gateways/class.pmprogateway_stripe.php:2653
6492
+ #: classes/gateways/class.pmprogateway_stripe.php:2649
6493
+ #: pages/billing.php:441
6494
+ #: classes/gateways/class.pmprogateway_stripe.php:3106
6495
  msgid "Update"
6496
  msgstr "Actualitza"
6497
 
6507
  #: classes/gateways/class.pmprogateway_stripe.php:3045
6508
  #: classes/gateways/class.pmprogateway_stripe.php:3041
6509
  #: classes/gateways/class.pmprogateway_stripe.php:3043
6510
+ #: classes/gateways/class.pmprogateway_stripe.php:3039
6511
+ #: classes/gateways/class.pmprogateway_stripe.php:3504
6512
  msgid "Could not cancel the old subscription. Updates have not been processed."
6513
  msgstr "No s’ha pogut cancel·lar l’antiga subscripció. Les actualitzacions no s’han processat."
6514
 
6555
  #: classes/gateways/class.pmprogateway_stripe.php:4065
6556
  #: classes/gateways/class.pmprogateway_stripe.php:4062
6557
  #: classes/gateways/class.pmprogateway_stripe.php:4067
6558
+ #: classes/gateways/class.pmprogateway_stripe.php:4058
6559
+ #: classes/gateways/class.pmprogateway_stripe.php:4063
6560
+ #: classes/gateways/class.pmprogateway_stripe.php:4522
6561
+ #: classes/gateways/class.pmprogateway_stripe.php:4527
6562
  msgid "Error getting subscription with Stripe:"
6563
  msgstr "Error agafant la subscripció amb Stripe:"
6564
 
6596
  #: classes/gateways/class.pmprogateway_stripe.php:4166
6597
  #: classes/gateways/class.pmprogateway_stripe.php:4163
6598
  #: classes/gateways/class.pmprogateway_stripe.php:4168
6599
+ #: classes/gateways/class.pmprogateway_stripe.php:4159
6600
+ #: classes/gateways/class.pmprogateway_stripe.php:4164
6601
+ #: classes/gateways/class.pmprogateway_stripe.php:4623
6602
+ #: classes/gateways/class.pmprogateway_stripe.php:4628
6603
  msgid "Error creating plan with Stripe:"
6604
  msgstr "Error creant pla amb Stripe:"
6605
 
6632
  #: classes/gateways/class.pmprogateway_stripe.php:4211
6633
  #: classes/gateways/class.pmprogateway_stripe.php:4199
6634
  #: classes/gateways/class.pmprogateway_stripe.php:4213
6635
+ #: classes/gateways/class.pmprogateway_stripe.php:4195
6636
+ #: classes/gateways/class.pmprogateway_stripe.php:4209
6637
+ #: classes/gateways/class.pmprogateway_stripe.php:4659
6638
+ #: classes/gateways/class.pmprogateway_stripe.php:4673
6639
  msgid "Error subscribing customer to plan with Stripe:"
6640
  msgstr "Error subscrivint un pla de comprador amb Stripe:"
6641
 
6657
  #: classes/gateways/class.pmprogateway_stripe.php:2672
6658
  #: classes/gateways/class.pmprogateway_stripe.php:1731
6659
  #: classes/gateways/class.pmprogateway_stripe.php:1729
6660
+ #: classes/gateways/class.pmprogateway_stripe.php:2148
6661
  msgid "Could not cancel old subscription."
6662
  msgstr "No s’ha pogut cancel·lar l’antiga subscripció. "
6663
 
6676
  #: classes/gateways/class.pmprogateway_stripe.php:2688
6677
  #: classes/gateways/class.pmprogateway_stripe.php:1747
6678
  #: classes/gateways/class.pmprogateway_stripe.php:1745
6679
+ #: classes/gateways/class.pmprogateway_stripe.php:2164
6680
  msgid "Could not find the customer."
6681
  msgstr "No s’ha trobat el comprador."
6682
 
6688
  #: paid-memberships-pro.php:125
6689
  #: paid-memberships-pro.php:132
6690
  #: paid-memberships-pro.php:133
6691
+ #: classes/gateways/class.pmprogateway_twocheckout.php:66
6692
  msgid "2Checkout"
6693
  msgstr "2Checkout"
6694
 
6696
  #: classes/gateways/class.pmprogateway_twocheckout.php:108
6697
  #: classes/gateways/class.pmprogateway_twocheckout.php:116
6698
  #: classes/gateways/class.pmprogateway_twocheckout.php:115
6699
+ #: classes/gateways/class.pmprogateway_twocheckout.php:122
6700
  msgid "2Checkout Settings"
6701
  msgstr "Configuració de 2Checkout"
6702
 
6703
  #: classes/gateways/class.pmprogateway_twocheckout.php:123
6704
  #: classes/gateways/class.pmprogateway_twocheckout.php:125
6705
  #: classes/gateways/class.pmprogateway_twocheckout.php:124
6706
+ #: classes/gateways/class.pmprogateway_twocheckout.php:131
6707
  msgid "Go to Account &raquo; User Management in 2Checkout and create a user with API Access and API Updating."
6708
  msgstr "Vés a Account &raquo; User Management in 2Checkout i crea un usuari amb API Access i API Updating."
6709
 
6710
  #: classes/gateways/class.pmprogateway_twocheckout.php:132
6711
  #: classes/gateways/class.pmprogateway_twocheckout.php:134
6712
  #: classes/gateways/class.pmprogateway_twocheckout.php:133
6713
+ #: classes/gateways/class.pmprogateway_twocheckout.php:140
6714
  msgid "Password for the API user created."
6715
  msgstr "Clau per a l’usuari de l’API creada."
6716
 
6717
  #: classes/gateways/class.pmprogateway_twocheckout.php:141
6718
  #: classes/gateways/class.pmprogateway_twocheckout.php:152
6719
  #: classes/gateways/class.pmprogateway_twocheckout.php:142
6720
+ #: classes/gateways/class.pmprogateway_twocheckout.php:149
6721
  msgid "Click on the profile icon in 2Checkout to find your Account Number."
6722
  msgstr "Clica a la icona del perfil a 2Checkout per trobar el teu Account Number."
6723
 
6727
  #: classes/gateways/class.pmprogateway_twocheckout.php:137
6728
  #: classes/gateways/class.pmprogateway_twocheckout.php:157
6729
  #: classes/gateways/class.pmprogateway_twocheckout.php:147
6730
+ #: classes/gateways/class.pmprogateway_twocheckout.php:154
6731
  msgid "Secret Word"
6732
  msgstr "Paraula Secreta"
6733
 
6734
  #: classes/gateways/class.pmprogateway_twocheckout.php:150
6735
  #: classes/gateways/class.pmprogateway_twocheckout.php:161
6736
  #: classes/gateways/class.pmprogateway_twocheckout.php:151
6737
+ #: classes/gateways/class.pmprogateway_twocheckout.php:158
6738
  msgid "Go to Account &raquo; Site Management. Look under Checkout Options to find the Secret Word."
6739
  msgstr "Vés a Account &raquo; Site Management. Mira sota Checkout Options i troba la Paraula Secreta"
6740
 
6745
  #: classes/gateways/class.pmprogateway_twocheckout.php:145
6746
  #: classes/gateways/class.pmprogateway_twocheckout.php:166
6747
  #: classes/gateways/class.pmprogateway_twocheckout.php:156
6748
+ #: classes/gateways/class.pmprogateway_twocheckout.php:163
6749
  msgid "TwoCheckout INS URL"
6750
  msgstr "TwoCheckout INS URL"
6751
 
6752
  #: classes/gateways/class.pmprogateway_twocheckout.php:158
6753
  #: classes/gateways/class.pmprogateway_twocheckout.php:169
6754
  #: classes/gateways/class.pmprogateway_twocheckout.php:159
6755
+ #: classes/gateways/class.pmprogateway_twocheckout.php:166
6756
  msgid "To fully integrate with 2Checkout, be sure to use the following for your INS URL and Approved URL"
6757
  msgstr "Per integrar-te totalment amb 2Checkout, assegura’t d’utilitzar la següent INS URL i Approved URL"
6758
 
6760
  #: classes/gateways/class.pmprogateway_twocheckout.php:192
6761
  #: classes/gateways/class.pmprogateway_twocheckout.php:214
6762
  #: classes/gateways/class.pmprogateway_twocheckout.php:205
6763
+ #: classes/gateways/class.pmprogateway_twocheckout.php:212
6764
  msgid "Check Out with 2Checkout"
6765
  msgstr "Check Out amb 2Checkout"
6766
 
7198
  #: includes/functions.php:207
7199
  #: includes/functions.php:393
7200
  #: includes/functions.php:509
7201
+ #: includes/functions.php:397
7202
+ #: includes/functions.php:515
7203
  #, php-format
7204
  msgid "The price for membership is <strong>%s</strong> now"
7205
  msgstr "El preu per a la subscripció és <strong>%s</strong> ara"
7212
  #: includes/functions.php:209
7213
  #: includes/functions.php:398
7214
  #: includes/functions.php:511
7215
+ #: includes/functions.php:402
7216
+ #: includes/functions.php:517
7217
  #, php-format
7218
  msgid "<strong>%s</strong> now"
7219
  msgstr "<strong>%s</strong> ara"
7323
  #: includes/functions.php:271
7324
  #: pages/levels.php:82
7325
  #: includes/functions.php:446
7326
+ #: includes/functions.php:450
7327
  msgid "After your initial payment, your first payment is Free."
7328
  msgstr "Després del teu pagament inicial, el teu primer pagament és Gratuït."
7329
 
7339
  #: includes/functions.php:275
7340
  #: pages/levels.php:86
7341
  #: includes/functions.php:448
7342
+ #: includes/functions.php:452
7343
  #, php-format
7344
  msgid "After your initial payment, your first %d payments are Free."
7345
  msgstr "Després del teu pagament inicial, el teu %d pagaments són gratuïts."
7356
  #: includes/functions.php:282
7357
  #: pages/levels.php:93
7358
  #: includes/functions.php:452
7359
+ #: includes/functions.php:456
7360
  #, php-format
7361
  msgid "After your initial payment, your first payment will cost %s."
7362
  msgstr "Després del teu pagament inicial, el teu primer pagament és de %s."
7418
  #: includes/functions.php:592
7419
  #: includes/functions.php:615
7420
  #: includes/functions.php:979
7421
+ #: includes/functions.php:986
7422
  msgid "User ID not found."
7423
  msgstr "No s’ha trobat el teu ID d’usuari"
7424
 
7438
  #: includes/functions.php:635
7439
  #: includes/functions.php:1003
7440
  #: includes/functions.php:1011
7441
+ #: includes/functions.php:1010
7442
+ #: includes/functions.php:1018
7443
  msgid "Invalid level."
7444
  msgstr "Nivell no vàlid"
7445
 
7500
  #: includes/functions.php:723
7501
  #: includes/functions.php:746
7502
  #: includes/functions.php:1085
7503
+ #: includes/functions.php:1092
7504
  msgid "Error interacting with database"
7505
  msgstr "Error interactuant amb la base de dades"
7506
 
7537
  #: includes/functions.php:1342
7538
  #: includes/functions.php:1335
7539
  #: includes/functions.php:1373
7540
+ #: includes/functions.php:1343
7541
+ #: includes/functions.php:1382
7542
  msgid "Membership level not found."
7543
  msgstr "Nivell de subscripció no trobat."
7544
 
7554
  #: includes/functions.php:1196
7555
  #: includes/functions.php:1722
7556
  #: includes/functions.php:1753
7557
+ #: includes/functions.php:1767
7558
  msgid "No code was given to check."
7559
  msgstr "No s’ha donat cap codi per a fer el check"
7560
 
7577
  #: includes/functions.php:1205
7578
  #: includes/functions.php:1731
7579
  #: includes/functions.php:1762
7580
+ #: includes/functions.php:1776
7581
  msgid "The discount code could not be found."
7582
  msgstr "No s’ha trobat el codi de descompte"
7583
 
7600
  #: includes/functions.php:1220
7601
  #: includes/functions.php:1746
7602
  #: includes/functions.php:1777
7603
+ #: includes/functions.php:1791
7604
  #, php-format
7605
  msgid "This discount code goes into effect on %s."
7606
  msgstr "El codi de descompte serà efectiu a %s."
7624
  #: includes/functions.php:1227
7625
  #: includes/functions.php:1753
7626
  #: includes/functions.php:1784
7627
+ #: includes/functions.php:1798
7628
  #, php-format
7629
  msgid "This discount code expired on %s."
7630
  msgstr "Aquest codi de descompte ha expirat a %s."
7648
  #: includes/functions.php:1237
7649
  #: includes/functions.php:1762
7650
  #: includes/functions.php:1793
7651
+ #: includes/functions.php:1807
7652
  msgid "This discount code is no longer valid."
7653
  msgstr "Aquest codi de descompte ja no és vàlid."
7654
 
7670
  #: includes/functions.php:1250
7671
  #: includes/functions.php:1781
7672
  #: includes/functions.php:1812
7673
+ #: includes/functions.php:1826
7674
  msgid "This discount code does not apply to this membership level."
7675
  msgstr "Aquest codi de descompte no s’aplica a aquest nivell de subscripció."
7676
 
7693
  #: includes/functions.php:1276
7694
  #: includes/functions.php:1819
7695
  #: includes/functions.php:1850
7696
+ #: includes/functions.php:1864
7697
  msgid "This discount code is okay."
7698
  msgstr "El codi de descompte és OK"
7699
 
7716
  #: includes/functions.php:1395
7717
  #: includes/functions.php:1847
7718
  #: includes/functions.php:1878
7719
+ #: includes/functions.php:1894
7720
  msgid "and"
7721
  msgstr "i"
7722
 
7740
  #: includes/functions.php:1620
7741
  #: includes/functions.php:2409
7742
  #: includes/functions.php:2440
7743
+ #: includes/functions.php:2460
7744
+ #: includes/functions.php:2462
7745
  msgid "Sign Up for !!name!! Now"
7746
  msgstr "Sign Up per !!name!! Ara"
7747
 
7787
  #: includes/metaboxes.php:19
7788
  #: classes/class.pmproemail.php:888
7789
  #: classes/class.pmproemail.php:933
7790
+ #: adminpages/orders.php:587
7791
+ #: adminpages/orders.php:708
7792
+ #: classes/class.pmproemail.php:1021
7793
+ #: classes/class.pmproemail.php:1066
7794
  msgid "None"
7795
  msgstr "Cap"
7796
 
7802
  #: includes/license.php:81
7803
  #: adminpages/license.php:43
7804
  #: adminpages/license.php:33
7805
+ #: adminpages/license.php:45
7806
  msgid "Paid Memberships Pro Support License"
7807
  msgstr "Paid Memberships Pro Support License"
7808
 
7823
  #: adminpages/license.php:49
7824
  #: adminpages/dashboard.php:178
7825
  #: adminpages/license.php:41
7826
+ #: adminpages/license.php:53
7827
  msgid "Your license is invalid or expired."
7828
  msgstr "La teva license és invalida o ha expirat"
7829
 
7836
  #: adminpages/license.php:59
7837
  #: adminpages/license.php:51
7838
  #: adminpages/license.php:53
7839
+ #: adminpages/license.php:65
7840
  msgid "Enter license key here..."
7841
  msgstr "Introdueix license key aquí"
7842
 
7950
  #: includes/profile.php:255
7951
  #: includes/profile.php:186
7952
  #: includes/profile.php:233
7953
+ #: includes/profile.php:202
7954
+ #: includes/profile.php:249
7955
  msgid "Not paying."
7956
  msgstr "Sense pagament fet."
7957
 
8054
  #: adminpages/orders.php:1335
8055
  #: adminpages/dashboard.php:226
8056
  #: adminpages/dashboard.php:294
8057
+ #: adminpages/orders.php:1336
8058
+ #: adminpages/reports/login.php:185
8059
+ #: adminpages/orders.php:1429
8060
+ #: includes/profile.php:451
8061
+ #: includes/profile.php:536
8062
  msgid "Level"
8063
  msgstr "Nivell"
8064
 
8066
  #: pages/account.php:14
8067
  #: pages/billing.php:18
8068
  #: pages/billing.php:72
8069
+ #: pages/billing.php:73
8070
  msgid "Membership Fee"
8071
  msgstr "Preu de subscripció"
8072
 
8075
  #: pages/billing.php:22
8076
  #: pages/levels.php:70
8077
  #: pages/billing.php:76
8078
+ #: pages/billing.php:77
8079
  #, php-format
8080
  msgid "%s every %d %s."
8081
  msgstr "%s cada %d %s."
8085
  #: pages/billing.php:24
8086
  #: pages/levels.php:66
8087
  #: pages/billing.php:78
8088
+ #: pages/billing.php:79
8089
  #, php-format
8090
  msgid "%s per %s."
8091
  msgstr "%s per %s."
8096
  #: pages/billing.php:29
8097
  #: pages/billing.php:33
8098
  #: pages/billing.php:89
8099
+ #: pages/billing.php:90
8100
  msgid "Duration"
8101
  msgstr "Durada"
8102
 
8104
  #: pages/billing.php:39
8105
  #: pages/billing.php:43
8106
  #: pages/billing.php:128
8107
+ #: pages/billing.php:130
8108
  msgid "Your payment subscription is managed by PayPal. Please <a href=\"http://www.paypal.com\">login to PayPal here</a> to update your billing information."
8109
  msgstr "El pagament de la teva subscripció és gestionat per PayPal. Si us plau <a href=\"http://www.paypal.com\">login to PayPal aquí</a> per actualitzar la teva informació de pagament."
8110
 
8124
  #: pages/checkout.php:234
8125
  #: includes/profile.php:759
8126
  #: includes/profile.php:755
8127
+ #: pages/billing.php:166
8128
+ #: includes/profile.php:795
8129
  msgid "First Name"
8130
  msgstr "Nom"
8131
 
8145
  #: pages/checkout.php:238
8146
  #: includes/profile.php:760
8147
  #: includes/profile.php:756
8148
+ #: pages/billing.php:170
8149
+ #: includes/profile.php:796
8150
  msgid "Last Name"
8151
  msgstr "Cognoms"
8152
 
8163
  #: pages/checkout.php:336
8164
  #: pages/billing.php:174
8165
  #: pages/checkout.php:242
8166
+ #: pages/billing.php:176
8167
  msgid "Address 1"
8168
  msgstr "Adreça 1"
8169
 
8180
  #: pages/checkout.php:340
8181
  #: pages/billing.php:178
8182
  #: pages/checkout.php:246
8183
+ #: pages/billing.php:180
8184
  msgid "Address 2"
8185
  msgstr "Adreça 2"
8186
 
8197
  #: pages/checkout.php:350
8198
  #: pages/billing.php:188
8199
  #: pages/checkout.php:253
8200
+ #: pages/billing.php:191
8201
  msgid "City"
8202
  msgstr "Ciutat"
8203
 
8214
  #: pages/checkout.php:354
8215
  #: pages/billing.php:192
8216
  #: pages/checkout.php:257
8217
+ #: pages/billing.php:195
8218
  msgid "State"
8219
  msgstr "State/província"
8220
 
8231
  #: pages/checkout.php:358
8232
  #: pages/billing.php:196
8233
  #: pages/checkout.php:261
8234
+ #: pages/billing.php:199
8235
  msgid "Postal Code"
8236
  msgstr "Codi Postal"
8237
 
8248
  #: pages/checkout.php:367
8249
  #: pages/billing.php:205
8250
  #: pages/checkout.php:266
8251
+ #: pages/billing.php:208
8252
  msgid "City, State Zip"
8253
  msgstr "Ciutat, CP"
8254
 
8265
  #: pages/checkout.php:420
8266
  #: pages/billing.php:258
8267
  #: pages/checkout.php:303
8268
+ #: pages/billing.php:261
8269
  msgid "Country"
8270
  msgstr "País"
8271
 
8282
  #: pages/checkout.php:445
8283
  #: pages/billing.php:283
8284
  #: pages/checkout.php:319
8285
+ #: pages/billing.php:287
8286
  msgid "Phone"
8287
  msgstr "Telèfon"
8288
 
8306
  #: pages/billing.php:294
8307
  #: pages/checkout.php:164
8308
  #: pages/checkout.php:334
8309
+ #: pages/billing.php:298
8310
  msgid "Email Address"
8311
  msgstr "Correu electrònic"
8312
 
8323
  #: pages/checkout.php:469
8324
  #: pages/billing.php:298
8325
  #: pages/checkout.php:341
8326
+ #: pages/billing.php:302
8327
  msgid "Confirm Email"
8328
  msgstr "Confirma Correu electrònic"
8329
 
8332
  #: pages/billing.php:221
8333
  #: pages/billing.php:230
8334
  #: pages/billing.php:321
8335
+ #: pages/billing.php:325
8336
  msgid "Credit Card Information"
8337
  msgstr "Informació de la Tarjeta de Crèdit"
8338
 
8341
  #: pages/billing.php:221
8342
  #: pages/billing.php:230
8343
  #: pages/billing.php:322
8344
+ #: pages/billing.php:326
8345
  #, php-format
8346
  msgid "We accept %s"
8347
  msgstr "Acceptem %s"
8354
  #: pages/billing.php:356
8355
  #: pages/billing.php:467
8356
  #: pages/billing.php:477
8357
+ #: pages/billing.php:484
8358
  msgid "This subscription is not recurring. So you don't need to update your billing information."
8359
  msgstr "Aquesta subscripció no és recurrent. Per tant, no necessites actualitzar la teva informació de pagament."
8360
 
8579
  #: pages/checkout.php:681
8580
  #: pages/checkout.php:690
8581
  #: pages/checkout.php:476
8582
+ #: pages/checkout.php:478
8583
  #, php-format
8584
  msgid "I agree to the %s"
8585
  msgstr "Estic d’acord amb %s"
8593
  #: pages/checkout.php:701
8594
  #: pages/checkout.php:710
8595
  #: pages/checkout.php:514
8596
+ #: pages/checkout.php:526
8597
  msgid "Complete Payment"
8598
  msgstr "Completa pagament"
8599
 
8606
  #: pages/checkout.php:723
8607
  #: pages/checkout.php:732
8608
  #: pages/checkout.php:536
8609
+ #: pages/checkout.php:548
8610
  msgid "Processing..."
8611
  msgstr "Processant…"
8612
 
8648
  #: includes/profile.php:433
8649
  #: adminpages/orders.php:1423
8650
  #: adminpages/orders.php:1433
8651
+ #: adminpages/orders.php:391
8652
+ #: adminpages/orders.php:1424
8653
+ #: adminpages/orders.php:1434
8654
+ #: adminpages/orders.php:439
8655
+ #: adminpages/orders.php:1539
8656
+ #: adminpages/orders.php:1549
8657
+ #: includes/profile.php:473
8658
  msgid "Print"
8659
  msgstr "Imprimeix"
8660
 
8689
  #: pages/billing.php:96
8690
  #: pages/confirmation.php:95
8691
  #: pages/invoice.php:85
8692
+ #: pages/billing.php:98
8693
  msgid "Payment Method"
8694
  msgstr "Mètode de pagament"
8695
 
8705
  #: pages/invoice.php:97
8706
  #: pages/invoice.php:125
8707
  #: includes/profile.php:413
8708
+ #: includes/profile.php:453
8709
  msgid "Total Billed"
8710
  msgstr "Total facturat"
8711
 
8716
  #: pages/billing.php:98
8717
  #: pages/confirmation.php:97
8718
  #: pages/invoice.php:87
8719
+ #: pages/billing.php:100
8720
  msgid "ending in"
8721
  msgstr "acaba a"
8722
 
8730
  #: pages/confirmation.php:103
8731
  #: pages/confirmation.php:138
8732
  #: shortcodes/pmpro_account.php:247
8733
+ #: pages/confirmation.php:65
8734
  msgid "Pending"
8735
  msgstr "Pendent"
8736
 
8742
  #: pages/billing.php:131
8743
  #: pages/confirmation.php:149
8744
  #: pages/invoice.php:155
8745
+ #: pages/billing.php:127
8746
+ #: pages/billing.php:133
8747
  msgid "View Your Membership Account &rarr;"
8748
  msgstr "Mira el teu compte de subscripció &rarr;"
8749
 
8757
  #: pages/invoice.php:80
8758
  #: includes/functions.php:2857
8759
  #: includes/functions.php:2888
8760
+ #: includes/functions.php:2910
8761
+ #: includes/functions.php:2912
8762
  msgid "Coupon"
8763
  msgstr "Cupó"
8764
 
8784
  #: pages/levels.php:33
8785
  #: pages/levels.php:43
8786
  #: includes/functions.php:396
8787
+ #: includes/functions.php:400
8788
  msgid "Free"
8789
  msgstr "Gratuït"
8790
 
8843
  #: paid-memberships-pro.php:157
8844
  #: paid-memberships-pro.php:159
8845
  #: paid-memberships-pro.php:160
8846
+ #: paid-memberships-pro.php:166
8847
  msgid "Testing Only"
8848
  msgstr "Només test"
8849
 
8855
  #: paid-memberships-pro.php:162
8856
  #: paid-memberships-pro.php:164
8857
  #: paid-memberships-pro.php:165
8858
+ #: paid-memberships-pro.php:171
8859
  msgid "PayPal Payflow Pro/PayPal Pro"
8860
  msgstr "PayPal Payflow Pro/PayPal Pro"
8861
 
8867
  #: paid-memberships-pro.php:166
8868
  #: paid-memberships-pro.php:168
8869
  #: paid-memberships-pro.php:169
8870
+ #: paid-memberships-pro.php:175
8871
  msgid "Cybersource"
8872
  msgstr "Cybersource"
8873
 
8874
  #: paid-memberships-pro.php:156
8875
  #: paid-memberships-pro.php:194
8876
  #: paid-memberships-pro.php:195
8877
+ #: paid-memberships-pro.php:201
8878
  msgid "Once a month"
8879
  msgstr "Un cop al mes"
8880
 
8992
  #: classes/class.pmproemail.php:907
8993
  #: includes/email.php:459
8994
  #: classes/class.pmproemail.php:900
8995
+ #: classes/class.pmproemail.php:1033
8996
  msgid "Your membership has been cancelled."
8997
  msgstr "La teva subscripció ha estat cancel·lada."
8998
 
9292
  #: services/authnet-silent-post.php:173
9293
  #: services/authnet-silent-post.php:176
9294
  #: services/authnet-silent-post.php:177
9295
+ #: services/authnet-silent-post.php:178
9296
  msgid "<p>A payment is being held for review within Authorize.net.</p><p>Payment Information From Authorize.net"
9297
  msgstr "<p>Un pagament s’està revisant a Authorize.net.</p><p>Payment Information From Authorize.net"
9298
 
9309
  #: pages/account.php:19
9310
  #: includes/email-templates.php:68
9311
  #: shortcodes/pmpro_account.php:43
9312
+ #: adminpages/orders.php:1431
9313
  msgid "Billing"
9314
  msgstr "Facturació"
9315
 
9364
  #: includes/profile.php:921
9365
  #: includes/profile.php:880
9366
  #: includes/profile.php:917
9367
+ #: includes/profile.php:920
9368
+ #: includes/profile.php:957
9369
  msgid "Change Password"
9370
  msgstr "Canvia Clau"
9371
 
9464
  #: includes/profile.php:515
9465
  #: includes/profile.php:511
9466
  #: adminpages/advancedsettings.php:331
9467
+ #: adminpages/advancedsettings.php:338
9468
+ #: includes/profile.php:551
9469
  msgid "Never"
9470
  msgstr "Mai"
9471
 
9525
  #: adminpages/reports/login.php:28
9526
  #: adminpages/reports/login.php:29
9527
  #: adminpages/reports/login.php:189
9528
+ #: adminpages/reports/login.php:192
9529
  msgid "Visits All Time"
9530
  msgstr "Visites sempre"
9531
 
9537
  #: adminpages/reports/login.php:33
9538
  #: adminpages/reports/login.php:34
9539
  #: adminpages/reports/login.php:193
9540
+ #: adminpages/reports/login.php:196
9541
  msgid "Views All Time"
9542
  msgstr "Vistes sempre"
9543
 
9549
  #: adminpages/reports/login.php:38
9550
  #: adminpages/reports/login.php:39
9551
  #: adminpages/reports/login.php:198
9552
+ #: adminpages/reports/login.php:201
9553
  msgid "Logins All Time"
9554
  msgstr "Logins sempre"
9555
 
9650
  #: pages/account.php:87
9651
  #: pages/account.php:91
9652
  #: adminpages/emailtemplates.php:156
9653
+ #: adminpages/emailtemplates.php:149
9654
  msgid "Billing Information"
9655
  msgstr "Informació de Facturació"
9656
 
9767
  #: js/blocks.build.js:1342
9768
  #: js/blocks.build.js:1502
9769
  #: classes/class-pmpro-admin-activity-email.php:349
9770
+ #: blocks/account-invoices-section/block.js:47
9771
+ #: blocks/account-links-section/block.js:47
9772
+ #: blocks/account-membership-section/block.js:45
9773
+ #: blocks/account-page/block.js:72
9774
+ #: blocks/account-profile-section/block.js:45
9775
+ #: blocks/billing-page/block.js:44
9776
+ #: blocks/cancel-page/block.js:44
9777
+ #: blocks/checkout-page/block.js:58
9778
+ #: blocks/confirmation-page/block.js:46
9779
+ #: blocks/invoice-page/block.js:45
9780
+ #: blocks/levels-page/block.js:44
9781
+ #: blocks/member-profile-edit/block.js:37
9782
  msgid "Paid Memberships Pro"
9783
  msgstr ""
9784
 
9824
  #: classes/gateways/class.pmprogateway_stripe.php:76
9825
  #: classes/gateways/class.pmprogateway_stripe.php:82
9826
  #: classes/gateways/class.pmprogateway_stripe.php:1338
9827
+ #: classes/gateways/class.pmprogateway_stripe.php:1463
9828
  msgid "The Stripe Gateway requires PHP 5.3.29 or greater. We recommend upgrading to PHP %s or greater. Ask your host to upgrade."
9829
  msgstr ""
9830
 
9864
  #: adminpages/admin_header.php:226
9865
  #: includes/adminpages.php:52
9866
  #: includes/adminpages.php:158
9867
+ #: adminpages/reports/login.php:122
9868
+ #: adminpages/reports/login.php:102
9869
  msgid "Members"
9870
  msgstr ""
9871
 
9910
  #: adminpages/advancedsettings.php:106
9911
  #: includes/updates/upgrade_1.php:7
9912
  #: adminpages/advancedsettings.php:108
9913
+ #: adminpages/advancedsettings.php:116
9914
  msgid "This content is for !!levels!! members only.<br /><a href=\"%s\">Join Now</a>"
9915
  msgstr ""
9916
 
9917
  #: adminpages/advancedsettings.php:111
9918
  #: adminpages/advancedsettings.php:113
9919
+ #: adminpages/advancedsettings.php:121
9920
  msgid "This content is for !!levels!! members only.<br /><a href=\"%s\">Log In</a> <a href=\"%s\">Join Now</a>"
9921
  msgstr ""
9922
 
9923
  #: adminpages/advancedsettings.php:135
9924
  #: adminpages/advancedsettings.php:137
9925
+ #: adminpages/advancedsettings.php:144
9926
  msgid "Restrict Dashboard Access"
9927
  msgstr ""
9928
 
9929
  #: adminpages/advancedsettings.php:140
9930
  #: adminpages/advancedsettings.php:142
9931
+ #: adminpages/advancedsettings.php:149
9932
  msgid "WordPress Dashboard"
9933
  msgstr ""
9934
 
9935
  #: adminpages/advancedsettings.php:143
9936
  #: adminpages/advancedsettings.php:145
9937
+ #: adminpages/advancedsettings.php:152
9938
  msgid "Block all users with the Subscriber role from accessing the Dashboard."
9939
  msgstr ""
9940
 
9941
  #: adminpages/advancedsettings.php:148
9942
  #: adminpages/advancedsettings.php:150
9943
+ #: adminpages/advancedsettings.php:157
9944
  msgid "WordPress Toolbar"
9945
  msgstr ""
9946
 
9947
  #: adminpages/advancedsettings.php:151
9948
  #: adminpages/advancedsettings.php:153
9949
+ #: adminpages/advancedsettings.php:160
9950
  msgid "Hide the Toolbar from all users with the Subscriber role."
9951
  msgstr ""
9952
 
9953
  #: adminpages/advancedsettings.php:159
9954
  #: adminpages/advancedsettings.php:161
9955
+ #: adminpages/advancedsettings.php:168
9956
  msgid "Message Settings"
9957
  msgstr ""
9958
 
9960
  #: adminpages/advancedsettings.php:186
9961
  #: adminpages/advancedsettings.php:179
9962
  #: adminpages/advancedsettings.php:188
9963
+ #: adminpages/advancedsettings.php:195
9964
  msgid "Available variables"
9965
  msgstr ""
9966
 
9967
  #: adminpages/advancedsettings.php:224
9968
  #: adminpages/advancedsettings.php:226
9969
+ #: adminpages/advancedsettings.php:233
9970
  msgid "Checkout Settings"
9971
  msgstr ""
9972
 
9973
  #: adminpages/advancedsettings.php:257
9974
  #: adminpages/advancedsettings.php:272
9975
+ #: adminpages/advancedsettings.php:279
9976
  msgid "reCAPTCHA Version"
9977
  msgstr ""
9978
 
9979
  #: adminpages/advancedsettings.php:260
9980
  #: adminpages/advancedsettings.php:275
9981
+ #: adminpages/advancedsettings.php:282
9982
  msgid " v2 - Checkbox"
9983
  msgstr ""
9984
 
9985
  #: adminpages/advancedsettings.php:261
9986
  #: adminpages/advancedsettings.php:276
9987
+ #: adminpages/advancedsettings.php:283
9988
  msgid "v3 - Invisible"
9989
  msgstr ""
9990
 
9991
  #: adminpages/advancedsettings.php:263
9992
  #: adminpages/advancedsettings.php:278
9993
+ #: adminpages/advancedsettings.php:285
9994
  msgid "Changing your version will require new API keys."
9995
  msgstr ""
9996
 
9997
  #: adminpages/advancedsettings.php:267
9998
  #: adminpages/advancedsettings.php:282
9999
+ #: adminpages/advancedsettings.php:289
10000
  msgid "reCAPTCHA Site Key"
10001
  msgstr ""
10002
 
10003
  #: adminpages/advancedsettings.php:273
10004
  #: adminpages/advancedsettings.php:288
10005
+ #: adminpages/advancedsettings.php:295
10006
  msgid "reCAPTCHA Secret Key"
10007
  msgstr ""
10008
 
10009
  #: adminpages/advancedsettings.php:283
10010
  #: adminpages/advancedsettings.php:298
10011
+ #: adminpages/advancedsettings.php:305
10012
  msgid "Communication Settings"
10013
  msgstr ""
10014
 
10015
  #: adminpages/advancedsettings.php:286
10016
  #: adminpages/advancedsettings.php:301
10017
+ #: adminpages/advancedsettings.php:308
10018
  msgid "Notifications"
10019
  msgstr ""
10020
 
10021
  #: adminpages/advancedsettings.php:290
10022
  #: adminpages/advancedsettings.php:305
10023
+ #: adminpages/advancedsettings.php:312
10024
  msgid "Show all notifications."
10025
  msgstr ""
10026
 
10027
  #: adminpages/advancedsettings.php:293
10028
  #: adminpages/advancedsettings.php:308
10029
+ #: adminpages/advancedsettings.php:315
10030
  msgid "Show only security notifications."
10031
  msgstr ""
10032
 
10033
  #: adminpages/advancedsettings.php:297
10034
  #: adminpages/advancedsettings.php:312
10035
+ #: adminpages/advancedsettings.php:319
10036
  msgid "Notifications are occasionally shown on the Paid Memberships Pro settings pages."
10037
  msgstr ""
10038
 
10039
  #: adminpages/advancedsettings.php:302
10040
  #: adminpages/advancedsettings.php:317
10041
+ #: adminpages/advancedsettings.php:324
10042
  msgid "Activity Email Frequency"
10043
  msgstr ""
10044
 
10045
  #: adminpages/advancedsettings.php:310
10046
  #: adminpages/advancedsettings.php:325
10047
+ #: adminpages/advancedsettings.php:332
10048
  msgid "Weekly"
10049
  msgstr ""
10050
 
10051
  #: adminpages/advancedsettings.php:320
10052
  #: adminpages/advancedsettings.php:335
10053
+ #: adminpages/advancedsettings.php:342
10054
  msgid "Send periodic sales and revenue updates from this site to the administration email address."
10055
  msgstr ""
10056
 
10057
  #: adminpages/advancedsettings.php:473
10058
  #: adminpages/advancedsettings.php:475
10059
  #: adminpages/advancedsettings.php:490
10060
+ #: adminpages/advancedsettings.php:522
10061
  msgid "Uninstall PMPro on deletion?"
10062
  msgstr ""
10063
 
10064
  #: adminpages/advancedsettings.php:478
10065
  #: adminpages/advancedsettings.php:480
10066
  #: adminpages/advancedsettings.php:495
10067
+ #: adminpages/advancedsettings.php:527
10068
  msgid "Yes - Delete all PMPro Data."
10069
  msgstr ""
10070
 
10090
 
10091
  #: adminpages/dashboard.php:113
10092
  #: adminpages/membershiplevels.php:779
10093
+ #: adminpages/membershiplevels.php:780
10094
  msgid "Create a Membership Level"
10095
  msgstr ""
10096
 
10161
  #: adminpages/license.php:43
10162
  #: adminpages/dashboard.php:183
10163
  #: adminpages/license.php:45
10164
+ #: adminpages/license.php:57
10165
  msgid "<strong>Thank you!</strong> A valid <strong>%s</strong> license key has been used to activate your support license on this site."
10166
  msgstr ""
10167
 
10265
  #: adminpages/orders.php:1489
10266
  #: adminpages/dashboard.php:323
10267
  #: adminpages/dashboard.php:338
10268
+ #: adminpages/orders.php:1478
10269
+ #: adminpages/orders.php:1490
10270
+ #: adminpages/orders.php:1602
10271
  msgid "none"
10272
  msgstr ""
10273
 
10306
  #: adminpages/discountcodes.php:622
10307
  #: adminpages/membershiplevels.php:450
10308
  #: adminpages/discountcodes.php:624
10309
+ #: adminpages/membershiplevels.php:448
10310
  msgid "Stripe integration does not allow billing periods longer than 1 year."
10311
  msgstr ""
10312
 
10319
  #: adminpages/discountcodes.php:697
10320
  #: adminpages/membershiplevels.php:580
10321
  #: adminpages/discountcodes.php:699
10322
+ #: adminpages/discountcodes.php:700
10323
+ #: adminpages/membershiplevels.php:581
10324
  msgid "Hour(s)"
10325
  msgstr ""
10326
 
10327
  #: adminpages/discountcodes.php:754
10328
  #: adminpages/discountcodes.php:756
10329
+ #: adminpages/discountcodes.php:755
10330
  msgid "No Discount Codes Found"
10331
  msgstr ""
10332
 
10333
  #: adminpages/discountcodes.php:755
10334
  #: adminpages/discountcodes.php:757
10335
+ #: adminpages/discountcodes.php:756
10336
  msgid "Discount codes allow you to override your membership level's default pricing."
10337
  msgstr ""
10338
 
10339
  #: adminpages/discountcodes.php:756
10340
  #: adminpages/discountcodes.php:758
10341
+ #: adminpages/discountcodes.php:757
10342
  msgid "Create a Discount Code"
10343
  msgstr ""
10344
 
10345
  #: adminpages/discountcodes.php:757
10346
  #: adminpages/discountcodes.php:759
10347
+ #: adminpages/discountcodes.php:758
10348
  msgid "Documentation: Discount Codes"
10349
  msgstr ""
10350
 
10351
  #: adminpages/discountcodes.php:766
10352
  #: adminpages/discountcodes.php:768
10353
+ #: adminpages/discountcodes.php:778
10354
+ #: adminpages/discountcodes.php:971
10355
  msgid "%d discount codes found."
10356
  msgstr ""
10357
 
10375
  #: includes/profile.php:430
10376
  #: adminpages/orders.php:1388
10377
  #: adminpages/orders.php:1398
10378
+ #: adminpages/orders.php:1389
10379
+ #: adminpages/orders.php:1399
10380
+ #: adminpages/discountcodes.php:840
10381
+ #: adminpages/discountcodes.php:850
10382
+ #: adminpages/membershiplevels.php:856
10383
+ #: adminpages/membershiplevels.php:866
10384
+ #: adminpages/orders.php:1504
10385
+ #: adminpages/orders.php:1514
10386
+ #: includes/profile.php:470
10387
  msgid "Edit"
10388
  msgstr ""
10389
 
10400
  #: adminpages/discountcodes.php:860
10401
  #: adminpages/orders.php:1402
10402
  #: adminpages/orders.php:1413
10403
+ #: adminpages/orders.php:1403
10404
+ #: adminpages/orders.php:1414
10405
+ #: adminpages/discountcodes.php:854
10406
+ #: adminpages/discountcodes.php:865
10407
+ #: adminpages/membershiplevels.php:870
10408
+ #: adminpages/membershiplevels.php:881
10409
+ #: adminpages/orders.php:1518
10410
+ #: adminpages/orders.php:1529
10411
  msgid "Copy"
10412
  msgstr ""
10413
 
10416
  msgstr ""
10417
 
10418
  #: adminpages/emailsettings.php:87
10419
+ #: adminpages/emailsettings.php:86
10420
  msgid "Send Emails From"
10421
  msgstr ""
10422
 
10423
  #: adminpages/emailsettings.php:119
10424
  #: adminpages/emailsettings.php:173
10425
+ #: adminpages/emailsettings.php:118
10426
  msgid "Save All Settings"
10427
  msgstr ""
10428
 
10429
  #: adminpages/emailsettings.php:122
10430
+ #: adminpages/emailsettings.php:121
10431
  msgid "Email Deliverability"
10432
  msgstr ""
10433
 
10468
  msgstr ""
10469
 
10470
  #: adminpages/emailtemplates.php:23
10471
+ #: adminpages/emailtemplates.php:21
10472
  msgid "Select an email template from the dropdown below to customize the subject and body of emails sent through your membership site. You can also disable a specific email or send a test version through this admin page."
10473
  msgstr ""
10474
 
10475
  #: adminpages/emailtemplates.php:23
10476
+ #: adminpages/emailtemplates.php:21
10477
  msgid "Click here for a description of each email sent to your members and admins at different stages of the member experience."
10478
  msgstr ""
10479
 
10480
  #: adminpages/emailtemplates.php:38
10481
+ #: adminpages/emailtemplates.php:36
10482
  msgid "Email Template"
10483
  msgstr ""
10484
 
10485
  #: adminpages/emailtemplates.php:42
10486
+ #: adminpages/emailtemplates.php:40
10487
  msgid "Select a Template to Edit"
10488
  msgstr ""
10489
 
10490
  #: adminpages/emailtemplates.php:58
10491
+ #: adminpages/emailtemplates.php:56
10492
  msgid "Disable this email?"
10493
  msgstr ""
10494
 
10495
  #: adminpages/emailtemplates.php:61
10496
+ #: adminpages/emailtemplates.php:59
10497
  msgid "Emails with this template will not be sent."
10498
  msgstr ""
10499
 
10500
  #: adminpages/emailtemplates.php:66
10501
+ #: adminpages/emailtemplates.php:64
10502
  msgid "Subject"
10503
  msgstr ""
10504
 
10505
  #: adminpages/emailtemplates.php:73
10506
+ #: adminpages/emailtemplates.php:71
10507
  msgid "Body"
10508
  msgstr ""
10509
 
10510
  #: adminpages/emailtemplates.php:84
10511
+ #: adminpages/emailtemplates.php:82
10512
  msgid "Send a test email to "
10513
  msgstr ""
10514
 
10515
  #: adminpages/emailtemplates.php:87
10516
+ #: adminpages/emailtemplates.php:85
10517
  msgid "Save Template and Send Email"
10518
  msgstr ""
10519
 
10520
  #: adminpages/emailtemplates.php:92
10521
+ #: adminpages/emailtemplates.php:90
10522
  msgid "Your current membership will be used for any membership level data."
10523
  msgstr ""
10524
 
10525
  #: adminpages/emailtemplates.php:101
10526
+ #: adminpages/emailtemplates.php:99
10527
  msgid "Save Template"
10528
  msgstr ""
10529
 
10530
  #: adminpages/emailtemplates.php:104
10531
+ #: adminpages/emailtemplates.php:102
10532
  msgid "Reset Template"
10533
  msgstr ""
10534
 
10535
  #: adminpages/emailtemplates.php:114
10536
+ #: adminpages/emailtemplates.php:112
10537
  msgid "Variable Reference"
10538
  msgstr ""
10539
 
10540
  #: adminpages/emailtemplates.php:116
10541
+ #: adminpages/emailtemplates.php:114
10542
  msgid "Use the placeholder variables below to customize your member and admin emails with specific user or membership data."
10543
  msgstr ""
10544
 
10545
  #: adminpages/emailtemplates.php:120
10546
+ #: adminpages/emailtemplates.php:116
10547
  msgid "General Settings / Membership Info"
10548
  msgstr ""
10549
 
10550
  #: adminpages/emailtemplates.php:126
10551
  #: adminpages/emailtemplates.php:136
10552
+ #: adminpages/emailtemplates.php:121
10553
+ #: adminpages/emailtemplates.php:131
10554
  msgid "Display Name (Profile/Edit User > Display name publicly as)"
10555
  msgstr ""
10556
 
10557
  #: adminpages/emailtemplates.php:128
10558
+ #: adminpages/emailtemplates.php:123
10559
  msgid "Site Title"
10560
  msgstr ""
10561
 
10562
  #: adminpages/emailtemplates.php:129
10563
+ #: adminpages/emailtemplates.php:124
10564
  msgid "Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)"
10565
  msgstr ""
10566
 
10567
  #: adminpages/emailtemplates.php:131
10568
+ #: adminpages/emailtemplates.php:126
10569
  msgid "Membership Level Name"
10570
  msgstr ""
10571
 
10572
  #: adminpages/emailtemplates.php:132
10573
+ #: adminpages/emailtemplates.php:127
10574
  msgid "Membership Level Change"
10575
  msgstr ""
10576
 
10577
  #: adminpages/emailtemplates.php:133
10578
+ #: adminpages/emailtemplates.php:128
10579
  msgid "Membership Level Expiration"
10580
  msgstr ""
10581
 
10582
  #: adminpages/emailtemplates.php:134
10583
+ #: adminpages/emailtemplates.php:129
10584
  msgid "Membership Start Date"
10585
  msgstr ""
10586
 
10587
  #: adminpages/emailtemplates.php:135
10588
+ #: adminpages/emailtemplates.php:130
10589
  msgid "Membership End Date"
10590
  msgstr ""
10591
 
10592
  #: adminpages/emailtemplates.php:137
10593
  #: classes/class.memberorder.php:960
10594
  #: classes/class.memberorder.php:1002
10595
+ #: adminpages/emailtemplates.php:132
10596
+ #: classes/class.memberorder.php:1011
10597
  msgid "User Email"
10598
  msgstr ""
10599
 
10600
  #: adminpages/emailtemplates.php:138
10601
+ #: adminpages/emailtemplates.php:133
10602
  msgid "Login URL"
10603
  msgstr ""
10604
 
10605
  #: adminpages/emailtemplates.php:139
10606
+ #: adminpages/emailtemplates.php:134
10607
  msgid "Membership Levels Page URL"
10608
  msgstr ""
10609
 
10610
  #: adminpages/emailtemplates.php:162
10611
+ #: adminpages/emailtemplates.php:154
10612
  msgid "Billing Info Complete Address"
10613
  msgstr ""
10614
 
10615
  #: adminpages/emailtemplates.php:163
10616
+ #: adminpages/emailtemplates.php:155
10617
  msgid "Billing Info Name"
10618
  msgstr ""
10619
 
10620
  #: adminpages/emailtemplates.php:164
10621
+ #: adminpages/emailtemplates.php:156
10622
  msgid "Billing Info Street Address"
10623
  msgstr ""
10624
 
10625
  #: adminpages/emailtemplates.php:165
10626
+ #: adminpages/emailtemplates.php:157
10627
  msgid "Billing Info City"
10628
  msgstr ""
10629
 
10630
  #: adminpages/emailtemplates.php:166
10631
+ #: adminpages/emailtemplates.php:158
10632
  msgid "Billing Info State"
10633
  msgstr ""
10634
 
10635
  #: adminpages/emailtemplates.php:167
10636
+ #: adminpages/emailtemplates.php:159
10637
  msgid "Billing Info ZIP Code"
10638
  msgstr ""
10639
 
10640
  #: adminpages/emailtemplates.php:168
10641
+ #: adminpages/emailtemplates.php:160
10642
  msgid "Billing Info Country"
10643
  msgstr ""
10644
 
10645
  #: adminpages/emailtemplates.php:169
10646
+ #: adminpages/emailtemplates.php:161
10647
  msgid "Billing Info Phone #"
10648
  msgstr ""
10649
 
10650
  #: adminpages/emailtemplates.php:170
10651
  #: includes/privacy.php:363
10652
+ #: adminpages/emailtemplates.php:162
10653
  msgid "Credit Card Type"
10654
  msgstr ""
10655
 
10656
  #: adminpages/emailtemplates.php:171
10657
+ #: adminpages/emailtemplates.php:163
10658
  msgid "Credit Card Number (last 4 digits)"
10659
  msgstr ""
10660
 
10661
  #: adminpages/emailtemplates.php:172
10662
+ #: adminpages/emailtemplates.php:164
10663
  msgid "Credit Card Expiration Month (mm format)"
10664
  msgstr ""
10665
 
10666
  #: adminpages/emailtemplates.php:173
10667
+ #: adminpages/emailtemplates.php:165
10668
  msgid "Credit Card Expiration Year (yyyy format)"
10669
  msgstr ""
10670
 
10671
  #: adminpages/emailtemplates.php:174
10672
+ #: adminpages/emailtemplates.php:166
10673
  msgid "Membership Level Cost Text"
10674
  msgstr ""
10675
 
10676
  #: adminpages/emailtemplates.php:175
10677
+ #: adminpages/emailtemplates.php:167
10678
  msgid "Payment Instructions (used in Checkout - Email Template)"
10679
  msgstr ""
10680
 
10681
  #: adminpages/emailtemplates.php:176
10682
  #: includes/profile.php:423
10683
  #: includes/profile.php:410
10684
+ #: adminpages/emailtemplates.php:168
10685
+ #: includes/profile.php:450
10686
  msgid "Invoice ID"
10687
  msgstr ""
10688
 
10689
  #: adminpages/emailtemplates.php:177
10690
+ #: adminpages/emailtemplates.php:169
10691
  msgid "Invoice Total"
10692
  msgstr ""
10693
 
10694
  #: adminpages/emailtemplates.php:178
10695
+ #: adminpages/emailtemplates.php:170
10696
  msgid "Invoice Date"
10697
  msgstr ""
10698
 
10699
  #: adminpages/emailtemplates.php:179
10700
+ #: adminpages/emailtemplates.php:171
10701
  msgid "Invoice Page URL"
10702
  msgstr ""
10703
 
10704
  #: adminpages/emailtemplates.php:180
10705
+ #: adminpages/emailtemplates.php:172
10706
  msgid "Discount Code Applied"
10707
  msgstr ""
10708
 
10720
  #: adminpages/license.php:61
10721
  #: adminpages/license.php:53
10722
  #: adminpages/license.php:55
10723
+ #: adminpages/license.php:67
10724
  msgid "Validate Key"
10725
  msgstr ""
10726
 
10728
  #: adminpages/license.php:87
10729
  #: adminpages/license.php:86
10730
  #: adminpages/license.php:92
10731
+ #: adminpages/license.php:94
10732
  msgid "Paid Memberships Pro and our Add Ons are distributed under the <a href=\"%s\" title=\"GPLv2 license\" target=\"_blank\">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge."
10733
  msgstr ""
10734
 
10735
  #: adminpages/membershiplevels.php:391
10736
+ #: adminpages/membershiplevels.php:389
10737
  msgid "Check to include this message in the membership confirmation email."
10738
  msgstr ""
10739
 
10740
  #: adminpages/membershiplevels.php:459
10741
+ #: adminpages/membershiplevels.php:457
10742
  msgid "You will need to create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to %s."
10743
  msgstr ""
10744
 
10755
  msgstr ""
10756
 
10757
  #: adminpages/membershiplevels.php:640
10758
+ #: adminpages/membershiplevels.php:641
10759
  msgid "Non-members will not see posts in these categories. You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
10760
  msgstr ""
10761
 
10762
  #: adminpages/membershiplevels.php:644
10763
+ #: adminpages/membershiplevels.php:645
10764
  msgid "Non-members will see the title and excerpt for posts in these categories. You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
10765
  msgstr ""
10766
 
10767
  #: adminpages/membershiplevels.php:647
10768
+ #: adminpages/membershiplevels.php:648
10769
  msgid "Non-members will see the title only for posts in these categories. You can <a href=\"%s\" title=\"Advanced Settings\" target=\"_blank\">update this setting here</a>."
10770
  msgstr ""
10771
 
10772
  #: adminpages/membershiplevels.php:778
10773
  #: adminpages/membershiplevels.php:819
10774
+ #: adminpages/membershiplevels.php:779
10775
+ #: adminpages/membershiplevels.php:817
10776
  msgid "No Membership Levels Found"
10777
  msgstr ""
10778
 
10779
  #: adminpages/membershiplevels.php:780
10780
+ #: adminpages/membershiplevels.php:781
10781
  msgid "Video: Membership Levels"
10782
  msgstr ""
10783
 
10784
  #: adminpages/memberslist.php:41
10785
+ #: adminpages/memberslist.php:40
10786
  msgid "Optional: Capture additional member profile fields using the <a href=\"%s\" title=\"Paid Memberships Pro - Register Helper Add On\" target=\"_blank\">Register Helper Add On</a>."
10787
  msgstr ""
10788
 
10791
  #: adminpages/orders.php:868
10792
  #: includes/profile.php:85
10793
  #: adminpages/orders.php:860
10794
+ #: adminpages/orders.php:861
10795
+ #: adminpages/orders.php:525
10796
+ #: includes/profile.php:95
10797
  msgid "at"
10798
  msgstr ""
10799
 
10800
  #: adminpages/orders.php:908
10801
  #: adminpages/orders.php:914
10802
  #: adminpages/orders.php:906
10803
+ #: adminpages/orders.php:907
10804
+ #: adminpages/orders.php:990
10805
  msgid "TOS Consent"
10806
  msgstr ""
10807
 
10808
  #: adminpages/orders.php:1024
10809
  #: adminpages/orders.php:1030
10810
  #: adminpages/orders.php:1022
10811
+ #: adminpages/orders.php:1023
10812
+ #: adminpages/orders.php:1111
10813
  msgid "With a Discount Code"
10814
  msgstr ""
10815
 
10816
  #: adminpages/orders.php:1028
10817
  #: adminpages/orders.php:1034
10818
  #: adminpages/orders.php:1026
10819
+ #: adminpages/orders.php:1027
10820
+ #: adminpages/orders.php:1115
10821
  msgid "Only Paid Orders"
10822
  msgstr ""
10823
 
10824
  #: adminpages/orders.php:1030
10825
  #: adminpages/orders.php:1036
10826
  #: adminpages/orders.php:1028
10827
+ #: adminpages/orders.php:1029
10828
+ #: adminpages/orders.php:1117
10829
  msgid "Only Free Orders"
10830
  msgstr ""
10831
 
10832
  #: adminpages/orders.php:1073
10833
  #: adminpages/orders.php:1079
10834
  #: adminpages/orders.php:1071
10835
+ #: adminpages/orders.php:1072
10836
+ #: adminpages/orders.php:1160
10837
  msgid "Last Month"
10838
  msgstr ""
10839
 
10840
  #: adminpages/orders.php:1077
10841
  #: adminpages/orders.php:1083
10842
  #: adminpages/orders.php:1075
10843
+ #: adminpages/orders.php:1076
10844
+ #: adminpages/orders.php:1164
10845
  msgid "Last Year"
10846
  msgstr ""
10847
 
10880
  #: adminpages/pagesettings.php:174
10881
  #: adminpages/pagesettings.php:189
10882
  #: adminpages/pagesettings.php:193
10883
+ #: adminpages/pagesettings.php:192
10884
  msgid "Manage Pages"
10885
  msgstr ""
10886
 
10887
  #: adminpages/pagesettings.php:175
10888
  #: adminpages/pagesettings.php:190
10889
  #: adminpages/pagesettings.php:194
10890
+ #: adminpages/pagesettings.php:193
10891
  msgid "Several frontend pages are required for your Paid Memberships Pro site."
10892
  msgstr ""
10893
 
10894
  #: adminpages/pagesettings.php:176
10895
  #: adminpages/pagesettings.php:191
10896
  #: adminpages/pagesettings.php:195
10897
+ #: adminpages/pagesettings.php:194
10898
  msgid "Generate Pages For Me"
10899
  msgstr ""
10900
 
10901
  #: adminpages/pagesettings.php:177
10902
  #: adminpages/pagesettings.php:192
10903
  #: adminpages/pagesettings.php:196
10904
+ #: adminpages/pagesettings.php:195
10905
  msgid "Create Pages Manually"
10906
  msgstr ""
10907
 
10908
  #: adminpages/pagesettings.php:199
10909
  #: adminpages/pagesettings.php:221
10910
  #: adminpages/pagesettings.php:225
10911
+ #: adminpages/pagesettings.php:224
10912
  msgid "or the Membership Account block"
10913
  msgstr ""
10914
 
10915
  #: adminpages/pagesettings.php:216
10916
  #: adminpages/pagesettings.php:245
10917
  #: adminpages/pagesettings.php:249
10918
+ #: adminpages/pagesettings.php:248
10919
  msgid "or the Membership Billing block"
10920
  msgstr ""
10921
 
10922
  #: adminpages/pagesettings.php:233
10923
  #: adminpages/pagesettings.php:269
10924
  #: adminpages/pagesettings.php:273
10925
+ #: adminpages/pagesettings.php:272
10926
  msgid "or the Membership Cancel block"
10927
  msgstr ""
10928
 
10929
  #: adminpages/pagesettings.php:251
10930
  #: adminpages/pagesettings.php:294
10931
  #: adminpages/pagesettings.php:298
10932
+ #: adminpages/pagesettings.php:297
10933
  msgid "or the Membership Checkout block"
10934
  msgstr ""
10935
 
10936
  #: adminpages/pagesettings.php:269
10937
  #: adminpages/pagesettings.php:319
10938
  #: adminpages/pagesettings.php:323
10939
+ #: adminpages/pagesettings.php:322
10940
  msgid "or the Membership Confirmation block"
10941
  msgstr ""
10942
 
10943
  #: adminpages/pagesettings.php:287
10944
  #: adminpages/pagesettings.php:344
10945
  #: adminpages/pagesettings.php:348
10946
+ #: adminpages/pagesettings.php:347
10947
  msgid "or the Membership Invoice block"
10948
  msgstr ""
10949
 
10950
  #: adminpages/pagesettings.php:305
10951
  #: adminpages/pagesettings.php:369
10952
  #: adminpages/pagesettings.php:373
10953
+ #: adminpages/pagesettings.php:372
10954
  msgid "or the Membership Levels block"
10955
  msgstr ""
10956
 
10957
  #: adminpages/pagesettings.php:315
10958
  #: adminpages/pagesettings.php:379
10959
  #: adminpages/pagesettings.php:383
10960
+ #: adminpages/pagesettings.php:382
10961
  msgid "Optional: Customize your Membership Levels page using the <a href=\"%s\" title=\"Paid Memberships Pro - Advanced Levels Page Add On\" target=\"_blank\">Advanced Levels Page Add On</a>."
10962
  msgstr ""
10963
 
10964
  #: adminpages/pagesettings.php:321
10965
  #: adminpages/pagesettings.php:385
10966
  #: adminpages/pagesettings.php:389
10967
+ #: adminpages/pagesettings.php:388
10968
  msgid "Log In Page"
10969
  msgstr ""
10970
 
10974
  #: adminpages/pagesettings.php:421
10975
  #: adminpages/pagesettings.php:396
10976
  #: adminpages/pagesettings.php:425
10977
+ #: adminpages/pagesettings.php:395
10978
+ #: adminpages/pagesettings.php:424
10979
  msgid "Use WordPress Default"
10980
  msgstr ""
10981
 
10982
  #: adminpages/pagesettings.php:344
10983
  #: adminpages/pagesettings.php:409
10984
  #: adminpages/pagesettings.php:413
10985
+ #: adminpages/pagesettings.php:412
10986
  msgid "Include the shortcode %s or the Log In Form block."
10987
  msgstr ""
10988
 
10990
  #: includes/adminpages.php:358
10991
  #: adminpages/pagesettings.php:414
10992
  #: adminpages/pagesettings.php:418
10993
+ #: adminpages/pagesettings.php:417
10994
  msgid "Member Profile Edit Page"
10995
  msgstr ""
10996
 
10997
  #: adminpages/pagesettings.php:372
10998
  #: adminpages/pagesettings.php:438
10999
  #: adminpages/pagesettings.php:442
11000
+ #: adminpages/pagesettings.php:441
11001
  msgid "Include the shortcode %s or the Member Profile Edit block."
11002
  msgstr ""
11003
 
11004
  #: adminpages/pagesettings.php:382
11005
  #: adminpages/pagesettings.php:448
11006
  #: adminpages/pagesettings.php:452
11007
+ #: adminpages/pagesettings.php:451
11008
  msgid "Optional: Collect additional member fields at checkout, on the profile, or for admin-use only using the <a href=\"%s\" title=\"Paid Memberships Pro - Register Helper Add On\" target=\"_blank\">Register Helper Add On</a>."
11009
  msgstr ""
11010
 
11013
  msgstr ""
11014
 
11015
  #: adminpages/paymentsettings.php:142
11016
+ #: adminpages/paymentsettings.php:147
11017
+ #: adminpages/paymentsettings.php:145
11018
  msgid "This gateway is for membership sites with Free levels or for sites that accept payment offline."
11019
  msgstr ""
11020
 
11021
  #: adminpages/paymentsettings.php:142
11022
+ #: adminpages/paymentsettings.php:149
11023
+ #: adminpages/paymentsettings.php:147
11024
  msgid "It is not connected to a live gateway environment and cannot accept payments."
11025
  msgstr ""
11026
 
11029
  msgstr ""
11030
 
11031
  #: adminpages/paymentsettings.php:260
11032
+ #: adminpages/paymentsettings.php:273
11033
+ #: adminpages/paymentsettings.php:271
11034
  msgid "Your Site URL starts with https:// and so PMPro will allow your entire site to be served over HTTPS."
11035
  msgstr ""
11036
 
11062
  #: adminpages/reports/history.php:47
11063
  #: classes/class.memberorder.php:967
11064
  #: classes/class.memberorder.php:1009
11065
+ #: classes/class.memberorder.php:1018
11066
  msgid "Edit User"
11067
  msgstr ""
11068
 
11073
  #: adminpages/reports/history.php:188
11074
  #: includes/profile.php:411
11075
  #: includes/profile.php:389
11076
+ #: includes/profile.php:429
11077
  msgid "Total Paid"
11078
  msgstr ""
11079
 
11086
  msgstr ""
11087
 
11088
  #: adminpages/reports/login.php:186
11089
+ #: adminpages/reports/login.php:189
11090
  msgid "Visits This Week"
11091
  msgstr ""
11092
 
11093
  #: adminpages/reports/login.php:188
11094
+ #: adminpages/reports/login.php:191
11095
  msgid "Visits This Year"
11096
  msgstr ""
11097
 
11098
  #: adminpages/reports/login.php:190
11099
+ #: adminpages/reports/login.php:193
11100
  msgid "Views This Week"
11101
  msgstr ""
11102
 
11103
  #: adminpages/reports/login.php:192
11104
+ #: adminpages/reports/login.php:195
11105
  msgid "Views This Year"
11106
  msgstr ""
11107
 
11108
  #: adminpages/reports/login.php:195
11109
+ #: adminpages/reports/login.php:198
11110
  msgid "Logins This Week"
11111
  msgstr ""
11112
 
11113
  #: adminpages/reports/login.php:197
11114
+ #: adminpages/reports/login.php:200
11115
  msgid "Logins This Year"
11116
  msgstr ""
11117
 
11118
  #: adminpages/reports/memberships.php:356
11119
+ #: adminpages/reports/memberships.php:355
11120
  msgid "All Paid Levels"
11121
  msgstr ""
11122
 
11123
  #: adminpages/reports/memberships.php:357
11124
+ #: adminpages/reports/memberships.php:356
11125
  msgid "All Free Levels"
11126
  msgstr ""
11127
 
11128
  #: adminpages/reports/memberships.php:377
11129
  #: adminpages/reports/sales.php:334
11130
  #: adminpages/reports/sales.php:352
11131
+ #: adminpages/reports/memberships.php:376
11132
  msgid "All Codes"
11133
  msgstr ""
11134
 
11135
  #: adminpages/reports/sales.php:345
11136
  #: adminpages/reports/sales.php:364
11137
+ #: adminpages/reports/sales.php:365
11138
  msgid "Average line calculated using data prior to current day, month, or year."
11139
  msgstr ""
11140
 
11292
  #: shortcodes/pmpro_account.php:145
11293
  #: classes/class-pmpro-members-list-table.php:541
11294
  #: classes/class-pmpro-members-list-table.php:570
11295
+ #: classes/class-pmpro-members-list-table.php:576
11296
+ #: adminpages/orders.php:1614
11297
+ #: adminpages/orders.php:1679
11298
+ #: adminpages/orders.php:1730
11299
  msgid "&#8212;"
11300
  msgstr ""
11301
 
11302
  #: classes/class.memberorder.php:962
11303
  #: classes/class.memberorder.php:1004
11304
+ #: classes/class.memberorder.php:1013
11305
  msgid "User Display Name"
11306
  msgstr ""
11307
 
11308
  #: classes/class.memberorder.php:968
11309
  #: classes/class.memberorder.php:1010
11310
+ #: adminpages/orders.php:438
11311
+ #: classes/class.memberorder.php:1019
11312
  msgid "Edit Order"
11313
  msgstr ""
11314
 
11315
  #: classes/class.memberorder.php:1141
11316
  #: classes/class.memberorder.php:1183
11317
+ #: classes/class.memberorder.php:1192
11318
  msgid "This is a test order used with the PMPro Email Templates addon."
11319
  msgstr ""
11320
 
11321
  #: classes/class.pmproemail.php:371
11322
  #: classes/class.pmproemail.php:377
11323
  #: classes/class.pmproemail.php:370
11324
+ #: classes/class.pmproemail.php:503
11325
  msgid "Member checkout for %s at %s"
11326
  msgstr ""
11327
 
11328
  #: classes/class.pmproemail.php:565
11329
  #: classes/class.pmproemail.php:577
11330
  #: classes/class.pmproemail.php:570
11331
+ #: classes/class.pmproemail.php:703
11332
  msgid "Membership payment failed at %s"
11333
  msgstr ""
11334
 
11335
  #: classes/class.pmproemail.php:614
11336
  #: classes/class.pmproemail.php:626
11337
  #: classes/class.pmproemail.php:619
11338
+ #: classes/class.pmproemail.php:752
11339
  msgid "Membership payment failed For %s at %s"
11340
  msgstr ""
11341
 
11342
  #: classes/class.pmproemail.php:663
11343
  #: classes/class.pmproemail.php:675
11344
  #: classes/class.pmproemail.php:668
11345
+ #: classes/class.pmproemail.php:801
11346
  msgid "Credit card on file expiring soon at %s"
11347
  msgstr ""
11348
 
11349
  #: classes/class.pmproemail.php:715
11350
  #: classes/class.pmproemail.php:727
11351
  #: classes/class.pmproemail.php:720
11352
+ #: classes/class.pmproemail.php:853
11353
  msgid "Invoice for %s membership"
11354
  msgstr ""
11355
 
11362
  #: includes/email.php:465
11363
  #: classes/class.pmproemail.php:898
11364
  #: classes/class.pmproemail.php:943
11365
+ #: classes/class.pmproemail.php:1031
11366
+ #: classes/class.pmproemail.php:1076
11367
  msgid "The new level is %s."
11368
  msgstr ""
11369
 
11376
  #: includes/email.php:475
11377
  #: classes/class.pmproemail.php:909
11378
  #: classes/class.pmproemail.php:954
11379
+ #: classes/class.pmproemail.php:1042
11380
+ #: classes/class.pmproemail.php:1087
11381
  msgid "This membership does not expire."
11382
  msgstr ""
11383
 
11384
  #: classes/class.pmproemail.php:940
11385
  #: classes/class.pmproemail.php:952
11386
  #: classes/class.pmproemail.php:945
11387
+ #: classes/class.pmproemail.php:1078
11388
  msgid "Membership has been cancelled."
11389
  msgstr ""
11390
 
11391
  #: classes/class.pmproemail.php:980
11392
  #: classes/class.pmproemail.php:992
11393
  #: classes/class.pmproemail.php:985
11394
+ #: classes/class.pmproemail.php:1118
11395
  msgid "Invoice for order #: "
11396
  msgstr ""
11397
 
11398
  #: classes/class.pmproemail.php:1030
11399
  #: classes/class.pmproemail.php:1042
11400
  #: classes/class.pmproemail.php:1035
11401
+ #: classes/class.pmproemail.php:1168
11402
  msgid "Payment action required for your %s membership"
11403
  msgstr ""
11404
 
11405
  #: classes/class.pmproemail.php:1068
11406
  #: classes/class.pmproemail.php:1080
11407
  #: classes/class.pmproemail.php:1073
11408
+ #: classes/class.pmproemail.php:1206
11409
  msgid "Payment action required: membership for %s at %s"
11410
  msgstr ""
11411
 
11417
  #: classes/gateways/class.pmprogateway_stripe.php:91
11418
  #: classes/gateways/class.pmprogateway_stripe.php:97
11419
  #: classes/gateways/class.pmprogateway_stripe.php:1353
11420
+ #: classes/gateways/class.pmprogateway_stripe.php:1478
11421
  msgid "The %s gateway depends on the %s PHP extension. Please enable it, or ask your hosting provider to enable it."
11422
  msgstr ""
11423
 
11424
  #: classes/gateways/class.pmprogateway_braintree.php:144
11425
+ #: classes/gateways/class.pmprogateway_braintree.php:151
11426
  msgid "Problem loading plans: %s"
11427
  msgstr ""
11428
 
11429
  #: classes/gateways/class.pmprogateway_braintree.php:146
11430
+ #: classes/gateways/class.pmprogateway_braintree.php:153
11431
  msgid "Problem accessing the Braintree Gateway. Please verify your PMPro Payment Settings (Keys, etc)."
11432
  msgstr ""
11433
 
11437
  #: classes/gateways/class.pmprogateway_braintree.php:848
11438
  #: classes/gateways/class.pmprogateway_braintree.php:957
11439
  #: classes/gateways/class.pmprogateway_braintree.php:984
11440
+ #: classes/gateways/class.pmprogateway_braintree.php:680
11441
+ #: classes/gateways/class.pmprogateway_braintree.php:851
11442
+ #: classes/gateways/class.pmprogateway_braintree.php:960
11443
+ #: classes/gateways/class.pmprogateway_braintree.php:987
11444
+ #: classes/gateways/class.pmprogateway_braintree.php:577
11445
+ #: classes/gateways/class.pmprogateway_braintree.php:594
11446
+ #: classes/gateways/class.pmprogateway_braintree.php:687
11447
+ #: classes/gateways/class.pmprogateway_braintree.php:858
11448
+ #: classes/gateways/class.pmprogateway_braintree.php:967
11449
+ #: classes/gateways/class.pmprogateway_braintree.php:994
11450
  msgid "Payment error: Please contact the webmaster (braintree-load-error)"
11451
  msgstr ""
11452
 
11453
  #: classes/gateways/class.pmprogateway_braintree.php:750
11454
+ #: classes/gateways/class.pmprogateway_braintree.php:753
11455
+ #: classes/gateways/class.pmprogateway_braintree.php:760
11456
  msgid "Failed to update customer: %s"
11457
  msgstr ""
11458
 
11459
  #: classes/gateways/class.pmprogateway_braintree.php:933
11460
+ #: classes/gateways/class.pmprogateway_braintree.php:936
11461
+ #: classes/gateways/class.pmprogateway_braintree.php:943
11462
  msgid "Error subscribing customer to plan with Braintree: %s (%s)"
11463
  msgstr ""
11464
 
11465
  #: classes/gateways/class.pmprogateway_braintree.php:948
11466
+ #: classes/gateways/class.pmprogateway_braintree.php:951
11467
+ #: classes/gateways/class.pmprogateway_braintree.php:958
11468
  msgid "Failed to subscribe with Braintree: %s"
11469
  msgstr ""
11470
 
11471
  #: classes/gateways/class.pmprogateway_braintree.php:1018
11472
  #: classes/gateways/class.pmprogateway_braintree.php:1029
11473
+ #: classes/gateways/class.pmprogateway_braintree.php:1021
11474
+ #: classes/gateways/class.pmprogateway_braintree.php:1032
11475
+ #: classes/gateways/class.pmprogateway_braintree.php:1028
11476
+ #: classes/gateways/class.pmprogateway_braintree.php:1039
11477
  msgid "Could not find the subscription. %s"
11478
  msgstr ""
11479
 
11480
  #: classes/gateways/class.pmprogateway_braintree.php:1082
11481
+ #: classes/gateways/class.pmprogateway_braintree.php:1085
11482
+ #: classes/gateways/class.pmprogateway_braintree.php:1092
11483
  msgid "Error getting subscription with Braintree:"
11484
  msgstr ""
11485
 
11741
  #: classes/gateways/class.pmprogateway_cybersource.php:922
11742
  #: includes/license.php:159
11743
  #: includes/license.php:164
11744
+ #: includes/license.php:165
11745
  msgid "Unknown error."
11746
  msgstr ""
11747
 
11757
  #: classes/gateways/class.pmprogateway_paypalexpress.php:155
11758
  #: classes/gateways/class.pmprogateway_paypalstandard.php:147
11759
  #: classes/gateways/class.pmprogateway_paypalexpress.php:165
11760
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:166
11761
  msgid "Note: We do not recommend using PayPal Standard. We suggest using PayPal Express, Website Payments Pro (Legacy), or PayPal Pro (Payflow Pro). <a target=\"_blank\" href=\"%s\" title=\"More information on why can be found here\">More information on why can be found here</a>."
11762
  msgstr ""
11763
 
11764
  #: classes/gateways/class.pmprogateway_paypal.php:185
11765
  #: classes/gateways/class.pmprogateway_paypalexpress.php:194
11766
  #: classes/gateways/class.pmprogateway_paypalexpress.php:204
11767
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:205
11768
  msgid "Confirmation Step"
11769
  msgstr ""
11770
 
11771
  #: classes/gateways/class.pmprogateway_paypalexpress.php:346
11772
  #: classes/gateways/class.pmprogateway_paypalexpress.php:356
11773
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:357
11774
  msgid "Checkout was already processed."
11775
  msgstr ""
11776
 
11778
  #: classes/gateways/class.pmprogateway_paypalexpress.php:791
11779
  #: classes/gateways/class.pmprogateway_paypalexpress.php:795
11780
  #: classes/gateways/class.pmprogateway_paypalexpress.php:804
11781
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:815
11782
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:816
11783
  msgid "Something went wrong creating plan with PayPal; missing PROFILESTATUS."
11784
  msgstr ""
11785
 
11787
  #: classes/gateways/class.pmprogateway_paypalexpress.php:792
11788
  #: classes/gateways/class.pmprogateway_paypalexpress.php:796
11789
  #: classes/gateways/class.pmprogateway_paypalexpress.php:805
11790
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:816
11791
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:817
11792
  msgid "Error creating plan with PayPal."
11793
  msgstr ""
11794
 
11804
  #: classes/gateways/class.pmprogateway_stripe.php:450
11805
  #: classes/gateways/class.pmprogateway_stripe.php:1790
11806
  #: classes/gateways/class.pmprogateway_stripe.php:1788
11807
+ #: classes/gateways/class.pmprogateway_stripe.php:2227
11808
  msgid "Stripe Connect Settings"
11809
  msgstr ""
11810
 
11813
  #: classes/gateways/class.pmprogateway_stripe.php:362
11814
  #: classes/gateways/class.pmprogateway_stripe.php:1793
11815
  #: classes/gateways/class.pmprogateway_stripe.php:1791
11816
+ #: classes/gateways/class.pmprogateway_stripe.php:2230
11817
  msgid "Live Mode:"
11818
  msgstr ""
11819
 
11825
  #: classes/gateways/class.pmprogateway_stripe.php:454
11826
  #: classes/gateways/class.pmprogateway_stripe.php:1795
11827
  #: classes/gateways/class.pmprogateway_stripe.php:1793
11828
+ #: classes/gateways/class.pmprogateway_stripe.php:2232
11829
  msgid "Connected"
11830
  msgstr ""
11831
 
11837
  #: classes/gateways/class.pmprogateway_stripe.php:458
11838
  #: classes/gateways/class.pmprogateway_stripe.php:1799
11839
  #: classes/gateways/class.pmprogateway_stripe.php:1797
11840
+ #: classes/gateways/class.pmprogateway_stripe.php:2236
11841
  msgid "Not Connected"
11842
  msgstr ""
11843
 
11849
  #: classes/gateways/class.pmprogateway_stripe.php:465
11850
  #: classes/gateways/class.pmprogateway_stripe.php:1807
11851
  #: classes/gateways/class.pmprogateway_stripe.php:1805
11852
+ #: classes/gateways/class.pmprogateway_stripe.php:2244
11853
  msgid "Your site is using legacy API keys to authenticate with Stripe."
11854
  msgstr ""
11855
 
11858
  #: classes/gateways/class.pmprogateway_stripe.php:377
11859
  #: classes/gateways/class.pmprogateway_stripe.php:1811
11860
  #: classes/gateways/class.pmprogateway_stripe.php:1809
11861
+ #: classes/gateways/class.pmprogateway_stripe.php:2248
11862
  msgid "Use the \"Connect with Stripe\" button below to securely authenticate with your Stripe account using Stripe Connect. Log in with the current Stripe account used for this site so that existing subscriptions are not affected by the update."
11863
  msgstr ""
11864
 
11870
  #: classes/gateways/class.pmprogateway_stripe.php:476
11871
  #: classes/gateways/class.pmprogateway_stripe.php:1824
11872
  #: classes/gateways/class.pmprogateway_stripe.php:1822
11873
+ #: classes/gateways/class.pmprogateway_stripe.php:2261
11874
  msgid "Stripe Connection:"
11875
  msgstr ""
11876
 
11882
  #: classes/gateways/class.pmprogateway_stripe.php:500
11883
  #: classes/gateways/class.pmprogateway_stripe.php:1840
11884
  #: classes/gateways/class.pmprogateway_stripe.php:1838
11885
+ #: classes/gateways/class.pmprogateway_stripe.php:2277
11886
  msgid "Disconnect From Stripe"
11887
  msgstr ""
11888
 
11891
  #: classes/gateways/class.pmprogateway_stripe.php:403
11892
  #: classes/gateways/class.pmprogateway_stripe.php:1844
11893
  #: classes/gateways/class.pmprogateway_stripe.php:1842
11894
+ #: classes/gateways/class.pmprogateway_stripe.php:2281
11895
  msgid "This will disconnect your site from Stripe. Users will not be able to complete membership checkout or update their billing information. Existing subscriptions will not be affected at the gateway, but new recurring orders will not be created in this site."
11896
  msgstr ""
11897
 
11903
  #: classes/gateways/class.pmprogateway_stripe.php:514
11904
  #: classes/gateways/class.pmprogateway_stripe.php:1861
11905
  #: classes/gateways/class.pmprogateway_stripe.php:1859
11906
+ #: classes/gateways/class.pmprogateway_stripe.php:2298
11907
  msgid "Connect with Stripe"
11908
  msgstr ""
11909
 
11912
  #: classes/gateways/class.pmprogateway_stripe.php:422
11913
  #: classes/gateways/class.pmprogateway_stripe.php:1868
11914
  #: classes/gateways/class.pmprogateway_stripe.php:1866
11915
+ #: classes/gateways/class.pmprogateway_stripe.php:2305
11916
  msgid "Note: You have a valid license and are not charged additional platform fees for payment processing."
11917
  msgstr ""
11918
 
11936
  #: classes/gateways/class.pmprogateway_stripe.php:348
11937
  #: classes/gateways/class.pmprogateway_stripe.php:1882
11938
  #: classes/gateways/class.pmprogateway_stripe.php:1880
11939
+ #: classes/gateways/class.pmprogateway_stripe.php:374
11940
+ #: classes/gateways/class.pmprogateway_stripe.php:2319
11941
  msgid "Webhook"
11942
  msgstr ""
11943
 
11954
  #: classes/gateways/class.pmprogateway_stripe.php:383
11955
  #: classes/gateways/class.pmprogateway_stripe.php:1886
11956
  #: classes/gateways/class.pmprogateway_stripe.php:1884
11957
+ #: classes/gateways/class.pmprogateway_stripe.php:409
11958
+ #: classes/gateways/class.pmprogateway_stripe.php:2323
11959
  msgid "Webhook URL"
11960
  msgstr ""
11961
 
11964
  #: classes/gateways/class.pmprogateway_stripe.php:452
11965
  #: classes/gateways/class.pmprogateway_stripe.php:1793
11966
  #: classes/gateways/class.pmprogateway_stripe.php:1791
11967
+ #: classes/gateways/class.pmprogateway_stripe.php:2230
11968
  msgid "Test Mode:"
11969
  msgstr ""
11970
 
11973
  #: classes/gateways/class.pmprogateway_stripe.php:467
11974
  #: classes/gateways/class.pmprogateway_stripe.php:1813
11975
  #: classes/gateways/class.pmprogateway_stripe.php:1811
11976
+ #: classes/gateways/class.pmprogateway_stripe.php:2250
11977
  msgid "Use the \"Connect with Stripe\" button below to securely authenticate with your Stripe account using Stripe Connect in test mode."
11978
  msgstr ""
11979
 
11982
  #: classes/gateways/class.pmprogateway_stripe.php:501
11983
  #: classes/gateways/class.pmprogateway_stripe.php:1846
11984
  #: classes/gateways/class.pmprogateway_stripe.php:1844
11985
+ #: classes/gateways/class.pmprogateway_stripe.php:2283
11986
  msgid "This will disconnect your site from Stripe in test mode only."
11987
  msgstr ""
11988
 
11990
  #: classes/gateways/class.pmprogateway_stripe.php:530
11991
  #: classes/gateways/class.pmprogateway_stripe.php:536
11992
  #: classes/gateways/class.pmprogateway_stripe.php:300
11993
+ #: classes/gateways/class.pmprogateway_stripe.php:326
11994
  msgid "Stripe API Settings (Legacy)"
11995
  msgstr ""
11996
 
11999
  #: classes/gateways/class.pmprogateway_stripe.php:562
12000
  #: classes/gateways/class.pmprogateway_stripe.php:568
12001
  #: classes/gateways/class.pmprogateway_stripe.php:332
12002
+ #: classes/gateways/class.pmprogateway_stripe.php:358
12003
  msgid "Your Publishable Key appears incorrect."
12004
  msgstr ""
12005
 
12013
  #: classes/gateways/class.pmprogateway_stripe.php:612
12014
  #: classes/gateways/class.pmprogateway_stripe.php:352
12015
  #: classes/gateways/class.pmprogateway_stripe.php:376
12016
+ #: classes/gateways/class.pmprogateway_stripe.php:378
12017
+ #: classes/gateways/class.pmprogateway_stripe.php:402
12018
  msgid "Create Webhook"
12019
  msgstr ""
12020
 
12023
  #: classes/gateways/class.pmprogateway_stripe.php:588
12024
  #: classes/gateways/class.pmprogateway_stripe.php:594
12025
  #: classes/gateways/class.pmprogateway_stripe.php:358
12026
+ #: classes/gateways/class.pmprogateway_stripe.php:384
12027
  msgid "A webhook is set up in Stripe, but it is disabled."
12028
  msgstr ""
12029
 
12032
  #: classes/gateways/class.pmprogateway_stripe.php:595
12033
  #: classes/gateways/class.pmprogateway_stripe.php:601
12034
  #: classes/gateways/class.pmprogateway_stripe.php:365
12035
+ #: classes/gateways/class.pmprogateway_stripe.php:391
12036
  msgid "A webhook is set up in Stripe, but it is using an old API version."
12037
  msgstr ""
12038
 
12041
  #: classes/gateways/class.pmprogateway_stripe.php:595
12042
  #: classes/gateways/class.pmprogateway_stripe.php:601
12043
  #: classes/gateways/class.pmprogateway_stripe.php:365
12044
+ #: classes/gateways/class.pmprogateway_stripe.php:358
12045
+ #: classes/gateways/class.pmprogateway_stripe.php:384
12046
+ #: classes/gateways/class.pmprogateway_stripe.php:391
12047
  msgid "Rebuild Webhook"
12048
  msgstr ""
12049
 
12061
  #: classes/gateways/class.pmprogateway_stripe.php:863
12062
  #: classes/gateways/class.pmprogateway_stripe.php:371
12063
  #: classes/gateways/class.pmprogateway_stripe.php:503
12064
+ #: classes/gateways/class.pmprogateway_stripe.php:397
12065
+ #: classes/gateways/class.pmprogateway_stripe.php:615
12066
  msgid "Your webhook is enabled."
12067
  msgstr ""
12068
 
12071
  #: classes/gateways/class.pmprogateway_stripe.php:601
12072
  #: classes/gateways/class.pmprogateway_stripe.php:607
12073
  #: classes/gateways/class.pmprogateway_stripe.php:371
12074
+ #: classes/gateways/class.pmprogateway_stripe.php:397
12075
  msgid "Disable Webhook"
12076
  msgstr ""
12077
 
12093
  #: classes/gateways/class.pmprogateway_stripe.php:825
12094
  #: classes/gateways/class.pmprogateway_stripe.php:378
12095
  #: classes/gateways/class.pmprogateway_stripe.php:530
12096
+ #: classes/gateways/class.pmprogateway_stripe.php:404
12097
+ #: classes/gateways/class.pmprogateway_stripe.php:642
12098
  msgid "A webhook in Stripe is required to process recurring payments, manage failed payments, and synchronize cancellations."
12099
  msgstr ""
12100
 
12103
  #: classes/gateways/class.pmprogateway_stripe.php:620
12104
  #: classes/gateways/class.pmprogateway_stripe.php:626
12105
  #: classes/gateways/class.pmprogateway_stripe.php:390
12106
+ #: classes/gateways/class.pmprogateway_stripe.php:416
12107
  msgid "Other Stripe Settings"
12108
  msgstr ""
12109
 
12112
  #: classes/gateways/class.pmprogateway_stripe.php:624
12113
  #: classes/gateways/class.pmprogateway_stripe.php:630
12114
  #: classes/gateways/class.pmprogateway_stripe.php:394
12115
+ #: classes/gateways/class.pmprogateway_stripe.php:420
12116
  msgid "Stripe API Version"
12117
  msgstr ""
12118
 
12121
  #: classes/gateways/class.pmprogateway_stripe.php:643
12122
  #: classes/gateways/class.pmprogateway_stripe.php:649
12123
  #: classes/gateways/class.pmprogateway_stripe.php:413
12124
+ #: classes/gateways/class.pmprogateway_stripe.php:439
12125
  msgid "Enable Payment Request Button"
12126
  msgstr ""
12127
 
12130
  #: classes/gateways/class.pmprogateway_stripe.php:661
12131
  #: classes/gateways/class.pmprogateway_stripe.php:667
12132
  #: classes/gateways/class.pmprogateway_stripe.php:431
12133
+ #: classes/gateways/class.pmprogateway_stripe.php:457
12134
  msgid "Allow users to pay using Apple Pay, Google Pay, or Microsoft Pay depending on their browser. When enabled, your domain will automatically be registered with Apple and a domain association file will be hosted on your site. <a target=\"_blank\" href=\"%s\" title=\"More Information about the domain association file for Apple Pay\">More Information &raquo;</a>"
12135
  msgstr ""
12136
 
12139
  #: classes/gateways/class.pmprogateway_stripe.php:674
12140
  #: classes/gateways/class.pmprogateway_stripe.php:680
12141
  #: classes/gateways/class.pmprogateway_stripe.php:444
12142
+ #: classes/gateways/class.pmprogateway_stripe.php:470
12143
  msgid "This webpage is being served over HTTP, but the Stripe Payment Request Button will only work on pages being served over HTTPS. To resolve this, you must <a target=\"_blank\" href=\"%s\" title=\"Configuring WordPress to Always Use HTTPS/SSL\">set up WordPress to always use HTTPS</a>."
12144
  msgstr ""
12145
 
12148
  #: classes/gateways/class.pmprogateway_stripe.php:676
12149
  #: classes/gateways/class.pmprogateway_stripe.php:682
12150
  #: classes/gateways/class.pmprogateway_stripe.php:446
12151
+ #: classes/gateways/class.pmprogateway_stripe.php:472
12152
  msgid "It looks like you are using an older Stripe publishable key. In order to use the Payment Request Button feature, you will need to update your API key, which will be prefixed with \"pk_live_\" or \"pk_test_\". <a target=\"_blank\" href=\"%s\" title=\"Stripe Dashboard API Key Settings\">Log in to your Stripe Dashboard to roll your publishable key</a>."
12153
  msgstr ""
12154
 
12157
  #: classes/gateways/class.pmprogateway_stripe.php:678
12158
  #: classes/gateways/class.pmprogateway_stripe.php:684
12159
  #: classes/gateways/class.pmprogateway_stripe.php:448
12160
+ #: classes/gateways/class.pmprogateway_stripe.php:474
12161
  msgid "It looks like you are using an older Stripe secret key. In order to use the Payment Request Button feature, you will need to update your API key, which will be prefixed with \"sk_live_\" or \"sk_test_\". <a target=\"_blank\" href=\"%s\" title=\"Stripe Dashboard API Key Settings\">Log in to your Stripe Dashboard to roll your secret key</a>."
12162
  msgstr ""
12163
 
12166
  #: classes/gateways/class.pmprogateway_stripe.php:680
12167
  #: classes/gateways/class.pmprogateway_stripe.php:686
12168
  #: classes/gateways/class.pmprogateway_stripe.php:450
12169
+ #: classes/gateways/class.pmprogateway_stripe.php:476
12170
  msgid "Your domain could not be registered with Apple to enable Apple Pay. Please try <a target=\"_blank\" href=\"%s\" title=\"Apple Pay Settings Page in Stripe\">registering your domain manually from the Apple Pay settings page in Stripe</a>."
12171
  msgstr ""
12172
 
12175
  #: classes/gateways/class.pmprogateway_stripe.php:705
12176
  #: classes/gateways/class.pmprogateway_stripe.php:711
12177
  #: classes/gateways/class.pmprogateway_stripe.php:475
12178
+ #: classes/gateways/class.pmprogateway_stripe.php:501
12179
  msgid "Optional: Offer PayPal Express as an option at checkout using the <a target=\"_blank\" href=\"%s\" title=\"Paid Memberships Pro - Add PayPal Express Option at Checkout Add On\">Add PayPal Express Add On</a>."
12180
  msgstr ""
12181
 
12184
  #: classes/gateways/class.pmprogateway_stripe.php:726
12185
  #: classes/gateways/class.pmprogateway_stripe.php:732
12186
  #: classes/gateways/class.pmprogateway_stripe.php:492
12187
+ #: classes/gateways/class.pmprogateway_stripe.php:604
12188
  msgid "Webhook creation failed. You might already have a webhook set up."
12189
  msgstr ""
12190
 
12197
  #: classes/gateways/class.pmprogateway_stripe.php:798
12198
  #: classes/gateways/class.pmprogateway_stripe.php:872
12199
  #: classes/gateways/class.pmprogateway_stripe.php:536
12200
+ #: classes/gateways/class.pmprogateway_stripe.php:648
12201
  msgid "There was an error deleting the webhook."
12202
  msgstr ""
12203
 
12206
  #: classes/gateways/class.pmprogateway_stripe.php:842
12207
  #: classes/gateways/class.pmprogateway_stripe.php:848
12208
  #: classes/gateways/class.pmprogateway_stripe.php:564
12209
+ #: classes/gateways/class.pmprogateway_stripe.php:676
12210
  msgid "Webhook creation failed. Please refresh and try again."
12211
  msgstr ""
12212
 
12215
  #: classes/gateways/class.pmprogateway_stripe.php:898
12216
  #: classes/gateways/class.pmprogateway_stripe.php:904
12217
  #: classes/gateways/class.pmprogateway_stripe.php:592
12218
+ #: classes/gateways/class.pmprogateway_stripe.php:704
12219
  msgid "Verification steps confirmed. Your payment is processing."
12220
  msgstr ""
12221
 
12224
  #: classes/gateways/class.pmprogateway_stripe.php:1293
12225
  #: classes/gateways/class.pmprogateway_stripe.php:1299
12226
  #: classes/gateways/class.pmprogateway_stripe.php:758
12227
+ #: classes/gateways/class.pmprogateway_stripe.php:866
12228
  msgid "Pay with Credit Card"
12229
  msgstr ""
12230
 
12233
  #: classes/gateways/class.pmprogateway_stripe.php:1327
12234
  #: classes/gateways/class.pmprogateway_stripe.php:1333
12235
  #: classes/gateways/class.pmprogateway_stripe.php:792
12236
+ #: classes/gateways/class.pmprogateway_stripe.php:900
12237
  msgid "CVC"
12238
  msgstr ""
12239
 
12276
  #: classes/gateways/class.pmprogateway_stripe.php:4331
12277
  #: classes/gateways/class.pmprogateway_stripe.php:4327
12278
  #: classes/gateways/class.pmprogateway_stripe.php:4333
12279
+ #: classes/gateways/class.pmprogateway_stripe.php:4323
12280
+ #: classes/gateways/class.pmprogateway_stripe.php:4872
12281
+ #: classes/gateways/class.pmprogateway_stripe.php:4878
12282
  msgid "Error: "
12283
  msgstr ""
12284
 
12289
  #: classes/gateways/class.pmprogateway_stripe.php:4349
12290
  #: classes/gateways/class.pmprogateway_stripe.php:4345
12291
  #: classes/gateways/class.pmprogateway_stripe.php:4347
12292
+ #: classes/gateways/class.pmprogateway_stripe.php:4343
12293
+ #: classes/gateways/class.pmprogateway_stripe.php:4892
12294
  msgid "Error: Unkown error while refunding charge #%s"
12295
  msgstr ""
12296
 
12300
  #: classes/gateways/class.pmprogateway_stripe.php:3370
12301
  #: classes/gateways/class.pmprogateway_stripe.php:3366
12302
  #: classes/gateways/class.pmprogateway_stripe.php:3368
12303
+ #: classes/gateways/class.pmprogateway_stripe.php:3829
12304
  msgid "Customer authentication is required to complete this transaction. Please complete the verification steps issued by your payment provider."
12305
  msgstr ""
12306
 
12318
  #: classes/gateways/class.pmprogateway_stripe.php:2546
12319
  #: classes/gateways/class.pmprogateway_stripe.php:2583
12320
  #: classes/gateways/class.pmprogateway_stripe.php:3388
12321
+ #: classes/gateways/class.pmprogateway_stripe.php:2542
12322
+ #: classes/gateways/class.pmprogateway_stripe.php:2579
12323
+ #: classes/gateways/class.pmprogateway_stripe.php:3384
12324
+ #: classes/gateways/class.pmprogateway_stripe.php:1897
12325
+ #: classes/gateways/class.pmprogateway_stripe.php:2999
12326
+ #: classes/gateways/class.pmprogateway_stripe.php:3036
12327
+ #: classes/gateways/class.pmprogateway_stripe.php:3849
12328
  msgid "Customer authentication is required to finish setting up your subscription. Please complete the verification steps issued by your payment provider."
12329
  msgstr ""
12330
 
12333
  #: classes/gateways/class.pmprogateway_stripe.php:3567
12334
  #: classes/gateways/class.pmprogateway_stripe.php:3573
12335
  #: classes/gateways/class.pmprogateway_stripe.php:1199
12336
+ #: classes/gateways/class.pmprogateway_stripe.php:1324
12337
  msgid "Invalid response from the Stripe Connect server."
12338
  msgstr ""
12339
 
12343
  #: classes/gateways/class.pmprogateway_stripe.php:3595
12344
  #: classes/gateways/class.pmprogateway_stripe.php:3601
12345
  #: classes/gateways/class.pmprogateway_stripe.php:1227
12346
+ #: classes/gateways/class.pmprogateway_stripe.php:1352
12347
  msgid "<strong>Error:</strong> PMPro could not connect to the Stripe API. Reason: %s"
12348
  msgstr ""
12349
 
12353
  #: classes/gateways/class.pmprogateway_stripe.php:3631
12354
  #: classes/gateways/class.pmprogateway_stripe.php:3637
12355
  #: classes/gateways/class.pmprogateway_stripe.php:1263
12356
+ #: classes/gateways/class.pmprogateway_stripe.php:1388
12357
  msgid "<strong>Error:</strong> PMPro could not disconnect from the Stripe API. Reason: %s"
12358
  msgstr ""
12359
 
12364
  #: classes/gateways/class.pmprogateway_stripe.php:3674
12365
  #: classes/gateways/class.pmprogateway_stripe.php:3670
12366
  #: classes/gateways/class.pmprogateway_stripe.php:3672
12367
+ #: classes/gateways/class.pmprogateway_stripe.php:3668
12368
+ #: classes/gateways/class.pmprogateway_stripe.php:4132
12369
  msgid "Last webhook received at"
12370
  msgstr ""
12371
 
12376
  #: classes/gateways/class.pmprogateway_stripe.php:3676
12377
  #: classes/gateways/class.pmprogateway_stripe.php:3672
12378
  #: classes/gateways/class.pmprogateway_stripe.php:3674
12379
+ #: classes/gateways/class.pmprogateway_stripe.php:3670
12380
+ #: classes/gateways/class.pmprogateway_stripe.php:4134
12381
  msgid "No webhooks have been received."
12382
  msgstr ""
12383
 
12388
  #: classes/gateways/class.pmprogateway_stripe.php:3680
12389
  #: classes/gateways/class.pmprogateway_stripe.php:3676
12390
  #: classes/gateways/class.pmprogateway_stripe.php:3678
12391
+ #: classes/gateways/class.pmprogateway_stripe.php:3674
12392
+ #: classes/gateways/class.pmprogateway_stripe.php:4138
12393
  msgid "Your webhook may not be working correctly."
12394
  msgstr ""
12395
 
12400
  #: classes/gateways/class.pmprogateway_stripe.php:3682
12401
  #: classes/gateways/class.pmprogateway_stripe.php:3678
12402
  #: classes/gateways/class.pmprogateway_stripe.php:3680
12403
+ #: classes/gateways/class.pmprogateway_stripe.php:3676
12404
+ #: classes/gateways/class.pmprogateway_stripe.php:4140
12405
  msgid "Click here for info on setting up your webhook with Stripe."
12406
  msgstr ""
12407
 
12436
  #: blocks/account-page/block.js:59
12437
  #: js/blocks.build.js:303
12438
  #: js/blocks.build.js:342
12439
+ #: blocks/account-page/block.js:73
12440
  msgid "Membership Account Page"
12441
  msgstr ""
12442
 
12449
  #: blocks/cancel-page/block.js:39
12450
  #: js/blocks.build.js:677
12451
  #: js/blocks.build.js:695
12452
+ #: blocks/cancel-page/block.js:45
12453
  msgid "Membership Cancel Page"
12454
  msgstr ""
12455
 
12462
  #: blocks/confirmation-page/block.js:39
12463
  #: js/blocks.build.js:1136
12464
  #: js/blocks.build.js:1154
12465
+ #: blocks/confirmation-page/block.js:47
12466
  msgid "Membership Confirmation Page"
12467
  msgstr ""
12468
 
14253
  msgstr ""
14254
 
14255
  #: includes/email-templates.php:508
14256
+ #: includes/email-templates.php:538
14257
  msgid "Payment action required for your !!sitename!! membership"
14258
  msgstr ""
14259
 
14260
  #: includes/email-templates.php:509
14261
+ #: includes/email-templates.php:539
14262
  msgid "Payment Action Required"
14263
  msgstr ""
14264
 
14265
  #: includes/email-templates.php:510
14266
+ #: includes/email-templates.php:540
14267
  msgid ""
14268
  "<p>Customer authentication is required to finish setting up your subscription at !!sitename!!.</p>\n"
14269
  "\n"
14272
  msgstr ""
14273
 
14274
  #: includes/email-templates.php:514
14275
+ #: includes/email-templates.php:544
14276
  msgid "This email is sent to the user when an attempted membership checkout requires additional customer authentication."
14277
  msgstr ""
14278
 
14279
  #: includes/email-templates.php:517
14280
+ #: includes/email-templates.php:547
14281
  msgid "Payment action required: membership for !!user_login!! at !!sitename!!"
14282
  msgstr ""
14283
 
14284
  #: includes/email-templates.php:518
14285
+ #: includes/email-templates.php:548
14286
  msgid "Payment Action Required (admin)"
14287
  msgstr ""
14288
 
14289
  #: includes/email-templates.php:519
14290
+ #: includes/email-templates.php:549
14291
  msgid ""
14292
  "<p>A payment at !!sitename!! for !!user_login!! requires additional customer authentication to complete.</p>\n"
14293
  "<p>Below is a copy of the email we sent to !!user_email!! to notify them that they need to complete their payment:</p>\n"
14299
  msgstr ""
14300
 
14301
  #: includes/email-templates.php:526
14302
+ #: includes/email-templates.php:556
14303
  msgid "This email is sent to the site administrator when an attempted membership checkout requires additional customer authentication."
14304
  msgstr ""
14305
 
14328
  msgstr ""
14329
 
14330
  #: includes/functions.php:406
14331
+ #: includes/functions.php:410
14332
  msgid " and then <strong>%1$s per %2$s for %3$d more %4$s</strong>."
14333
  msgstr ""
14334
 
14335
  #: includes/functions.php:408
14336
+ #: includes/functions.php:412
14337
  msgid " and then <strong>%1$s every %2$d %3$s for %4$d more payments</strong>."
14338
  msgstr ""
14339
 
14340
  #: includes/functions.php:411
14341
+ #: includes/functions.php:415
14342
  msgid " and then <strong>%1$s after %2$d %3$s</strong>."
14343
  msgstr ""
14344
 
14345
  #: includes/functions.php:416
14346
+ #: includes/functions.php:420
14347
  msgid "The price for membership is <strong>%1$s per %2$s</strong>."
14348
  msgstr ""
14349
 
14350
  #: includes/functions.php:418
14351
+ #: includes/functions.php:422
14352
  msgid "<strong>%1$s per %2$s</strong>."
14353
  msgstr ""
14354
 
14355
  #: includes/functions.php:422
14356
+ #: includes/functions.php:426
14357
  msgid "The price for membership is <strong>%1$s every %2$d %3$s</strong>."
14358
  msgstr ""
14359
 
14360
  #: includes/functions.php:424
14361
+ #: includes/functions.php:428
14362
  msgid "<strong>%1$s every %2$d %3$s</strong>."
14363
  msgstr ""
14364
 
14365
  #: includes/functions.php:429
14366
+ #: includes/functions.php:433
14367
  msgid " and then <strong>%1$s per %2$s</strong>."
14368
  msgstr ""
14369
 
14370
  #: includes/functions.php:431
14371
+ #: includes/functions.php:435
14372
  msgid " and then <strong>%1$s every %2$d %3$s</strong>."
14373
  msgstr ""
14374
 
14375
  #: includes/functions.php:454
14376
+ #: includes/functions.php:458
14377
  msgid "After your initial payment, your first %1$d payments will cost %2$s."
14378
  msgstr ""
14379
 
14380
  #: includes/functions.php:464
14381
  #: includes/functions.php:565
14382
+ #: includes/functions.php:468
14383
+ #: includes/functions.php:571
14384
  msgid "Customers in %1$s will be charged %2$s%% tax."
14385
  msgstr ""
14386
 
14387
  #: includes/functions.php:522
14388
+ #: includes/functions.php:528
14389
  msgid "<strong>%1$s per %2$s for %3$d more %4$s</strong>"
14390
  msgstr ""
14391
 
14392
  #: includes/functions.php:524
14393
+ #: includes/functions.php:530
14394
  msgid "<strong>%1$s every %2$d %3$s for %4$d more payments</strong>"
14395
  msgstr ""
14396
 
14397
  #: includes/functions.php:527
14398
+ #: includes/functions.php:533
14399
  msgid "<strong>%1$s after %2$d %3$s</strong>"
14400
  msgstr ""
14401
 
14402
  #: includes/functions.php:530
14403
+ #: includes/functions.php:536
14404
  msgid "<strong>%1$s every %2$s</strong>"
14405
  msgstr ""
14406
 
14407
  #: includes/functions.php:532
14408
+ #: includes/functions.php:538
14409
  msgid "<strong>%1$s every %2$d %3$s</strong>"
14410
  msgstr ""
14411
 
14412
  #: includes/functions.php:582
14413
+ #: includes/functions.php:588
14414
  msgid "Membership expires after %1$d %2$s."
14415
  msgstr ""
14416
 
14417
  #: includes/functions.php:601
14418
+ #: includes/functions.php:607
14419
  msgid "%1$s membership expires after %2$d %3$s"
14420
  msgstr ""
14421
 
14422
  #: includes/functions.php:997
14423
+ #: includes/functions.php:1004
14424
  msgid "No membership_id specified in pmpro_changeMembershipLevel."
14425
  msgstr ""
14426
 
14427
  #: includes/functions.php:1191
14428
+ #: includes/functions.php:1198
14429
  msgid "Error interacting with database: %s"
14430
  msgstr ""
14431
 
14432
  #: includes/functions.php:2433
14433
  #: includes/functions.php:2464
14434
+ #: includes/functions.php:2484
14435
+ #: includes/functions.php:2486
14436
  msgid "Sign Up Now"
14437
  msgstr ""
14438
 
14546
  #: includes/profile.php:843
14547
  #: includes/profile.php:855
14548
  #: includes/profile.php:851
14549
+ #: includes/profile.php:891
14550
  msgid "New passwords do not match."
14551
  msgstr ""
14552
 
14554
  #: includes/profile.php:839
14555
  #: includes/profile.php:851
14556
  #: includes/profile.php:847
14557
+ #: includes/profile.php:887
14558
  msgid "Please complete all fields."
14559
  msgstr ""
14560
 
14586
  #: includes/profile.php:891
14587
  #: includes/profile.php:903
14588
  #: includes/profile.php:899
14589
+ #: includes/profile.php:939
14590
  msgid "New Password"
14591
  msgstr ""
14592
 
14596
  #: includes/profile.php:906
14597
  #: includes/scripts.php:85
14598
  #: includes/profile.php:902
14599
+ #: includes/profile.php:942
14600
  msgid "Strength Indicator"
14601
  msgstr ""
14602
 
14604
  #: includes/profile.php:898
14605
  #: includes/profile.php:910
14606
  #: includes/profile.php:906
14607
+ #: includes/profile.php:946
14608
  msgid "Confirm New Password"
14609
  msgstr ""
14610
 
14704
  #: includes/profile.php:499
14705
  #: includes/profile.php:412
14706
  #: includes/profile.php:495
14707
+ #: includes/profile.php:452
14708
+ #: includes/profile.php:535
14709
  msgid "Level ID"
14710
  msgstr ""
14711
 
14713
  #: includes/profile.php:496
14714
  #: includes/profile.php:502
14715
  #: includes/profile.php:498
14716
+ #: includes/profile.php:538
14717
  msgid "Date Modified"
14718
  msgstr ""
14719
 
14721
  #: includes/profile.php:497
14722
  #: includes/profile.php:503
14723
  #: includes/profile.php:499
14724
+ #: includes/profile.php:539
14725
  msgid "End Date"
14726
  msgstr ""
14727
 
14729
  #: includes/profile.php:498
14730
  #: includes/profile.php:504
14731
  #: includes/profile.php:500
14732
+ #: includes/profile.php:540
14733
  msgid "Level Cost"
14734
  msgstr ""
14735
 
14794
  msgstr ""
14795
 
14796
  #: includes/privacy.php:520
14797
+ #: includes/privacy.php:521
14798
  msgid "That post has since been updated."
14799
  msgstr ""
14800
 
14801
  #: includes/profile.php:58
14802
  #: pages/invoice.php:43
14803
  #: shortcodes/pmpro_account.php:244
14804
+ #: adminpages/orders.php:1705
14805
  msgid "Paid"
14806
  msgstr ""
14807
 
14808
  #: includes/profile.php:138
14809
  #: includes/profile.php:114
14810
+ #: includes/profile.php:124
14811
  msgid "Send the user an email about this change."
14812
  msgstr ""
14813
 
14814
  #: includes/profile.php:144
14815
  #: includes/profile.php:120
14816
+ #: includes/profile.php:130
14817
  msgid "Cancel this user's subscription at the gateway."
14818
  msgstr ""
14819
 
14820
  #: includes/profile.php:158
14821
  #: includes/profile.php:134
14822
+ #: includes/profile.php:150
14823
  msgid "TOS Consent History"
14824
  msgstr ""
14825
 
14826
  #: includes/profile.php:410
14827
  #: includes/profile.php:388
14828
+ #: includes/profile.php:428
14829
  msgid "Member History"
14830
  msgstr ""
14831
 
14832
  #: includes/profile.php:413
14833
  #: includes/profile.php:391
14834
+ #: includes/profile.php:431
14835
  msgid "Order History"
14836
  msgstr ""
14837
 
14838
  #: includes/profile.php:414
14839
  #: includes/profile.php:392
14840
+ #: includes/profile.php:432
14841
  msgid "Membership Levels History"
14842
  msgstr ""
14843
 
14844
  #: includes/profile.php:485
14845
  #: includes/profile.php:488
14846
  #: includes/profile.php:475
14847
+ #: includes/profile.php:515
14848
  msgid "No membership orders found."
14849
  msgstr ""
14850
 
14851
  #: includes/profile.php:537
14852
  #: includes/profile.php:546
14853
  #: includes/profile.php:542
14854
+ #: includes/profile.php:582
14855
  msgid "No membership history found."
14856
  msgstr ""
14857
 
14858
  #: includes/profile.php:644
14859
  #: includes/profile.php:656
14860
  #: includes/profile.php:652
14861
+ #: includes/profile.php:692
14862
  msgid "Log in to edit your profile."
14863
  msgstr ""
14864
 
14865
  #: includes/profile.php:679
14866
  #: includes/profile.php:691
14867
  #: includes/profile.php:687
14868
+ #: includes/profile.php:727
14869
  msgid "Please enter a display name."
14870
  msgstr ""
14871
 
14872
  #: includes/profile.php:689
14873
  #: includes/profile.php:701
14874
  #: includes/profile.php:697
14875
+ #: includes/profile.php:737
14876
  msgid "Please enter an email address."
14877
  msgstr ""
14878
 
14879
  #: includes/profile.php:691
14880
  #: includes/profile.php:703
14881
  #: includes/profile.php:699
14882
+ #: includes/profile.php:739
14883
  msgid "The email address isn&#8217;t correct."
14884
  msgstr ""
14885
 
14886
  #: includes/profile.php:695
14887
  #: includes/profile.php:707
14888
  #: includes/profile.php:703
14889
+ #: includes/profile.php:743
14890
  msgid "This email is already registered, please choose another one."
14891
  msgstr ""
14892
 
14893
  #: includes/profile.php:722
14894
  #: includes/profile.php:734
14895
  #: includes/profile.php:730
14896
+ #: includes/profile.php:770
14897
  msgid "Your profile has been updated."
14898
  msgstr ""
14899
 
14900
  #: includes/profile.php:749
14901
  #: includes/profile.php:761
14902
  #: includes/profile.php:757
14903
+ #: includes/profile.php:797
14904
  msgid "Display name publicly as"
14905
  msgstr ""
14906
 
14907
  #: includes/profile.php:762
14908
  #: includes/profile.php:774
14909
  #: includes/profile.php:770
14910
+ #: includes/profile.php:810
14911
  msgid "Site administrators must use the WordPress dashboard to update their email address."
14912
  msgstr ""
14913
 
14914
  #: includes/profile.php:785
14915
  #: includes/profile.php:797
14916
  #: includes/profile.php:793
14917
+ #: includes/profile.php:833
14918
  msgid "Update Profile"
14919
  msgstr ""
14920
 
14921
  #: includes/profile.php:841
14922
  #: includes/profile.php:853
14923
  #: includes/profile.php:849
14924
+ #: includes/profile.php:889
14925
  msgid "Please enter your current password."
14926
  msgstr ""
14927
 
14928
  #: includes/profile.php:845
14929
  #: includes/profile.php:857
14930
  #: includes/profile.php:853
14931
+ #: includes/profile.php:893
14932
  msgid "Your current password is incorrect."
14933
  msgstr ""
14934
 
14935
  #: includes/profile.php:856
14936
  #: includes/profile.php:868
14937
  #: includes/profile.php:864
14938
+ #: includes/profile.php:904
14939
  msgid "Your password has been updated."
14940
  msgstr ""
14941
 
14942
  #: includes/profile.php:886
14943
  #: includes/profile.php:898
14944
  #: includes/profile.php:894
14945
+ #: includes/profile.php:934
14946
  msgid "Current Password"
14947
  msgstr ""
14948
 
14954
  #: includes/profile.php:896
14955
  #: includes/profile.php:901
14956
  #: includes/profile.php:908
14957
+ #: includes/profile.php:936
14958
+ #: includes/profile.php:941
14959
+ #: includes/profile.php:948
14960
  msgid "Required Field"
14961
  msgstr ""
14962
 
15006
  msgstr ""
15007
 
15008
  #: pages/billing.php:136
15009
+ #: pages/billing.php:138
15010
  msgid "Your billing information cannot be updated at this time."
15011
  msgstr ""
15012
 
15013
  #: pages/billing.php:458
15014
  #: shortcodes/pmpro_account.php:68
15015
  #: pages/billing.php:468
15016
+ #: pages/billing.php:475
15017
  msgid "Your membership is not active. <a href='%s'>Renew now.</a>"
15018
  msgstr ""
15019
 
15020
  #: pages/billing.php:461
15021
  #: shortcodes/pmpro_account.php:71
15022
  #: pages/billing.php:471
15023
+ #: pages/billing.php:478
15024
  msgid "You do not have an active membership. <a href='%s'>Register here.</a>"
15025
  msgstr ""
15026
 
15027
  #: pages/billing.php:464
15028
  #: shortcodes/pmpro_account.php:74
15029
  #: pages/billing.php:474
15030
+ #: pages/billing.php:481
15031
  msgid "You do not have an active membership. <a href='%s'>Choose a membership level.</a>"
15032
  msgstr ""
15033
 
15054
  #: paid-memberships-pro.php:170
15055
  #: paid-memberships-pro.php:172
15056
  #: paid-memberships-pro.php:173
15057
+ #: paid-memberships-pro.php:179
15058
  msgid "Default"
15059
  msgstr ""
15060
 
15080
  #: blocks/account-invoices-section/block.js:39
15081
  #: js/blocks.build.js:119
15082
  #: js/blocks.build.js:137
15083
+ #: blocks/account-invoices-section/block.js:48
15084
  msgid "Membership Account: Invoices"
15085
  msgstr ""
15086
 
15119
  #: js/blocks.build.js:1335
15120
  #: js/blocks.build.js:1496
15121
  #: js/blocks.build.js:1560
15122
+ #: blocks/account-invoices-section/block.js:35
15123
+ #: blocks/account-links-section/block.js:36
15124
+ #: blocks/account-membership-section/block.js:34
15125
+ #: blocks/account-page/block.js:40
15126
+ #: blocks/account-profile-section/block.js:35
15127
+ #: blocks/billing-page/block.js:35
15128
+ #: blocks/cancel-page/block.js:34
15129
+ #: blocks/checkout-button/block.js:44
15130
+ #: blocks/checkout-page/block.js:39
15131
+ #: blocks/confirmation-page/block.js:34
15132
+ #: blocks/invoice-page/block.js:34
15133
+ #: blocks/levels-page/block.js:33
15134
+ #: blocks/login/block.js:38
15135
+ #: blocks/member-profile-edit/block.js:31
15136
+ #: blocks/membership/block.js:47
15137
  msgid "pmpro"
15138
  msgstr ""
15139
 
15149
 
15150
  #: blocks/account-links-section/block.js:39
15151
  #: js/blocks.build.js:194
15152
+ #: blocks/account-links-section/block.js:48
15153
  msgid "Membership Account: Member Links"
15154
  msgstr ""
15155
 
15165
 
15166
  #: blocks/account-membership-section/block.js:39
15167
  #: js/blocks.build.js:251
15168
+ #: blocks/account-membership-section/block.js:46
15169
  msgid "Membership Account: My Memberships"
15170
  msgstr ""
15171
 
15198
  #: blocks/account-profile-section/block.js:40
15199
  #: js/blocks.build.js:492
15200
  #: js/blocks.build.js:510
15201
+ #: blocks/account-profile-section/block.js:46
15202
  msgid "Membership Account: Profile"
15203
  msgstr ""
15204
 
15211
  #: blocks/billing-page/block.js:39
15212
  #: js/blocks.build.js:549
15213
  #: js/blocks.build.js:567
15214
+ #: blocks/billing-page/block.js:45
15215
  msgid "Membership Billing Page"
15216
  msgstr ""
15217
 
15237
 
15238
  #: blocks/checkout-button/block.js:41
15239
  #: js/blocks.build.js:758
15240
+ #: blocks/checkout-button/block.js:40
15241
+ #: blocks/checkout-page/block.js:40
15242
+ #: blocks/confirmation-page/block.js:32
15243
  msgid "buy"
15244
  msgstr ""
15245
 
15246
  #: blocks/checkout-button/block.js:42
15247
  #: js/blocks.build.js:758
15248
+ #: blocks/checkout-button/block.js:41
15249
+ #: blocks/levels-page/block.js:31
15250
  msgid "level"
15251
  msgstr ""
15252
 
15254
  #: blocks/checkout-button/inspector.js:31
15255
  #: js/blocks.build.js:790
15256
  #: js/blocks.build.js:891
15257
+ #: blocks/checkout-button/block.js:71
15258
  msgid "Button Text"
15259
  msgstr ""
15260
 
15262
  #: blocks/checkout-button/inspector.js:48
15263
  #: js/blocks.build.js:807
15264
  #: js/blocks.build.js:910
15265
+ #: blocks/checkout-button/block.js:82
15266
  msgid "CSS Class"
15267
  msgstr ""
15268
 
15285
  #: blocks/checkout-page/block.js:52
15286
  #: js/blocks.build.js:973
15287
  #: js/blocks.build.js:1003
15288
+ #: blocks/checkout-page/block.js:59
15289
  msgid "Membership Checkout Form"
15290
  msgstr ""
15291
 
15311
 
15312
  #: blocks/invoice-page/block.js:39
15313
  #: js/blocks.build.js:1224
15314
+ #: blocks/invoice-page/block.js:46
15315
  msgid "Membership Invoices"
15316
  msgstr ""
15317
 
15319
  #: blocks/levels-page/block.js:39
15320
  #: js/blocks.build.js:1263
15321
  #: js/blocks.build.js:1281
15322
+ #: blocks/levels-page/block.js:45
15323
  msgid "Membership Levels List"
15324
  msgstr ""
15325
 
15352
 
15353
  #: blocks/login/block.js:38
15354
  #: js/blocks.build.js:1335
15355
+ #: blocks/login/block.js:34
15356
  msgid "log in"
15357
  msgstr ""
15358
 
15375
  #: blocks/member-profile-edit/block.js:35
15376
  #: js/blocks.build.js:1488
15377
  #: js/blocks.build.js:1504
15378
+ #: blocks/member-profile-edit/block.js:39
15379
  msgid "Member Profile Edit"
15380
  msgstr ""
15381
 
15386
 
15387
  #: blocks/member-profile-edit/block.js:27
15388
  #: js/blocks.build.js:1496
15389
+ #: blocks/account-invoices-section/block.js:32
15390
+ #: blocks/account-links-section/block.js:34
15391
+ #: blocks/account-membership-section/block.js:32
15392
+ #: blocks/account-page/block.js:37
15393
+ #: blocks/account-profile-section/block.js:33
15394
+ #: blocks/billing-page/block.js:32
15395
+ #: blocks/cancel-page/block.js:31
15396
+ #: blocks/checkout-button/block.js:42
15397
+ #: blocks/checkout-page/block.js:37
15398
+ #: blocks/confirmation-page/block.js:31
15399
  msgid "member"
15400
  msgstr ""
15401
 
15402
  #: blocks/member-profile-edit/block.js:28
15403
  #: js/blocks.build.js:1496
15404
+ #: blocks/account-page/block.js:41
15405
  msgid "profile"
15406
  msgstr ""
15407
 
15421
 
15422
  #: adminpages/discountcodes.php:871
15423
  #: adminpages/discountcodes.php:873
15424
+ #: adminpages/discountcodes.php:878
15425
  msgid "View Orders"
15426
  msgstr ""
15427
 
15435
  #: classes/gateways/class.pmprogateway_stripe.php:456
15436
  #: classes/gateways/class.pmprogateway_stripe.php:1797
15437
  #: classes/gateways/class.pmprogateway_stripe.php:1795
15438
+ #: classes/gateways/class.pmprogateway_stripe.php:2234
15439
  msgid "Connected with Legacy Keys"
15440
  msgstr ""
15441
 
15445
  #: classes/gateways/class.pmprogateway_stripe.php:466
15446
  #: classes/gateways/class.pmprogateway_stripe.php:1808
15447
  #: classes/gateways/class.pmprogateway_stripe.php:1806
15448
+ #: classes/gateways/class.pmprogateway_stripe.php:2245
15449
  msgid "You can continue to use the legacy API keys or choose to upgrade to our new Stripe Connect solution below."
15450
  msgstr ""
15451
 
15455
  #: classes/gateways/class.pmprogateway_stripe.php:468
15456
  #: classes/gateways/class.pmprogateway_stripe.php:1816
15457
  #: classes/gateways/class.pmprogateway_stripe.php:1814
15458
+ #: classes/gateways/class.pmprogateway_stripe.php:2253
15459
  msgid "Read the documentation on switching to Stripe Connect &raquo;"
15460
  msgstr ""
15461
 
15462
  #: adminpages/emailtemplates.php:181
15463
+ #: adminpages/emailtemplates.php:173
15464
  msgid "Custom Level Confirmation Message"
15465
  msgstr ""
15466
 
15471
  #: classes/class-pmpro-site-health.php:109
15472
  #: classes/class-pmpro-site-health.php:120
15473
  #: classes/class-pmpro-site-health.php:124
15474
+ #: classes/class-pmpro-site-health.php:128
15475
  msgid "No Levels Found"
15476
  msgstr ""
15477
 
15479
  #: classes/class-pmpro-site-health.php:128
15480
  #: classes/class-pmpro-site-health.php:139
15481
  #: classes/class-pmpro-site-health.php:143
15482
+ #: classes/class-pmpro-site-health.php:147
15483
  msgid "%d discount code"
15484
  msgid_plural "%d discount codes"
15485
  msgstr[0] ""
15489
  #: classes/class-pmpro-site-health.php:144
15490
  #: classes/class-pmpro-site-health.php:155
15491
  #: classes/class-pmpro-site-health.php:159
15492
+ #: classes/class-pmpro-site-health.php:163
15493
  msgid "%d order"
15494
  msgid_plural "%d orders"
15495
  msgstr[0] ""
15499
  #: classes/class-pmpro-site-health.php:161
15500
  #: classes/class-pmpro-site-health.php:172
15501
  #: classes/class-pmpro-site-health.php:176
15502
+ #: classes/class-pmpro-site-health.php:180
15503
  msgid "%s (gateway not registered)"
15504
  msgstr ""
15505
 
15506
  #: classes/class-pmpro-site-health.php:174
15507
  #: classes/class-pmpro-site-health.php:185
15508
  #: classes/class-pmpro-site-health.php:189
15509
+ #: classes/class-pmpro-site-health.php:193
15510
+ #: classes/class-pmpro-wisdom-integration.php:345
15511
  msgid "Legacy Keys"
15512
  msgstr ""
15513
 
15514
  #: classes/class-pmpro-site-health.php:178
15515
  #: classes/class-pmpro-site-health.php:189
15516
  #: classes/class-pmpro-site-health.php:193
15517
+ #: classes/class-pmpro-site-health.php:194
15518
+ #: classes/class-pmpro-site-health.php:198
15519
+ #: classes/class-pmpro-wisdom-integration.php:350
15520
  msgid "Stripe Connect"
15521
  msgstr ""
15522
 
15524
  #: classes/class-pmpro-site-health.php:202
15525
  #: classes/class-pmpro-site-health.php:213
15526
  #: classes/class-pmpro-site-health.php:217
15527
+ #: classes/class-pmpro-site-health.php:220
15528
+ #: classes/class-pmpro-site-health.php:224
15529
  msgid "%s (environment not registered)"
15530
  msgstr ""
15531
 
15532
  #: classes/class-pmpro-site-health.php:226
15533
  #: classes/class-pmpro-site-health.php:268
15534
  #: classes/class-pmpro-site-health.php:272
15535
+ #: classes/class-pmpro-site-health.php:275
15536
+ #: classes/class-pmpro-site-health.php:279
15537
  msgid "Unable to verify"
15538
  msgstr ""
15539
 
15541
  #: classes/class-pmpro-site-health.php:345
15542
  #: classes/class-pmpro-site-health.php:349
15543
  #: classes/class-pmpro-site-health.php:346
15544
+ #: classes/class-pmpro-site-health.php:342
15545
  msgid "missing"
15546
  msgstr ""
15547
 
15548
  #: classes/gateways/class.pmprogateway_stripe.php:533
15549
  #: classes/gateways/class.pmprogateway_stripe.php:539
15550
  #: classes/gateways/class.pmprogateway_stripe.php:303
15551
+ #: classes/gateways/class.pmprogateway_stripe.php:329
15552
  msgid "Having trouble connecting through the button above or otherwise need to use your own API keys?"
15553
  msgstr ""
15554
 
15555
  #: classes/gateways/class.pmprogateway_stripe.php:534
15556
  #: classes/gateways/class.pmprogateway_stripe.php:540
15557
  #: classes/gateways/class.pmprogateway_stripe.php:304
15558
+ #: classes/gateways/class.pmprogateway_stripe.php:330
15559
  msgid "Click here to use the legacy API settings."
15560
  msgstr ""
15561
 
15562
  #: adminpages/license.php:37
15563
+ #: adminpages/license.php:49
15564
  msgid "There was an issue validating your license key: %s"
15565
  msgstr ""
15566
 
15618
  #: classes/class-pmpro-site-health.php:365
15619
  #: classes/class-pmpro-site-health.php:406
15620
  #: classes/class-pmpro-site-health.php:403
15621
+ #: classes/class-pmpro-site-health.php:399
15622
  msgid "PMPRO_GETFILE_ENABLED is not set"
15623
  msgstr ""
15624
 
15625
  #: classes/class-pmpro-site-health.php:369
15626
  #: classes/class-pmpro-site-health.php:410
15627
  #: classes/class-pmpro-site-health.php:407
15628
+ #: classes/class-pmpro-site-health.php:403
15629
  msgid "PMPRO_GETFILE_ENABLED is off"
15630
  msgstr ""
15631
 
15635
  #: classes/class-pmpro-site-health.php:457
15636
  #: classes/class-pmpro-site-health.php:420
15637
  #: classes/class-pmpro-site-health.php:454
15638
+ #: classes/class-pmpro-site-health.php:450
15639
  msgid "Unable to access .htaccess file"
15640
  msgstr ""
15641
 
15645
  #: classes/class-pmpro-site-health.php:461
15646
  #: classes/class-pmpro-site-health.php:424
15647
  #: classes/class-pmpro-site-health.php:458
15648
+ #: classes/class-pmpro-site-health.php:454
15649
  msgid "Off - No .htaccess file"
15650
  msgstr ""
15651
 
15655
  #: classes/class-pmpro-site-health.php:472
15656
  #: classes/class-pmpro-site-health.php:430
15657
  #: classes/class-pmpro-site-health.php:469
15658
+ #: classes/class-pmpro-site-health.php:426
15659
+ #: classes/class-pmpro-site-health.php:465
15660
  msgid "Off"
15661
  msgstr ""
15662
 
15663
  #: classes/class-pmpro-site-health.php:395
15664
  #: classes/class-pmpro-site-health.php:436
15665
  #: classes/class-pmpro-site-health.php:433
15666
+ #: classes/class-pmpro-site-health.php:429
15667
  msgid "On - .htaccess contains services/getfile.php usage"
15668
  msgstr ""
15669
 
15670
  #: classes/class-pmpro-site-health.php:426
15671
  #: classes/class-pmpro-site-health.php:467
15672
  #: classes/class-pmpro-site-health.php:464
15673
+ #: classes/class-pmpro-site-health.php:460
15674
  msgid "On - Browser cache enabled for HTML (ExpiresByType text/html), this may interfere with Content Restriction after Login. Remove that line from your .htaccess to resolve this problem."
15675
  msgstr ""
15676
 
15677
  #: classes/class-pmpro-site-health.php:428
15678
  #: classes/class-pmpro-site-health.php:469
15679
  #: classes/class-pmpro-site-health.php:466
15680
+ #: classes/class-pmpro-site-health.php:462
15681
  msgid "On - Browser cache enabled for HTML (ExpiresDefault), this may interfere with Content Restriction after Login. Remove that line from your .htaccess to resolve this problem."
15682
  msgstr ""
15683
 
15684
  #: classes/class-pmpro-site-health.php:443
15685
  #: classes/class-pmpro-site-health.php:484
15686
  #: classes/class-pmpro-site-health.php:481
15687
+ #: classes/class-pmpro-site-health.php:508
15688
  msgid "Cron Limit"
15689
  msgstr ""
15690
 
15691
  #: classes/class-pmpro-site-health.php:444
15692
  #: classes/class-pmpro-site-health.php:485
15693
  #: classes/class-pmpro-site-health.php:482
15694
+ #: classes/class-pmpro-site-health.php:509
15695
  msgid "Default Membership Level"
15696
  msgstr ""
15697
 
15698
  #: classes/class-pmpro-site-health.php:445
15699
  #: classes/class-pmpro-site-health.php:486
15700
  #: classes/class-pmpro-site-health.php:483
15701
+ #: classes/class-pmpro-site-health.php:510
15702
  msgid "Use Sessions"
15703
  msgstr ""
15704
 
15705
  #: classes/class-pmpro-site-health.php:450
15706
  #: classes/class-pmpro-site-health.php:491
15707
  #: classes/class-pmpro-site-health.php:488
15708
+ #: classes/class-pmpro-site-health.php:515
15709
  msgid "Authorize.net Silent Post Debug Mode"
15710
  msgstr ""
15711
 
15712
  #: classes/class-pmpro-site-health.php:453
15713
  #: classes/class-pmpro-site-health.php:494
15714
  #: classes/class-pmpro-site-health.php:491
15715
+ #: classes/class-pmpro-site-health.php:518
15716
  msgid "Braintree Webhook Debug Mode"
15717
  msgstr ""
15718
 
15723
  #: classes/class-pmpro-site-health.php:500
15724
  #: classes/class-pmpro-site-health.php:503
15725
  #: classes/class-pmpro-site-health.php:494
15726
+ #: classes/class-pmpro-site-health.php:521
15727
+ #: classes/class-pmpro-site-health.php:524
15728
+ #: classes/class-pmpro-site-health.php:527
15729
  msgid "PayPal IPN Debug Mode"
15730
  msgstr ""
15731
 
15732
  #: classes/class-pmpro-site-health.php:465
15733
  #: classes/class-pmpro-site-health.php:506
15734
  #: classes/class-pmpro-site-health.php:503
15735
+ #: classes/class-pmpro-site-health.php:530
15736
  msgid "Stripe Webhook Delay"
15737
  msgstr ""
15738
 
15739
  #: classes/class-pmpro-site-health.php:466
15740
  #: classes/class-pmpro-site-health.php:507
15741
  #: classes/class-pmpro-site-health.php:504
15742
+ #: classes/class-pmpro-site-health.php:531
15743
  msgid "Stripe Webhook Debug Mode"
15744
  msgstr ""
15745
 
15746
  #: classes/class-pmpro-site-health.php:469
15747
  #: classes/class-pmpro-site-health.php:510
15748
  #: classes/class-pmpro-site-health.php:507
15749
+ #: classes/class-pmpro-site-health.php:534
15750
  msgid "2Checkout INS Debug Mode"
15751
  msgstr ""
15752
 
15753
  #: adminpages/advancedsettings.php:243
15754
+ #: adminpages/advancedsettings.php:250
15755
  msgid "Enable Spam Protection?"
15756
  msgstr ""
15757
 
15758
  #: adminpages/advancedsettings.php:249
15759
+ #: adminpages/advancedsettings.php:256
15760
  msgid "Yes - Enable Spam Protection"
15761
  msgstr ""
15762
 
15763
  #: adminpages/advancedsettings.php:251
15764
+ #: adminpages/advancedsettings.php:258
15765
  msgid "Block IPs from checkout if there are more than %d failures within %d minutes."
15766
  msgstr ""
15767
 
15768
  #: adminpages/dashboard.php:186
15769
  #: adminpages/dashboard.php:188
15770
+ #: adminpages/license.php:64
15771
+ #: adminpages/license.php:76
15772
  msgid "View Plans and Pricing"
15773
  msgstr ""
15774
 
15783
 
15784
  #: classes/class-pmpro-site-health.php:389
15785
  #: classes/class-pmpro-site-health.php:386
15786
+ #: classes/class-pmpro-site-health.php:382
15787
  msgid "No Membership Pages Found"
15788
  msgstr ""
15789
 
15790
  #: classes/gateways/class.pmprogateway_stripe.php:847
15791
+ #: classes/gateways/class.pmprogateway_stripe.php:955
15792
  msgid "Edit customer in Stripe"
15793
  msgstr ""
15794
 
15795
  #: classes/gateways/class.pmprogateway_stripe.php:1387
15796
+ #: classes/gateways/class.pmprogateway_stripe.php:1806
15797
  msgid "Error processing setup intent."
15798
  msgstr ""
15799
 
15800
  #: classes/gateways/class.pmprogateway_stripe.php:1402
15801
+ #: classes/gateways/class.pmprogateway_stripe.php:1821
15802
  msgid "Error processing payment intent."
15803
  msgstr ""
15804
 
15805
  #: classes/gateways/class.pmprogateway_stripe.php:1424
15806
  #: classes/gateways/class.pmprogateway_stripe.php:1679
15807
  #: classes/gateways/class.pmprogateway_stripe.php:1677
15808
+ #: classes/gateways/class.pmprogateway_stripe.php:1843
15809
+ #: classes/gateways/class.pmprogateway_stripe.php:2096
15810
  msgid "Error retrieving payment method."
15811
  msgstr ""
15812
 
15813
  #: classes/gateways/class.pmprogateway_stripe.php:1432
15814
  #: classes/gateways/class.pmprogateway_stripe.php:1687
15815
  #: classes/gateways/class.pmprogateway_stripe.php:1685
15816
+ #: classes/gateways/class.pmprogateway_stripe.php:1851
15817
+ #: classes/gateways/class.pmprogateway_stripe.php:2104
15818
  msgid "Error updating default payment method."
15819
  msgstr ""
15820
 
15821
  #: classes/gateways/class.pmprogateway_stripe.php:1460
15822
+ #: classes/gateways/class.pmprogateway_stripe.php:1879
15823
  msgid "Error creating subscription for customer."
15824
  msgstr ""
15825
 
15826
  #: classes/gateways/class.pmprogateway_stripe.php:1693
15827
  #: classes/gateways/class.pmprogateway_stripe.php:1691
15828
+ #: classes/gateways/class.pmprogateway_stripe.php:2110
15829
  msgid "Error updating payment method for subscription."
15830
  msgstr ""
15831
 
15832
  #: classes/gateways/class.pmprogateway_stripe.php:2088
15833
  #: classes/gateways/class.pmprogateway_stripe.php:2086
15834
  #: classes/gateways/class.pmprogateway_stripe.php:2087
15835
+ #: classes/gateways/class.pmprogateway_stripe.php:2526
15836
  msgid "Error updating customer record with Stripe."
15837
  msgstr ""
15838
 
15839
  #: classes/gateways/class.pmprogateway_stripe.php:2099
15840
  #: classes/gateways/class.pmprogateway_stripe.php:2097
15841
  #: classes/gateways/class.pmprogateway_stripe.php:2098
15842
+ #: classes/gateways/class.pmprogateway_stripe.php:2537
15843
  msgid "Error creating customer record with Stripe."
15844
  msgstr ""
15845
 
15846
  #: classes/gateways/class.pmprogateway_stripe.php:2424
15847
  #: classes/gateways/class.pmprogateway_stripe.php:2420
15848
  #: classes/gateways/class.pmprogateway_stripe.php:2422
15849
+ #: classes/gateways/class.pmprogateway_stripe.php:2418
15850
+ #: classes/gateways/class.pmprogateway_stripe.php:2875
15851
  msgid "Cannot find product for membership level."
15852
  msgstr ""
15853
 
15854
  #: classes/gateways/class.pmprogateway_stripe.php:2430
15855
  #: classes/gateways/class.pmprogateway_stripe.php:2426
15856
  #: classes/gateways/class.pmprogateway_stripe.php:2428
15857
+ #: classes/gateways/class.pmprogateway_stripe.php:2424
15858
+ #: classes/gateways/class.pmprogateway_stripe.php:2881
15859
  msgid "Cannot get price."
15860
  msgstr ""
15861
 
15862
  #: classes/gateways/class.pmprogateway_stripe.php:2580
15863
  #: classes/gateways/class.pmprogateway_stripe.php:2576
15864
  #: classes/gateways/class.pmprogateway_stripe.php:2578
15865
+ #: classes/gateways/class.pmprogateway_stripe.php:2574
15866
+ #: classes/gateways/class.pmprogateway_stripe.php:3031
15867
  msgid "Cannot reuse an old setup intent."
15868
  msgstr ""
15869
 
15871
  #: classes/gateways/class.pmprogateway_stripe.php:2616
15872
  #: classes/gateways/class.pmprogateway_stripe.php:2610
15873
  #: classes/gateways/class.pmprogateway_stripe.php:2612
15874
+ #: classes/gateways/class.pmprogateway_stripe.php:2608
15875
+ #: classes/gateways/class.pmprogateway_stripe.php:3065
15876
+ #: classes/gateways/class.pmprogateway_stripe.php:3067
15877
  msgid "Error adding metadata to setup intent."
15878
  msgstr ""
15879
 
15886
  #: classes/gateways/class.pmprogateway_stripe.php:2716
15887
  #: classes/gateways/class.pmprogateway_stripe.php:2712
15888
  #: classes/gateways/class.pmprogateway_stripe.php:2714
15889
+ #: classes/gateways/class.pmprogateway_stripe.php:2710
15890
+ #: classes/gateways/class.pmprogateway_stripe.php:3167
15891
  msgid "Remove"
15892
  msgstr ""
15893
 
15908
  msgstr ""
15909
 
15910
  #: adminpages/advancedsettings.php:497
15911
+ #: adminpages/advancedsettings.php:529
15912
  msgid "To delete all PMPro data from the database, set to Yes, deactivate PMPro, and then click to delete PMPro from the plugins page."
15913
  msgstr ""
15914
 
15915
  #: adminpages/dashboard.php:181
15916
  #: adminpages/license.php:43
15917
+ #: adminpages/license.php:55
15918
  msgid "Your <strong>%1$s</strong> key is active. %1$s accounts include access to documentation and free downloads."
15919
  msgstr ""
15920
 
15921
  #: adminpages/license.php:96
15922
+ #: adminpages/license.php:98
15923
  msgid "<strong>Paid Memberships Pro offers plans for automatic updates of Add Ons and premium support.</strong> These plans include a license key which we recommend for all public websites running Paid Memberships Pro. A license key allows you to automatically install Add Ons included in your plan and update active Add Ons included in your plan when a new security, bug fix, or feature enhancement is released."
15924
  msgstr ""
15925
 
15926
  #: adminpages/license.php:100
15927
+ #: adminpages/license.php:102
15928
  msgid "<strong>Need help?</strong> Your license allows you to open new tickets in our private support area. Purchases are backed by a 30 day, no questions asked refund policy."
15929
  msgstr ""
15930
 
15931
  #: adminpages/orders.php:1549
15932
+ #: adminpages/orders.php:1550
15933
  msgid "renewal"
15934
  msgstr ""
15935
 
15936
  #: adminpages/reports/sales.php:406
15937
+ #: adminpages/reports/sales.php:407
15938
  msgid "Renewals"
15939
  msgstr ""
15940
 
15941
  #: adminpages/reports/sales.php:407
15942
+ #: adminpages/reports/sales.php:408
15943
  msgid "New %s"
15944
  msgstr ""
15945
 
15946
  #: adminpages/reports/sales.php:409
15947
  #: adminpages/reports/sales.php:411
15948
+ #: adminpages/reports/sales.php:410
15949
+ #: adminpages/reports/sales.php:412
15950
  msgid "Average: %s"
15951
  msgstr ""
15952
 
15953
  #: adminpages/reports/sales.php:526
15954
+ #: adminpages/reports/sales.php:527
15955
  msgid "New:"
15956
  msgstr ""
15957
 
15958
  #: adminpages/reports/sales.php:529
15959
+ #: adminpages/reports/sales.php:530
15960
  msgid "Renewals:"
15961
  msgstr ""
15962
 
15963
  #: adminpages/reports/sales.php:532
15964
+ #: adminpages/reports/sales.php:533
15965
  msgid "Total:"
15966
  msgstr ""
15967
 
15968
  #: adminpages/reports/sales.php:545
15969
+ #: adminpages/reports/sales.php:546
15970
  msgid "%s %s for %s"
15971
  msgstr ""
15972
 
15991
  msgstr ""
15992
 
15993
  #: classes/class-pmpro-site-health.php:276
15994
+ #: classes/class-pmpro-site-health.php:279
15995
+ #: classes/class-pmpro-site-health.php:283
15996
  msgid "No template overrides"
15997
  msgstr ""
15998
 
15999
  #: classes/class-pmpro-site-health.php:282
16000
+ #: classes/class-pmpro-site-health.php:285
16001
+ #: classes/class-pmpro-site-health.php:289
16002
  msgid "Empty override folder -- no template overrides"
16003
  msgstr ""
16004
 
16005
  #: classes/gateways/class.pmprogateway_stripe.php:1868
16006
+ #: classes/gateways/class.pmprogateway_stripe.php:2307
16007
  msgid "Note: You are using the free Stripe payment gateway integration. This includes an additional 1% fee for payment processing. This fee is removed by activating a premium PMPro license."
16008
  msgstr ""
16009
 
16010
  #: classes/gateways/class.pmprogateway_stripe.php:2363
16011
  #: classes/gateways/class.pmprogateway_stripe.php:2365
16012
+ #: classes/gateways/class.pmprogateway_stripe.php:2361
16013
+ #: classes/gateways/class.pmprogateway_stripe.php:2815
16014
  msgid "Could not create price."
16015
  msgstr ""
16016
 
16070
  msgstr ""
16071
 
16072
  #: includes/privacy.php:512
16073
+ #: includes/privacy.php:513
16074
  msgid "%s agreed to %s (ID #%d, last modified %s) on %s."
16075
  msgstr ""
16076
 
16078
  #: js/blocks.build.js:1433
16079
  msgid "Assign the menu under Appearance > Menus."
16080
  msgstr ""
16081
+
16082
+ #: adminpages/advancedsettings.php:407
16083
+ #: adminpages/advancedsettings.php:414
16084
+ msgid "Redirect all traffic from registration page to /subscription/?"
16085
+ msgstr ""
16086
+
16087
+ #: adminpages/discountcodes.php:728
16088
+ #: adminpages/discountcodes.php:729
16089
+ msgid "Save Code"
16090
+ msgstr ""
16091
+
16092
+ #: adminpages/license.php:66
16093
+ #: adminpages/license.php:78
16094
+ msgid "Manage My Account"
16095
+ msgstr ""
16096
+
16097
+ #: adminpages/license.php:68
16098
+ #: adminpages/license.php:80
16099
+ msgid "Open Support Ticket"
16100
+ msgstr ""
16101
+
16102
+ #: adminpages/license.php:70
16103
+ #: adminpages/license.php:82
16104
+ msgid "Upgrade For Support"
16105
+ msgstr ""
16106
+
16107
+ #: adminpages/license.php:103
16108
+ #: adminpages/license.php:105
16109
+ msgid "View Support License Options &raquo;"
16110
+ msgstr ""
16111
+
16112
+ #: adminpages/orders.php:168
16113
+ msgid "Order %s deleted successfully."
16114
+ msgstr ""
16115
+
16116
+ #: adminpages/paymentsettings.php:116
16117
+ #: adminpages/paymentsettings.php:114
16118
+ msgid "Paid Memberships Pro - Payment Gateway Settings"
16119
+ msgstr ""
16120
+
16121
+ #: adminpages/paymentsettings.php:116
16122
+ #: adminpages/paymentsettings.php:114
16123
+ msgid "Payment Gateway Settings"
16124
+ msgstr ""
16125
+
16126
+ #: adminpages/paymentsettings.php:117
16127
+ #: adminpages/paymentsettings.php:115
16128
+ msgid "Paid Memberships Pro - SSL Settings"
16129
+ msgstr ""
16130
+
16131
+ #: adminpages/paymentsettings.php:117
16132
+ #: adminpages/paymentsettings.php:115
16133
+ msgid "SSL"
16134
+ msgstr ""
16135
+
16136
+ #. translators: %s and %s: Links to Payment Gateway Settings and SSL Settings docs.
16137
+ #: adminpages/paymentsettings.php:119
16138
+ #: adminpages/paymentsettings.php:117
16139
+ msgid "Learn more about %s and %s."
16140
+ msgstr ""
16141
+
16142
+ #. translators: %s: A link to the docs for the pmpro_tax filter.
16143
+ #: adminpages/paymentsettings.php:252
16144
+ #: adminpages/paymentsettings.php:250
16145
+ msgid "US only. If values are given, tax will be applied for any members ordering from the selected state. For non-US or more complex tax rules, use the %s."
16146
+ msgstr ""
16147
+
16148
+ #: adminpages/paymentsettings.php:297
16149
+ #: adminpages/paymentsettings.php:295
16150
+ msgid "SSL Certificate"
16151
+ msgstr ""
16152
+
16153
+ #. translators: %s: Link to SSL Certificate docs.
16154
+ #: adminpages/paymentsettings.php:299
16155
+ #: adminpages/paymentsettings.php:297
16156
+ msgid "Your %s must be installed by your web host. Use this field to display your seal or other trusted merchant images. This field does not accept JavaScript."
16157
+ msgstr ""
16158
+
16159
+ #: adminpages/reports/login.php:103
16160
+ #: adminpages/reports/login.php:109
16161
+ msgctxt "Dropdown label, e.g. Show All Users"
16162
+ msgid "Show"
16163
+ msgstr ""
16164
+
16165
+ #: adminpages/reports/login.php:122
16166
+ #: adminpages/reports/login.php:102
16167
+ msgctxt "Search form label"
16168
+ msgid "Search"
16169
+ msgstr ""
16170
+
16171
+ #: adminpages/reports/login.php:122
16172
+ #: adminpages/reports/login.php:102
16173
+ msgid "Users"
16174
+ msgstr ""
16175
+
16176
+ #: classes/class-pmpro-members-list-table.php:584
16177
+ msgid " + "
16178
+ msgstr ""
16179
+
16180
+ #: classes/class-pmpro-members-list-table.php:589
16181
+ msgid " per "
16182
+ msgstr ""
16183
+
16184
+ #: classes/gateways/class.pmprogateway_paypal.php:189
16185
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:208
16186
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:209
16187
+ msgid "Require an extra confirmation after users return from PayPal."
16188
+ msgstr ""
16189
+
16190
+ #: classes/gateways/class.pmprogateway_paypal.php:190
16191
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:209
16192
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:210
16193
+ msgid "Skip the extra confirmation after users return from PayPal."
16194
+ msgstr ""
16195
+
16196
+ #: classes/gateways/class.pmprogateway_stripe.php:1870
16197
+ #: classes/gateways/class.pmprogateway_stripe.php:2309
16198
+ msgid "Learn More &raquo;"
16199
+ msgstr ""
16200
+
16201
+ #: classes/gateways/class.pmprogateway_stripe.php:2645
16202
+ #: classes/gateways/class.pmprogateway_stripe.php:3102
16203
+ msgid "Subscription updates will be deprecated in a future version of PMPro, though your existing subscription updates will still trigger as expected. We now instead recommend updating the subscription directly in Stripe."
16204
+ msgstr ""
16205
+
16206
+ #: includes/lib/Twocheckout/Twocheckout/TwocheckoutCharge.php:15
16207
+ msgid "Click here if you are not redirected automatically."
16208
+ msgstr ""
16209
+
16210
+ #: includes/lib/Twocheckout/Twocheckout/TwocheckoutCharge.php:33
16211
+ msgid "Click here if the payment form does not open automatically."
16212
+ msgstr ""
16213
+
16214
+ #: includes/license.php:140
16215
+ msgid "Bad response code %s."
16216
+ msgstr ""
16217
+
16218
+ #: includes/updates.php:150
16219
+ msgid "You currently have the Better Login Reports Add On activated. This functionality has now been merged into Paid Memberships Pro. %s"
16220
+ msgstr ""
16221
+
16222
+ #: includes/updates.php:150
16223
+ msgid "Please deactivate and remove this plugin."
16224
+ msgstr ""
16225
+
16226
+ #: pages/levels.php:82
16227
+ msgid "Return to Your Account"
16228
+ msgstr ""
16229
+
16230
+ #: pages/levels.php:84
16231
+ msgid "Return to Home"
16232
+ msgstr ""
16233
+
16234
+ #. translators: $1$s - Paid Memberships Pro plugin name; $2$s - WP.org review link.
16235
+ #: adminpages/admin_footer.php:6
16236
+ msgid "<p>Please <a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">rate us &#9733;&#9733;&#9733;&#9733;&#9733; on WordPress.org</a> to help others find %2$s. Thank you from the %3$s team!</p>"
16237
+ msgstr ""
16238
+
16239
+ #: adminpages/advancedsettings.php:498
16240
+ msgid "Enable Tracking"
16241
+ msgstr ""
16242
+
16243
+ #: adminpages/advancedsettings.php:505
16244
+ msgid "Allow usage of Paid Memberships Pro to be tracked."
16245
+ msgstr ""
16246
+
16247
+ #: adminpages/advancedsettings.php:511
16248
+ msgid "Do not track usage of Paid Memberships Pro on my site."
16249
+ msgstr ""
16250
+
16251
+ #: adminpages/advancedsettings.php:515
16252
+ msgid "Sharing non-sensitive membership site data helps us analyze how our plugin is meeting your needs and identify opportunities to improve. Read about what usage data is tracked:"
16253
+ msgstr ""
16254
+
16255
+ #: adminpages/advancedsettings.php:516
16256
+ msgid "PaidMembershipsPro.com Usage Tracking"
16257
+ msgstr ""
16258
+
16259
+ #: adminpages/advancedsettings.php:516
16260
+ msgid "Paid Memberships Pro Usage Tracking"
16261
+ msgstr ""
16262
+
16263
+ #: adminpages/discountcodes.php:360
16264
+ #: adminpages/membershiplevels.php:169
16265
+ msgid "WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, <a target=\"_blank\" rel=\"nofollow noopener\" href=\"%s\">see our post here</a>."
16266
+ msgstr ""
16267
+
16268
+ #: adminpages/discountcodes.php:646
16269
+ msgid "Optional: Allow billing limits with Stripe using the <a href=\"%s\" title=\"Paid Memberships Pro - Stripe Billing Limits Add On\" target=\"_blank\" rel=\"nofollow nopopener\">Stripe Billing Limits Add On</a>."
16270
+ msgstr ""
16271
+
16272
+ #. translators: %s is the Order ID.
16273
+ #: adminpages/discountcodes.php:835
16274
+ #: adminpages/orders.php:1499
16275
+ msgid "ID: %s"
16276
+ msgstr ""
16277
+
16278
+ #: adminpages/emailsettings.php:133
16279
+ msgid "If you are having issues with email delivery from your server, <a href=\"%s\" title=\"Paid Memberships Pro - Subscription Delays Add On\" target=\"_blank\" rel=\"nofollow noopener\">please read our email troubleshooting guide</a>. As an alternative, Paid Memberships Pro offers built-in integration for SendWP. <em>Optional: SendWP is a third-party service for transactional email in WordPress. <a href=\"%s\" title=\"Documentation on SendWP and Paid Memberships Pro\" target=\"_blank\" rel=\"nofollow noopener\">Click here to learn more about SendWP and Paid Memberships Pro</a></em>."
16280
+ msgstr ""
16281
+
16282
+ #: adminpages/license.php:49
16283
+ #: adminpages/license.php:53
16284
+ msgid "Visit the PMPro <a href=\"%s\" target=\"_blank\">Membership Account</a> page to confirm that your account is active and to find your license key."
16285
+ msgstr ""
16286
+
16287
+ #: adminpages/license.php:51
16288
+ msgid "<strong>Enter your support license key</strong>. Your license key can be found in your membership email receipt or in your <a href=\"%s\" target=\"_blank\">Membership Account</a>."
16289
+ msgstr ""
16290
+
16291
+ #: adminpages/membershiplevels.php:479
16292
+ msgid "Optional: Allow billing limits with Stripe using the <a href=\"%s\" title=\"Paid Memberships Pro - Stripe Billing Limits Add On\" target=\"_blank\" rel=\"nofollow noopener\">Stripe Billing Limits Add On</a>."
16293
+ msgstr ""
16294
+
16295
+ #: adminpages/membershiplevels.php:506
16296
+ msgid "Optional: Allow more customizable trial periods and renewal dates using the <a href=\"%s\" title=\"Paid Memberships Pro - Subscription Delays Add On\" target=\"_blank\" rel=\"nofollow noopener\">Subscription Delays Add On</a>."
16297
+ msgstr ""
16298
+
16299
+ #: adminpages/membershiplevels.php:572
16300
+ msgid "Optional: Allow more customizable expiration dates using the <a href=\"%s\" title=\"Paid Memberships Pro - Set Expiration Date Add On\" target=\"_blank\" rel=\"nofollow noopener\">Set Expiration Date Add On</a>."
16301
+ msgstr ""
16302
+
16303
+ #: adminpages/membershiplevels.php:590
16304
+ msgid "WARNING: This level is set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a certain number of payments. For more information, <a target=\"_blank\" rel=\"nofollow noopener\" href=\"%s\">see our post here</a>."
16305
+ msgstr ""
16306
+
16307
+ #: adminpages/orders.php:188
16308
+ msgid "Order refunded successfully."
16309
+ msgstr ""
16310
+
16311
+ #: adminpages/orders.php:191
16312
+ #: adminpages/orders.php:196
16313
+ msgid "Error refunding order. Please check the order notes for more information."
16314
+ msgstr ""
16315
+
16316
+ #. translators: %s is the Order Code.
16317
+ #: adminpages/orders.php:419
16318
+ #: adminpages/orders.php:1478
16319
+ msgid "Refund order %s at the payment gateway. This action is permanent. The user and admin will receive an email confirmation after the refund is processed. Are you sure you want to refund this order?"
16320
+ msgstr ""
16321
+
16322
+ #: adminpages/orders.php:441
16323
+ msgid "View"
16324
+ msgstr ""
16325
+
16326
+ #: adminpages/orders.php:446
16327
+ #: adminpages/orders.php:448
16328
+ #: adminpages/orders.php:1563
16329
+ #: adminpages/orders.php:1565
16330
+ #: includes/email-templates.php:503
16331
+ msgid "Refund"
16332
+ msgstr ""
16333
+
16334
+ #: adminpages/orders.php:485
16335
+ msgid "A randomly generated code that serves as a unique, non-sequential invoice number."
16336
+ msgstr ""
16337
+
16338
+ #: adminpages/orders.php:534
16339
+ msgid "Member Information"
16340
+ msgstr ""
16341
+
16342
+ #: adminpages/orders.php:844
16343
+ msgid "MM/YYYY"
16344
+ msgstr ""
16345
+
16346
+ #: adminpages/orders.php:872
16347
+ msgid "Payment Gateway Information"
16348
+ msgstr ""
16349
+
16350
+ #: adminpages/orders.php:939
16351
+ #: adminpages/orders.php:1711
16352
+ msgid "View all orders for this subscription"
16353
+ msgstr ""
16354
+
16355
+ #: adminpages/orders.php:939
16356
+ #: adminpages/orders.php:1711
16357
+ msgid "Renewal"
16358
+ msgstr ""
16359
+
16360
+ #: adminpages/orders.php:948
16361
+ msgid "Additional Order Information"
16362
+ msgstr ""
16363
+
16364
+ #. translators: %1$s is the date and %2$s is the time.
16365
+ #: adminpages/orders.php:1718
16366
+ msgid "%1$s at %2$s"
16367
+ msgstr ""
16368
+
16369
+ #: blocks/blocks.php:45
16370
+ msgid "Paid Memberships Pro Pages"
16371
+ msgstr ""
16372
+
16373
+ #: classes/class-pmpro-site-health.php:105
16374
+ msgid "Library Conflicts"
16375
+ msgstr ""
16376
+
16377
+ #: classes/class-pmpro-site-health.php:481
16378
+ msgid "No library conflicts detected."
16379
+ msgstr ""
16380
+
16381
+ #: classes/class-pmpro-wisdom-integration.php:218
16382
+ msgid "Share your usage data to help us improve Paid Memberships Pro. We use this data to analyze how our plugin is meeting your needs and identify new opportunities to help you create a thriving membership business. You can always visit the Advanced Settings and change this preference."
16383
+ msgstr ""
16384
+
16385
+ #: classes/class-pmpro-wisdom-integration.php:219
16386
+ msgid "Read more about what data we collect."
16387
+ msgstr ""
16388
+
16389
+ #: classes/class-pmpro-wisdom-tracker.php:313
16390
+ msgid "We can't detect any product information. This is most probably because you have not included the code snippet."
16391
+ msgstr ""
16392
+
16393
+ #: classes/class-pmpro-wisdom-tracker.php:840
16394
+ msgid "Thank you for installing our %1$s. We would like to track its usage on your site. We don't record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional."
16395
+ msgstr ""
16396
+
16397
+ #: classes/class-pmpro-wisdom-tracker.php:843
16398
+ msgid "Thank you for installing our %1$s. We'd like your permission to track its usage on your site and subscribe you to our newsletter. We won't record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional."
16399
+ msgstr ""
16400
+
16401
+ #: classes/class-pmpro-wisdom-tracker.php:852
16402
+ msgid "Allow"
16403
+ msgstr ""
16404
+
16405
+ #: classes/class-pmpro-wisdom-tracker.php:853
16406
+ msgid "Do Not Allow"
16407
+ msgstr ""
16408
+
16409
+ #: classes/class-pmpro-wisdom-tracker.php:888
16410
+ msgid "Thank you for opting in to tracking. Would you like to receive occasional news about this %s, including details of new features and special offers?"
16411
+ msgstr ""
16412
+
16413
+ #: classes/class-pmpro-wisdom-tracker.php:895
16414
+ msgid "Yes Please"
16415
+ msgstr ""
16416
+
16417
+ #: classes/class-pmpro-wisdom-tracker.php:896
16418
+ msgid "No Thank You"
16419
+ msgstr ""
16420
+
16421
+ #: classes/class-pmpro-wisdom-tracker.php:929
16422
+ msgid "Sorry to see you go"
16423
+ msgstr ""
16424
+
16425
+ #: classes/class-pmpro-wisdom-tracker.php:930
16426
+ msgid "Before you deactivate the plugin, would you quickly give us your reason for doing so?"
16427
+ msgstr ""
16428
+
16429
+ #: classes/class-pmpro-wisdom-tracker.php:932
16430
+ msgid "Set up is too difficult"
16431
+ msgstr ""
16432
+
16433
+ #: classes/class-pmpro-wisdom-tracker.php:933
16434
+ msgid "Lack of documentation"
16435
+ msgstr ""
16436
+
16437
+ #: classes/class-pmpro-wisdom-tracker.php:934
16438
+ msgid "Not the features I wanted"
16439
+ msgstr ""
16440
+
16441
+ #: classes/class-pmpro-wisdom-tracker.php:935
16442
+ msgid "Found a better plugin"
16443
+ msgstr ""
16444
+
16445
+ #: classes/class-pmpro-wisdom-tracker.php:936
16446
+ msgid "Installed by mistake"
16447
+ msgstr ""
16448
+
16449
+ #: classes/class-pmpro-wisdom-tracker.php:937
16450
+ msgid "Only required temporarily"
16451
+ msgstr ""
16452
+
16453
+ #: classes/class-pmpro-wisdom-tracker.php:938
16454
+ msgid "Didn't work"
16455
+ msgstr ""
16456
+
16457
+ #: classes/class-pmpro-wisdom-tracker.php:940
16458
+ msgid "Details (optional)"
16459
+ msgstr ""
16460
+
16461
+ #: classes/class-pmpro-wisdom-tracker.php:983
16462
+ msgid "Submitting form"
16463
+ msgstr ""
16464
+
16465
+ #: classes/class-pmpro-wisdom-tracker.php:1052
16466
+ msgid "Submit and Deactivate"
16467
+ msgstr ""
16468
+
16469
+ #: classes/class-pmpro-wisdom-tracker.php:1052
16470
+ msgid "Just Deactivate"
16471
+ msgstr ""
16472
+
16473
+ #: classes/class.pmproemail.php:265
16474
+ msgid "Your invoice for order #%s at %s has been REFUNDED"
16475
+ msgstr ""
16476
+
16477
+ #: classes/class.pmproemail.php:331
16478
+ msgid "Invoice for order #%s at %s has been REFUNDED"
16479
+ msgstr ""
16480
+
16481
+ #. translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund.
16482
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:1128
16483
+ #: classes/gateways/class.pmprogateway_stripe.php:4791
16484
+ msgid "Admin: Order successfully refunded on %1$s for transaction ID %2$s by %3$s."
16485
+ msgstr ""
16486
+
16487
+ #. translators: %1$s is the Transaction ID. %1$s is the Gateway Error
16488
+ #: classes/gateways/class.pmprogateway_paypalexpress.php:1143
16489
+ msgid "Admin: There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s."
16490
+ msgstr ""
16491
+
16492
+ #: classes/gateways/class.pmprogateway_stripe.php:511
16493
+ msgid "Stripe Checkout Settings (Beta)"
16494
+ msgstr ""
16495
+
16496
+ #: classes/gateways/class.pmprogateway_stripe.php:514
16497
+ msgid "Stripe Checkout is currently in beta and not recommended for use on live sites."
16498
+ msgstr ""
16499
+
16500
+ #: classes/gateways/class.pmprogateway_stripe.php:515
16501
+ msgid "Stripe Checkout is a secure, Stripe-hosted payment page that lets you collect payments quickly. The offsite, conversion-optimized payment form works across devices, removes friction with real-time card validation, and has built-in error messaging. This gateway option relies heavily on the webhooks sent by Stripe. Your Stripe webhooks must be properly configured before enabling Stripe Checkout."
16502
+ msgstr ""
16503
+
16504
+ #: classes/gateways/class.pmprogateway_stripe.php:522
16505
+ msgid "Payment Flow"
16506
+ msgstr ""
16507
+
16508
+ #: classes/gateways/class.pmprogateway_stripe.php:526
16509
+ msgid "Accept payments on this site"
16510
+ msgstr ""
16511
+
16512
+ #: classes/gateways/class.pmprogateway_stripe.php:527
16513
+ msgid "Accept payments in Stripe (Stripe Checkout)"
16514
+ msgstr ""
16515
+
16516
+ #: classes/gateways/class.pmprogateway_stripe.php:529
16517
+ msgid "Embed the payment information fields on your Membership Checkout page or use the Stripe-hosted payment page (Stripe Checkout)."
16518
+ msgstr ""
16519
+
16520
+ #: classes/gateways/class.pmprogateway_stripe.php:534
16521
+ msgid "Update Billing Flow"
16522
+ msgstr ""
16523
+
16524
+ #: classes/gateways/class.pmprogateway_stripe.php:538
16525
+ msgid "Update billing on this site"
16526
+ msgstr ""
16527
+
16528
+ #: classes/gateways/class.pmprogateway_stripe.php:539
16529
+ msgid "Update billing in the Stripe Customer Portal"
16530
+ msgstr ""
16531
+
16532
+ #: classes/gateways/class.pmprogateway_stripe.php:541
16533
+ msgid "Embed the billing information fields on your Membership Billing page or use the Stripe Customer Portal hosted by Stripe."
16534
+ msgstr ""
16535
+
16536
+ #: classes/gateways/class.pmprogateway_stripe.php:546
16537
+ msgid "Collect Billing Address in Stripe Checkout"
16538
+ msgstr ""
16539
+
16540
+ #: classes/gateways/class.pmprogateway_stripe.php:550
16541
+ msgid "Only when necessary"
16542
+ msgstr ""
16543
+
16544
+ #: classes/gateways/class.pmprogateway_stripe.php:551
16545
+ msgid "Always"
16546
+ msgstr ""
16547
+
16548
+ #: classes/gateways/class.pmprogateway_stripe.php:557
16549
+ msgid "Stripe Tax"
16550
+ msgstr ""
16551
+
16552
+ #: classes/gateways/class.pmprogateway_stripe.php:561
16553
+ msgid "Do not calculate tax"
16554
+ msgstr ""
16555
+
16556
+ #: classes/gateways/class.pmprogateway_stripe.php:562
16557
+ msgid "Membership price includes tax"
16558
+ msgstr ""
16559
+
16560
+ #: classes/gateways/class.pmprogateway_stripe.php:563
16561
+ msgid "Calculate tax on top of membership price"
16562
+ msgstr ""
16563
+
16564
+ #: classes/gateways/class.pmprogateway_stripe.php:574
16565
+ msgid "Stripe Tax is only available when using Stripe Checkout (the Stripe-hosted payment page). You must <a target=\"_blank\" href=\"%s\">activate Stripe Tax</a> in your Stripe dashboard. <a target=\"_blank\" href=\"%s\">More information about Stripe Tax »</a>"
16566
+ msgstr ""
16567
+
16568
+ #: classes/gateways/class.pmprogateway_stripe.php:579
16569
+ msgid "Collect Tax IDs"
16570
+ msgstr ""
16571
+
16572
+ #: classes/gateways/class.pmprogateway_stripe.php:583
16573
+ msgid "No, do not collect tax IDs."
16574
+ msgstr ""
16575
+
16576
+ #: classes/gateways/class.pmprogateway_stripe.php:584
16577
+ msgid "Yes, collect tax IDs."
16578
+ msgstr ""
16579
+
16580
+ #: classes/gateways/class.pmprogateway_stripe.php:586
16581
+ msgid "Tax IDs are only collected if you have enabled Stripe Tax. Stripe only performs automatic validation for ABN, EU VAT, and GB VAT numbers. You must verify that provided tax IDs are valid during the Session for all other numbers."
16582
+ msgstr ""
16583
+
16584
+ #: classes/gateways/class.pmprogateway_stripe.php:1539
16585
+ msgid "Your previous order has not yet been processed. Submitting your payment again will cause a separate charge to be initiated."
16586
+ msgstr ""
16587
+
16588
+ #: classes/gateways/class.pmprogateway_stripe.php:1596
16589
+ msgid "Could not get customer. "
16590
+ msgstr ""
16591
+
16592
+ #: classes/gateways/class.pmprogateway_stripe.php:1605
16593
+ msgid "Could not get product ID."
16594
+ msgstr ""
16595
+
16596
+ #: classes/gateways/class.pmprogateway_stripe.php:1623
16597
+ msgid "Could not get price for initial payment. "
16598
+ msgstr ""
16599
+
16600
+ #: classes/gateways/class.pmprogateway_stripe.php:1648
16601
+ msgid "Could not get price for recurring payment. "
16602
+ msgstr ""
16603
+
16604
+ #: classes/gateways/class.pmprogateway_stripe.php:1717
16605
+ #: classes/gateways/class.pmprogateway_stripe.php:1721
16606
+ msgid "Could not create checkout session. "
16607
+ msgstr ""
16608
+
16609
+ #: classes/gateways/class.pmprogateway_stripe.php:1745
16610
+ msgid "Last order was not charged with Stripe."
16611
+ msgstr ""
16612
+
16613
+ #: classes/gateways/class.pmprogateway_stripe.php:1752
16614
+ msgid "Could not get Stripe customer for user."
16615
+ msgstr ""
16616
+
16617
+ #: classes/gateways/class.pmprogateway_stripe.php:1762
16618
+ msgid "Could not get Customer Portal URL. This feature may not be set up in Stripe."
16619
+ msgstr ""
16620
+
16621
+ #: classes/gateways/class.pmprogateway_stripe.php:1767
16622
+ msgid "Please contact the site administrator."
16623
+ msgstr ""
16624
+
16625
+ #: classes/gateways/class.pmprogateway_stripe.php:4803
16626
+ msgid "Admin: An error occured while attempting to process this refund."
16627
+ msgstr ""
16628
+
16629
+ #: classes/gateways/class.pmprogateway_stripe.php:4807
16630
+ #: classes/gateways/class.pmprogateway_stripe.php:4809
16631
+ msgid "Admin: There was a problem processing the refund"
16632
+ msgstr ""
16633
+
16634
+ #: includes/email-templates.php:502
16635
+ msgid "Your invoice for order #!!invoice_id!! at !!sitename!! has been REFUNDED"
16636
+ msgstr ""
16637
+
16638
+ #: includes/email-templates.php:504
16639
+ msgid ""
16640
+ "<p>Your invoice for order #!!invoice_id!! at !!sitename!! has been refunded.</p>\n"
16641
+ "\n"
16642
+ "<p>Account: !!display_name!! (!!user_email!!)</p>\n"
16643
+ "<p>\n"
16644
+ "\tInvoice #!!invoice_id!! on !!invoice_date!!<br />\n"
16645
+ "\tTotal Refunded: !!invoice_total!!\n"
16646
+ "</p>\n"
16647
+ "\n"
16648
+ "<p>Log in to your membership account here: !!login_url!!</p>\n"
16649
+ "<p>To view an online version of this invoice, click here: !!invoice_url!!</p>\n"
16650
+ "\n"
16651
+ "<p>If you did not request this refund and would like more information please contact us at !!siteemail!!</p>"
16652
+ msgstr ""
16653
+
16654
+ #: includes/email-templates.php:516
16655
+ msgid "This email is sent to the member as confirmation of a refunded payment. The email is sent after your membership site receives notification of a successful payment refund through your gateway."
16656
+ msgstr ""
16657
+
16658
+ #: includes/email-templates.php:519
16659
+ msgid "Invoice for order #!!invoice_id!! at !!sitename!! has been REFUNDED"
16660
+ msgstr ""
16661
+
16662
+ #: includes/email-templates.php:520
16663
+ msgid "Refund (admin)"
16664
+ msgstr ""
16665
+
16666
+ #: includes/email-templates.php:521
16667
+ msgid ""
16668
+ "<p>The invoice for order #!!invoice_id!! at !!sitename!! has been refunded.</p>\n"
16669
+ "\n"
16670
+ "<p>Account: !!display_name!! (!!user_email!!)</p>\n"
16671
+ "<p>\n"
16672
+ "\tInvoice #!!invoice_id!! on !!invoice_date!!<br />\n"
16673
+ "\tTotal Refunded: !!invoice_total!!\n"
16674
+ "</p>\n"
16675
+ "\n"
16676
+ "<p>Log in to your WordPress admin here: !!login_url!!</p>"
16677
+ msgstr ""
16678
+
16679
+ #: includes/email-templates.php:530
16680
+ msgid "This email is sent to the admin as confirmation of a refunded payment. The email is sent after your membership site receives notification of a successful payment refund through your gateway."
16681
+ msgstr ""
16682
+
16683
+ #: includes/profile.php:136
16684
+ msgid "Refund this user's most recent order."
16685
+ msgstr ""
16686
+
16687
+ #: blocks/account-invoices-section/block.js:22
16688
+ msgid "PMPro Page: Account Invoices"
16689
+ msgstr ""
16690
+
16691
+ #: blocks/account-invoices-section/block.js:23
16692
+ msgid "Dynamic page section that displays a list of the last 5 membership invoices for the active member."
16693
+ msgstr ""
16694
+
16695
+ #: blocks/account-invoices-section/block.js:31
16696
+ #: blocks/account-links-section/block.js:32
16697
+ #: blocks/account-page/block.js:33
16698
+ msgid "account"
16699
+ msgstr ""
16700
+
16701
+ #: blocks/account-invoices-section/block.js:33
16702
+ #: blocks/account-page/block.js:38
16703
+ #: blocks/invoice-page/block.js:32
16704
+ msgid "order"
16705
+ msgstr ""
16706
+
16707
+ #: blocks/account-invoices-section/block.js:34
16708
+ #: blocks/account-links-section/block.js:35
16709
+ #: blocks/account-membership-section/block.js:33
16710
+ #: blocks/account-page/block.js:39
16711
+ #: blocks/account-profile-section/block.js:34
16712
+ #: blocks/billing-page/block.js:33
16713
+ #: blocks/cancel-page/block.js:32
16714
+ #: blocks/checkout-button/block.js:43
16715
+ #: blocks/checkout-page/block.js:38
16716
+ #: blocks/confirmation-page/block.js:33
16717
+ #: blocks/invoice-page/block.js:33
16718
+ #: blocks/levels-page/block.js:32
16719
+ #: blocks/login/block.js:36
16720
+ #: blocks/member-profile-edit/block.js:30
16721
+ #: blocks/membership/block.js:46
16722
+ msgid "paid memberships pro"
16723
+ msgstr ""
16724
+
16725
+ #: blocks/account-invoices-section/block.js:36
16726
+ #: blocks/account-membership-section/block.js:35
16727
+ #: blocks/account-page/block.js:42
16728
+ #: blocks/invoice-page/block.js:35
16729
+ msgid "purchases"
16730
+ msgstr ""
16731
+
16732
+ #: blocks/account-invoices-section/block.js:37
16733
+ #: blocks/account-page/block.js:44
16734
+ #: blocks/confirmation-page/block.js:36
16735
+ #: blocks/invoice-page/block.js:36
16736
+ msgid "receipt"
16737
+ msgstr ""
16738
+
16739
+ #: blocks/account-invoices-section/block.js:38
16740
+ #: blocks/account-links-section/block.js:38
16741
+ #: blocks/account-membership-section/block.js:36
16742
+ #: blocks/account-page/block.js:45
16743
+ #: blocks/account-profile-section/block.js:36
16744
+ msgid "user"
16745
+ msgstr ""
16746
+
16747
+ #: blocks/account-links-section/block.js:22
16748
+ msgid "PMPro Page: Account Links"
16749
+ msgstr ""
16750
+
16751
+ #: blocks/account-links-section/block.js:23
16752
+ msgid "Dynamic page section that displays custom links available for the active member only. This block is only visible if other Add Ons or custom code have added links."
16753
+ msgstr ""
16754
+
16755
+ #: blocks/account-links-section/block.js:31
16756
+ msgid "access"
16757
+ msgstr ""
16758
+
16759
+ #: blocks/account-links-section/block.js:33
16760
+ msgid "link"
16761
+ msgstr ""
16762
+
16763
+ #: blocks/account-links-section/block.js:37
16764
+ #: blocks/account-page/block.js:43
16765
+ msgid "quick link"
16766
+ msgstr ""
16767
+
16768
+ #: blocks/account-membership-section/block.js:22
16769
+ msgid "PMPro Page: Account Memberships"
16770
+ msgstr ""
16771
+
16772
+ #: blocks/account-membership-section/block.js:23
16773
+ msgid "Dynamic page section to display the member's active membership information with links to view all membership options, update billing information, and change or cancel membership."
16774
+ msgstr ""
16775
+
16776
+ #: blocks/account-membership-section/block.js:31
16777
+ msgid "active"
16778
+ msgstr ""
16779
+
16780
+ #: blocks/account-page/block.js:24
16781
+ msgid "PMPro Page: Account (Full)"
16782
+ msgstr ""
16783
+
16784
+ #: blocks/account-page/block.js:25
16785
+ msgid "Dynamic page section to display the selected sections of the Membership Account page including Memberships, Profile, Invoices, and Member Links. These sections can also be added via separate blocks."
16786
+ msgstr ""
16787
+
16788
+ #: blocks/account-page/block.js:34
16789
+ msgid "billing"
16790
+ msgstr ""
16791
+
16792
+ #: blocks/account-page/block.js:35
16793
+ msgid "invoice"
16794
+ msgstr ""
16795
+
16796
+ #: blocks/account-page/block.js:36
16797
+ msgid "links"
16798
+ msgstr ""
16799
+
16800
+ #: blocks/account-profile-section/block.js:23
16801
+ msgid "PMPro Page: Account Profile View"
16802
+ msgstr ""
16803
+
16804
+ #: blocks/account-profile-section/block.js:24
16805
+ msgid "Dynamic page section that displays the member's profile as read-only information with a link to edit fields or their change password."
16806
+ msgstr ""
16807
+
16808
+ #: blocks/account-profile-section/block.js:32
16809
+ #: blocks/member-profile-edit/block.js:29
16810
+ msgid "fields"
16811
+ msgstr ""
16812
+
16813
+ #: blocks/billing-page/block.js:22
16814
+ msgid "PMPro Page: Billing"
16815
+ msgstr ""
16816
+
16817
+ #: blocks/billing-page/block.js:23
16818
+ msgid "Dynamic page section to display the member's billing information. Members can update their subscription payment method from this form."
16819
+ msgstr ""
16820
+
16821
+ #: blocks/billing-page/block.js:31
16822
+ msgid "credit card"
16823
+ msgstr ""
16824
+
16825
+ #: blocks/billing-page/block.js:34
16826
+ #: blocks/cancel-page/block.js:33
16827
+ msgid "payment method"
16828
+ msgstr ""
16829
+
16830
+ #: blocks/cancel-page/block.js:22
16831
+ msgid "PMPro Page: Cancel"
16832
+ msgstr ""
16833
+
16834
+ #: blocks/cancel-page/block.js:23
16835
+ msgid "Dynamic page section where members can cancel their membership and active subscription if applicable."
16836
+ msgstr ""
16837
+
16838
+ #: blocks/cancel-page/block.js:35
16839
+ msgid "terminate"
16840
+ msgstr ""
16841
+
16842
+ #: blocks/checkout-button/block.js:32
16843
+ msgid "Inserts a button that links directly to membership checkout for the selected level."
16844
+ msgstr ""
16845
+
16846
+ #: blocks/checkout-button/block.js:45
16847
+ #: blocks/checkout-page/block.js:41
16848
+ #: blocks/confirmation-page/block.js:35
16849
+ msgid "purchase"
16850
+ msgstr ""
16851
+
16852
+ #: blocks/checkout-page/block.js:29
16853
+ msgid "Dynamic form that allows users to complete free registration or paid checkout for the selected membership level."
16854
+ msgstr ""
16855
+
16856
+ #: blocks/checkout-page/block.js:42
16857
+ msgid "sell"
16858
+ msgstr ""
16859
+
16860
+ #: blocks/confirmation-page/block.js:22
16861
+ msgid "PMPro Page: Confirmation"
16862
+ msgstr ""
16863
+
16864
+ #: blocks/confirmation-page/block.js:23
16865
+ msgid "Dynamic page section that displays a confirmation message and purchase information for the active member immediately after membership registration and checkout."
16866
+ msgstr ""
16867
+
16868
+ #: blocks/confirmation-page/block.js:37
16869
+ msgid "success"
16870
+ msgstr ""
16871
+
16872
+ #: blocks/invoice-page/block.js:22
16873
+ msgid "PMPro Page: Invoice"
16874
+ msgstr ""
16875
+
16876
+ #: blocks/invoice-page/block.js:23
16877
+ msgid "Dynamic page section that displays a list of all invoices (purchase history) for the active member. Each invoice can be selected and viewed in full detail."
16878
+ msgstr ""
16879
+
16880
+ #: blocks/invoice-page/block.js:31
16881
+ msgid "history"
16882
+ msgstr ""
16883
+
16884
+ #: blocks/levels-page/block.js:22
16885
+ msgid "Membership Levels and Pricing Table"
16886
+ msgstr ""
16887
+
16888
+ #: blocks/levels-page/block.js:23
16889
+ msgid "Dynamic page section that displays a list of membership levels and pricing, linked to membership checkout. To reorder the display, navigate to Memberships > Settings > Levels."
16890
+ msgstr ""
16891
+
16892
+ #: blocks/levels-page/block.js:34
16893
+ msgid "price"
16894
+ msgstr ""
16895
+
16896
+ #: blocks/levels-page/block.js:35
16897
+ msgid "pricing table"
16898
+ msgstr ""
16899
+
16900
+ #: blocks/login/block.js:25
16901
+ msgid "Login Form"
16902
+ msgstr ""
16903
+
16904
+ #: blocks/login/block.js:26
16905
+ msgid "Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu."
16906
+ msgstr ""
16907
+
16908
+ #: blocks/login/block.js:35
16909
+ msgid "lost password"
16910
+ msgstr ""
16911
+
16912
+ #: blocks/login/block.js:37
16913
+ msgid "password reset"
16914
+ msgstr ""
16915
+
16916
+ #: blocks/member-profile-edit/block.js:19
16917
+ msgid "PMPro Page: Account Profile Edit"
16918
+ msgstr ""
16919
+
16920
+ #: blocks/member-profile-edit/block.js:20
16921
+ msgid "Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields."
16922
+ msgstr ""
16923
+
16924
+ #: blocks/member-profile-edit/block.js:28
16925
+ msgid "custom field"
16926
+ msgstr ""
16927
+
16928
+ #: blocks/member-profile-edit/block.js:32
16929
+ msgid "user fields"
16930
+ msgstr ""
16931
+
16932
+ #: blocks/membership/block.js:32
16933
+ msgid "Membership Required Block"
16934
+ msgstr ""
16935
+
16936
+ #: blocks/membership/block.js:33
16937
+ msgid "Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only."
16938
+ msgstr ""
16939
+
16940
+ #: blocks/membership/block.js:41
16941
+ msgid "block visibility"
16942
+ msgstr ""
16943
+
16944
+ #: blocks/membership/block.js:42
16945
+ msgid "confitional"
16946
+ msgstr ""
16947
+
16948
+ #: blocks/membership/block.js:43
16949
+ msgid "content"
16950
+ msgstr ""
16951
+
16952
+ #: blocks/membership/block.js:44
16953
+ msgid "hide"
16954
+ msgstr ""
16955
+
16956
+ #: blocks/membership/block.js:45
16957
+ msgid "hidden"
16958
+ msgstr ""
16959
+
16960
+ #: blocks/membership/block.js:48
16961
+ msgid "private"
16962
+ msgstr ""
16963
+
16964
+ #: blocks/membership/block.js:49
16965
+ msgid "restrict"
16966
+ msgstr ""
16967
+
16968
+ #: blocks/membership/block.js:98
16969
+ msgid "Which membership levels can view this block?"
16970
+ msgstr ""
16971
+
16972
+ #: blocks/membership/block.js:103
16973
+ msgid "What should users without access see?"
16974
+ msgstr ""
16975
+
16976
+ #: blocks/membership/block.js:106
16977
+ msgid "Modify the 'no access' message on the Memberships > Advanced Settings page."
16978
+ msgstr ""
16979
+
16980
+ #: blocks/membership/block.js:108
16981
+ msgid "Show nothing"
16982
+ msgstr ""
16983
+
16984
+ #: blocks/membership/block.js:109
16985
+ msgid "Show the 'no access' message"
16986
+ msgstr ""
16987
+
16988
+ #: blocks/membership/block.js:116
16989
+ #: blocks/membership/block.js:130
16990
+ msgid "Membership Required"
16991
+ msgstr ""
languages/paid-memberships-pro-ca_AD.mo CHANGED
Binary file
languages/paid-memberships-pro-ca_AD.po CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Paid Memberships Pro plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Paid Memberships Pro 2.7.5\n"
6
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
7
  "Last-Translator: Paid Memberships Pro <info@paidmembershipspro.com>\n"
8
  "Language-Team: Paid Memberships Pro <info@paidmembershipspro.com>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-03-01T15:06:09+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: paid-memberships-pro\n"
@@ -92,6 +92,8 @@ msgstr "Comproveu una vegada més"
92
  #: adminpages/orders.php:1022
93
  #: adminpages/orders.php:1014
94
  #: includes/metaboxes.php:19
 
 
95
  msgid "All"
96
  msgstr "Tot"
97
 
@@ -135,6 +137,7 @@ msgstr "Tipus"
135
  #: adminpages/membershiplevels.php:296
136
  #: adminpages/membershiplevels.php:298
137
  #: adminpages/membershiplevels.php:359
 
138
  msgid "Description"
139
  msgstr "Descripció"
140
 
@@ -215,6 +218,13 @@ msgstr "Activa %s"
215
  #: adminpages/discountcodes.php:866
216
  #: adminpages/orders.php:1417
217
  #: adminpages/orders.php:1419
 
 
 
 
 
 
 
218
  msgid "Delete"
219
  msgstr "Esborra"
220
 
@@ -279,6 +289,22 @@ msgstr "WordPress.org"
279
  #: adminpages/orders.php:1545
280
  #: adminpages/addons.php:250
281
  #: adminpages/orders.php:912
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  msgid "N/A"
283
  msgstr "N/A"
284
 
@@ -471,6 +497,14 @@ msgstr "Passarela de pagament (Payment Gateway) &amp; SSL"
471
  #: includes/profile.php:758
472
  #: adminpages/orders.php:1437
473
  #: adminpages/orders.php:1440
 
 
 
 
 
 
 
 
474
  msgid "Email"
475
  msgstr "Correu electrònic"
476
 
@@ -486,6 +520,7 @@ msgstr "Avançat"
486
  #: adminpages/advancedsettings.php:42
487
  #: adminpages/advancedsettings.php:68
488
  #: adminpages/advancedsettings.php:69
 
489
  msgid "Your advanced settings have been updated."
490
  msgstr "La vostra configuració avançada s’han actualitzat."
491
 
@@ -506,6 +541,7 @@ msgstr "Si us plau <a href=\"%s\">login</a> per a veure aquest contingut. (<a hr
506
  #: adminpages/advancedsettings.php:116
507
  #: includes/updates/upgrade_1.php:13
508
  #: adminpages/advancedsettings.php:118
 
509
  msgid "This content is for members only. Visit the site and log in/register to read."
510
  msgstr "Aquest contingut és només per a subscriptors. Visita el lloc i registra’t/log in per a llegir."
511
 
@@ -524,6 +560,7 @@ msgstr "Aquest contingut és només per a subscriptors. Visita el lloc i registr
524
  #: adminpages/advancedsettings.php:132
525
  #: includes/adminpages.php:73
526
  #: adminpages/advancedsettings.php:134
 
527
  msgid "Advanced Settings"
528
  msgstr "Configuració Avançada"
529
 
@@ -532,6 +569,7 @@ msgstr "Configuració Avançada"
532
  #: adminpages/advancedsettings.php:92
533
  #: adminpages/advancedsettings.php:164
534
  #: adminpages/advancedsettings.php:166
 
535
  msgid "Message for Logged-in Non-members"
536
  msgstr "Missatge per a No subscriptors “Logged-in”"
537
 
@@ -540,6 +578,7 @@ msgstr "Missatge per a No subscriptors “Logged-in”"
540
  #: adminpages/advancedsettings.php:96
541
  #: adminpages/advancedsettings.php:168
542
  #: adminpages/advancedsettings.php:170
 
543
  msgid "This message replaces the post content for non-members. Available variables"
544
  msgstr "Aquest missatge reemplaça el contingut de l’entrada per als no membres. Hi ha variables disponibles"
545
 
@@ -548,6 +587,7 @@ msgstr "Aquest missatge reemplaça el contingut de l’entrada per als no membre
548
  #: adminpages/advancedsettings.php:101
549
  #: adminpages/advancedsettings.php:173
550
  #: adminpages/advancedsettings.php:175
 
551
  msgid "Message for Logged-out Users"
552
  msgstr "Missatge per als usuaris desconnectats (Logged-out)"
553
 
@@ -556,6 +596,7 @@ msgstr "Missatge per als usuaris desconnectats (Logged-out)"
556
  #: adminpages/advancedsettings.php:105
557
  #: adminpages/advancedsettings.php:177
558
  #: adminpages/advancedsettings.php:179
 
559
  msgid "This message replaces the post content for logged-out visitors."
560
  msgstr "Aquest missatge remplaça el contingut del post per a visitants desconnectats (logged-out)"
561
 
@@ -564,6 +605,7 @@ msgstr "Aquest missatge remplaça el contingut del post per a visitants desconne
564
  #: adminpages/advancedsettings.php:110
565
  #: adminpages/advancedsettings.php:182
566
  #: adminpages/advancedsettings.php:184
 
567
  msgid "Message for RSS Feed"
568
  msgstr "Missatge per a RSS Feed"
569
 
@@ -572,24 +614,28 @@ msgstr "Missatge per a RSS Feed"
572
  #: adminpages/advancedsettings.php:114
573
  #: adminpages/advancedsettings.php:186
574
  #: adminpages/advancedsettings.php:188
 
575
  msgid "This message replaces the post content in RSS feeds."
576
  msgstr "Aquest missatge reemplaça el contingut del seu missatge en els canals RSS."
577
 
578
  #: adminpages/advancedsettings.php:122
579
  #: adminpages/advancedsettings.php:199
580
  #: adminpages/advancedsettings.php:201
 
581
  msgid "Filter searches and archives?"
582
  msgstr "Filtra recerques i arxius?"
583
 
584
  #: adminpages/advancedsettings.php:126
585
  #: adminpages/advancedsettings.php:203
586
  #: adminpages/advancedsettings.php:205
 
587
  msgid "No - Non-members will see restricted posts/pages in searches and archives."
588
  msgstr "No - No subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
589
 
590
  #: adminpages/advancedsettings.php:127
591
  #: adminpages/advancedsettings.php:204
592
  #: adminpages/advancedsettings.php:206
 
593
  msgid "Yes - Only members will see restricted posts/pages in searches and archives."
594
  msgstr "Sí - Només els subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
595
 
@@ -598,6 +644,7 @@ msgstr "Sí - Només els subscriptors veuran posts restringits/pàgines en les r
598
  #: adminpages/advancedsettings.php:120
599
  #: adminpages/advancedsettings.php:210
600
  #: adminpages/advancedsettings.php:212
 
601
  msgid "Show Excerpts to Non-Members?"
602
  msgstr "Mostrar extractes als no membres?"
603
 
@@ -606,6 +653,7 @@ msgstr "Mostrar extractes als no membres?"
606
  #: adminpages/advancedsettings.php:124
607
  #: adminpages/advancedsettings.php:214
608
  #: adminpages/advancedsettings.php:216
 
609
  msgid "No - Hide excerpts."
610
  msgstr "No - Amaga extractes."
611
 
@@ -614,12 +662,14 @@ msgstr "No - Amaga extractes."
614
  #: adminpages/advancedsettings.php:125
615
  #: adminpages/advancedsettings.php:215
616
  #: adminpages/advancedsettings.php:217
 
617
  msgid "Yes - Show excerpts."
618
  msgstr "Sí - Mostra extractes."
619
 
620
  #: adminpages/advancedsettings.php:144
621
  #: adminpages/advancedsettings.php:333
622
  #: adminpages/advancedsettings.php:348
 
623
  msgid "Hide Ads From Members?"
624
  msgstr "Amaga els anuncis als subscriptors?"
625
 
@@ -685,6 +735,17 @@ msgstr "Amaga els anuncis als subscriptors?"
685
  #: adminpages/advancedsettings.php:494
686
  #: classes/gateways/class.pmprogateway_stripe.php:404
687
  #: classes/gateways/class.pmprogateway_stripe.php:418
 
 
 
 
 
 
 
 
 
 
 
688
  msgid "No"
689
  msgstr "No"
690
 
@@ -693,6 +754,7 @@ msgstr "No"
693
  #: adminpages/advancedsettings.php:136
694
  #: adminpages/advancedsettings.php:338
695
  #: adminpages/advancedsettings.php:353
 
696
  msgid "Hide Ads From All Members"
697
  msgstr "Amaga Anuncis de tots els subscriptors"
698
 
@@ -701,6 +763,7 @@ msgstr "Amaga Anuncis de tots els subscriptors"
701
  #: adminpages/advancedsettings.php:137
702
  #: adminpages/advancedsettings.php:339
703
  #: adminpages/advancedsettings.php:354
 
704
  msgid "Hide Ads From Certain Members"
705
  msgstr "Amaga els anuncis a certs subscriptors"
706
 
@@ -715,6 +778,7 @@ msgstr "Els anuncis dels següents plugins seràn desactivats automàticament"
715
  #: adminpages/advancedsettings.php:145
716
  #: adminpages/advancedsettings.php:346
717
  #: adminpages/advancedsettings.php:361
 
718
  msgid "To hide ads in your template code, use code like the following"
719
  msgstr "Per amagar els anuncis al codi de la plantilla, utilitzeu el codi següent"
720
 
@@ -723,6 +787,7 @@ msgstr "Per amagar els anuncis al codi de la plantilla, utilitzeu el codi següe
723
  #: adminpages/advancedsettings.php:156
724
  #: adminpages/advancedsettings.php:355
725
  #: adminpages/advancedsettings.php:370
 
726
  msgid "Choose Levels to Hide Ads From"
727
  msgstr "Escull els nivells on amagar els anuncis"
728
 
@@ -741,6 +806,7 @@ msgstr "Redirigir tot el trànsit de la pàgina de registre a /susbcription/?"
741
  #: adminpages/advancedsettings.php:390
742
  #: adminpages/advancedsettings.php:392
743
  #: adminpages/advancedsettings.php:407
 
744
  msgid "multisite only"
745
  msgstr "només “multisite”"
746
 
@@ -795,6 +861,13 @@ msgstr "només “multisite”"
795
  #: adminpages/advancedsettings.php:412
796
  #: classes/gateways/class.pmprogateway_stripe.php:406
797
  #: classes/gateways/class.pmprogateway_stripe.php:420
 
 
 
 
 
 
 
798
  msgid "Yes"
799
  msgstr "Sí"
800
 
@@ -803,6 +876,7 @@ msgstr "Sí"
803
  #: adminpages/advancedsettings.php:202
804
  #: adminpages/advancedsettings.php:241
805
  #: adminpages/advancedsettings.php:256
 
806
  msgid "Use reCAPTCHA?"
807
  msgstr "Utilitzar reCAPTCHA?"
808
 
@@ -818,6 +892,7 @@ msgstr "Sí - Només subscripcions gratuïtes"
818
  #: adminpages/advancedsettings.php:208
819
  #: adminpages/advancedsettings.php:247
820
  #: adminpages/advancedsettings.php:262
 
821
  msgid "Yes - All memberships."
822
  msgstr "Sí - Tots els subscriptors"
823
 
@@ -826,6 +901,7 @@ msgstr "Sí - Tots els subscriptors"
826
  #: adminpages/advancedsettings.php:210
827
  #: adminpages/advancedsettings.php:249
828
  #: adminpages/advancedsettings.php:264
 
829
  msgid "A free reCAPTCHA key is required."
830
  msgstr "Una clau reCAPTCHA gratuïta és necessària"
831
 
@@ -834,6 +910,7 @@ msgstr "Una clau reCAPTCHA gratuïta és necessària"
834
  #: adminpages/advancedsettings.php:210
835
  #: adminpages/advancedsettings.php:249
836
  #: adminpages/advancedsettings.php:264
 
837
  msgid "Click here to signup for reCAPTCHA"
838
  msgstr "Clica aquí per a signar per al reCAPTCHA"
839
 
@@ -890,6 +967,10 @@ msgstr "Seleccionat"
890
  #: adminpages/advancedsettings.php:542
891
  #: adminpages/pagesettings.php:508
892
  #: adminpages/pagesettings.php:512
 
 
 
 
893
  msgid "Save Settings"
894
  msgstr "Desa la configuració"
895
 
@@ -965,6 +1046,7 @@ msgstr "Error esborrant el codi de descompte. Si us plau torna a intentar-ho."
965
  #: adminpages/discountcodes.php:796
966
  #: adminpages/discountcodes.php:354
967
  #: adminpages/discountcodes.php:798
 
968
  msgid "Code not found."
969
  msgstr "No s’ha trobat el codi."
970
 
@@ -987,6 +1069,7 @@ msgstr "Edita el codi de descompte"
987
  #: adminpages/discountcodes.php:735
988
  #: adminpages/discountcodes.php:377
989
  #: adminpages/discountcodes.php:737
 
990
  msgid "Add New Discount Code"
991
  msgstr "Afegeix un nou codi de descompte"
992
 
@@ -1033,6 +1116,12 @@ msgstr "Afegeix un nou codi de descompte"
1033
  #: adminpages/discountcodes.php:446
1034
  #: adminpages/discountcodes.php:785
1035
  #: adminpages/orders.php:1331
 
 
 
 
 
 
1036
  msgid "ID"
1037
  msgstr "ID"
1038
 
@@ -1047,6 +1136,7 @@ msgstr "ID"
1047
  #: adminpages/orders.php:415
1048
  #: adminpages/orders.php:421
1049
  #: adminpages/discountcodes.php:447
 
1050
  msgid "This will be generated when you save."
1051
  msgstr "Es generarà quan salvis."
1052
 
@@ -1078,6 +1168,11 @@ msgstr "Es generarà quan salvis."
1078
  #: adminpages/discountcodes.php:786
1079
  #: adminpages/orders.php:1332
1080
  #: adminpages/dashboard.php:292
 
 
 
 
 
1081
  msgid "Code"
1082
  msgstr "Codi"
1083
 
@@ -1091,6 +1186,7 @@ msgstr "Codi"
1091
  #: adminpages/discountcodes.php:489
1092
  #: includes/profile.php:501
1093
  #: includes/profile.php:497
 
1094
  msgid "Start Date"
1095
  msgstr "Data d’inici"
1096
 
@@ -1127,6 +1223,9 @@ msgstr "Data d’inici"
1127
  #: classes/gateways/class.pmprogateway_stripe.php:1320
1128
  #: classes/gateways/class.pmprogateway_stripe.php:1326
1129
  #: classes/gateways/class.pmprogateway_stripe.php:785
 
 
 
1130
  msgid "Expiration Date"
1131
  msgstr "Data final (d’expiració)"
1132
 
@@ -1141,6 +1240,7 @@ msgstr "Data final (d’expiració)"
1141
  #: adminpages/discountcodes.php:787
1142
  #: adminpages/discountcodes.php:525
1143
  #: adminpages/discountcodes.php:789
 
1144
  msgid "Uses"
1145
  msgstr "Utilitza"
1146
 
@@ -1174,6 +1274,7 @@ msgstr "A quins nivells s’aplicarà aquest codi?"
1174
  #: adminpages/discountcodes.php:574
1175
  #: adminpages/membershiplevels.php:401
1176
  #: adminpages/discountcodes.php:576
 
1177
  msgid "Initial Payment"
1178
  msgstr "Pagament inicial"
1179
 
@@ -1189,6 +1290,7 @@ msgstr "Pagament inicial"
1189
  #: adminpages/discountcodes.php:585
1190
  #: adminpages/membershiplevels.php:412
1191
  #: adminpages/discountcodes.php:587
 
1192
  msgid "The initial amount collected at registration."
1193
  msgstr "El pagament inicial efectuat en el registre"
1194
 
@@ -1204,6 +1306,7 @@ msgstr "El pagament inicial efectuat en el registre"
1204
  #: adminpages/discountcodes.php:590
1205
  #: adminpages/membershiplevels.php:417
1206
  #: adminpages/discountcodes.php:592
 
1207
  msgid "Recurring Subscription"
1208
  msgstr "Subscripció recurrent"
1209
 
@@ -1219,6 +1322,7 @@ msgstr "Subscripció recurrent"
1219
  #: adminpages/discountcodes.php:591
1220
  #: adminpages/membershiplevels.php:418
1221
  #: adminpages/discountcodes.php:593
 
1222
  msgid "Check if this level has a recurring subscription payment."
1223
  msgstr "Clica si aquest nivell té un pagament de subscripció recurrent"
1224
 
@@ -1233,6 +1337,7 @@ msgstr "Clica si aquest nivell té un pagament de subscripció recurrent"
1233
  #: adminpages/discountcodes.php:595
1234
  #: adminpages/membershiplevels.php:422
1235
  #: adminpages/discountcodes.php:597
 
1236
  msgid "Billing Amount"
1237
  msgstr "Total a facturar"
1238
 
@@ -1270,6 +1375,11 @@ msgstr "Total a facturar"
1270
  #: classes/gateways/class.pmprogateway_stripe.php:2641
1271
  #: classes/gateways/class.pmprogateway_stripe.php:2637
1272
  #: classes/gateways/class.pmprogateway_stripe.php:2639
 
 
 
 
 
1273
  msgid "Day(s)"
1274
  msgstr "Dia(es)"
1275
 
@@ -1307,6 +1417,11 @@ msgstr "Dia(es)"
1307
  #: classes/gateways/class.pmprogateway_stripe.php:2643
1308
  #: classes/gateways/class.pmprogateway_stripe.php:2639
1309
  #: classes/gateways/class.pmprogateway_stripe.php:2641
 
 
 
 
 
1310
  msgid "Month(s)"
1311
  msgstr "Mes(os)"
1312
 
@@ -1344,6 +1459,11 @@ msgstr "Mes(os)"
1344
  #: classes/gateways/class.pmprogateway_stripe.php:2642
1345
  #: classes/gateways/class.pmprogateway_stripe.php:2638
1346
  #: classes/gateways/class.pmprogateway_stripe.php:2640
 
 
 
 
 
1347
  msgid "Week(s)"
1348
  msgstr "Setmana(es)"
1349
 
@@ -1381,6 +1501,11 @@ msgstr "Setmana(es)"
1381
  #: classes/gateways/class.pmprogateway_stripe.php:2644
1382
  #: classes/gateways/class.pmprogateway_stripe.php:2640
1383
  #: classes/gateways/class.pmprogateway_stripe.php:2642
 
 
 
 
 
1384
  msgid "Year(s)"
1385
  msgstr "Any(s)"
1386
 
@@ -1396,6 +1521,7 @@ msgstr "Any(s)"
1396
  #: adminpages/discountcodes.php:618
1397
  #: adminpages/membershiplevels.php:446
1398
  #: adminpages/discountcodes.php:620
 
1399
  msgid "The amount to be billed one cycle after the initial payment."
1400
  msgstr "Total a facturar en un cicle després del pagament inicial"
1401
 
@@ -1411,6 +1537,7 @@ msgstr "Total a facturar en un cicle després del pagament inicial"
1411
  #: adminpages/discountcodes.php:628
1412
  #: adminpages/membershiplevels.php:465
1413
  #: adminpages/discountcodes.php:630
 
1414
  msgid "Billing Cycle Limit"
1415
  msgstr "Límit de cicle de facturació"
1416
 
@@ -1426,6 +1553,7 @@ msgstr "Límit de cicle de facturació"
1426
  #: adminpages/discountcodes.php:632
1427
  #: adminpages/membershiplevels.php:469
1428
  #: adminpages/discountcodes.php:634
 
1429
  msgid "The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite."
1430
  msgstr "El <strong>total</strong> de cicles de pagament recurrent per a aquest nivell, incloent el període de prova (si s’aplica) però sense incloure el pagament inicial. Deixa-ho a zero si la subscripció és infinita."
1431
 
@@ -1441,6 +1569,8 @@ msgstr "El <strong>total</strong> de cicles de pagament recurrent per a aquest n
1441
  #: adminpages/discountcodes.php:651
1442
  #: adminpages/membershiplevels.php:488
1443
  #: adminpages/discountcodes.php:653
 
 
1444
  msgid "Custom Trial"
1445
  msgstr "Prova personalitzada"
1446
 
@@ -1457,6 +1587,8 @@ msgstr "Prova personalitzada"
1457
  #: adminpages/discountcodes.php:653
1458
  #: adminpages/membershiplevels.php:490
1459
  #: adminpages/discountcodes.php:655
 
 
1460
  msgid "Check to add a custom trial period."
1461
  msgstr "Clica per afegir un període de prova personalitzat."
1462
 
@@ -1473,6 +1605,7 @@ msgstr "Clica per afegir un període de prova personalitzat."
1473
  #: adminpages/discountcodes.php:661
1474
  #: adminpages/membershiplevels.php:510
1475
  #: adminpages/discountcodes.php:663
 
1476
  msgid "Trial Billing Amount"
1477
  msgstr "Facturació per al període de prova"
1478
 
@@ -1489,6 +1622,7 @@ msgstr "Facturació per al període de prova"
1489
  #: adminpages/discountcodes.php:672
1490
  #: adminpages/membershiplevels.php:521
1491
  #: adminpages/discountcodes.php:674
 
1492
  msgid "for the first"
1493
  msgstr "per al primer"
1494
 
@@ -1505,6 +1639,7 @@ msgstr "per al primer"
1505
  #: adminpages/discountcodes.php:674
1506
  #: adminpages/membershiplevels.php:523
1507
  #: adminpages/discountcodes.php:676
 
1508
  msgid "subscription payments"
1509
  msgstr "pagaments de subscripció"
1510
 
@@ -1522,6 +1657,7 @@ msgstr "pagaments de subscripció"
1522
  #: adminpages/discountcodes.php:686
1523
  #: adminpages/membershiplevels.php:559
1524
  #: adminpages/discountcodes.php:688
 
1525
  msgid "Membership Expiration"
1526
  msgstr "Venciment de la subscripció"
1527
 
@@ -1538,6 +1674,7 @@ msgstr "Venciment de la subscripció"
1538
  #: adminpages/discountcodes.php:687
1539
  #: adminpages/membershiplevels.php:560
1540
  #: adminpages/discountcodes.php:689
 
1541
  msgid "Check this to set when membership access expires."
1542
  msgstr "Clica per afegir quan expira l’accés del subscriptor"
1543
 
@@ -1556,6 +1693,8 @@ msgstr "Clica per afegir quan expira l’accés del subscriptor"
1556
  #: adminpages/membershiplevels.php:575
1557
  #: pages/confirmation.php:140
1558
  #: adminpages/discountcodes.php:693
 
 
1559
  msgid "Expires In"
1560
  msgstr "Expira En"
1561
 
@@ -1572,6 +1711,8 @@ msgstr "Expira En"
1572
  #: adminpages/discountcodes.php:707
1573
  #: adminpages/membershiplevels.php:586
1574
  #: adminpages/discountcodes.php:709
 
 
1575
  msgid "Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires."
1576
  msgstr "Indiqueu la durada de l’accés de subcriptors. Recordeu que qualsevol pagament futur (recurrent de subscripció, si escau) es cancel·larà quan la subscripció caduqui."
1577
 
@@ -1581,6 +1722,7 @@ msgstr "Indiqueu la durada de l’accés de subcriptors. Recordeu que qualsevol
1581
  #: adminpages/discountcodes.php:556
1582
  #: adminpages/discountcodes.php:734
1583
  #: adminpages/discountcodes.php:736
 
1584
  msgid "Memberships Discount Codes"
1585
  msgstr "Codis de descompte per a subscripcions"
1586
 
@@ -1590,6 +1732,7 @@ msgstr "Codis de descompte per a subscripcions"
1590
  #: adminpages/discountcodes.php:566
1591
  #: adminpages/discountcodes.php:771
1592
  #: adminpages/discountcodes.php:773
 
1593
  msgid "Search Discount Codes"
1594
  msgstr "Cerca codis de descompte"
1595
 
@@ -1602,6 +1745,7 @@ msgstr "Cerca codis de descompte"
1602
  #: adminpages/reports/login.php:83
1603
  #: adminpages/discountcodes.php:774
1604
  #: adminpages/discountcodes.php:776
 
1605
  msgid "Search"
1606
  msgstr "Cerca"
1607
 
@@ -1611,6 +1755,7 @@ msgstr "Cerca"
1611
  #: adminpages/discountcodes.php:587
1612
  #: adminpages/discountcodes.php:785
1613
  #: adminpages/discountcodes.php:787
 
1614
  msgid "Starts"
1615
  msgstr "Comença"
1616
 
@@ -1639,6 +1784,9 @@ msgstr "Comença"
1639
  #: adminpages/discountcodes.php:788
1640
  #: includes/profile.php:65
1641
  #: adminpages/dashboard.php:228
 
 
 
1642
  msgid "Expires"
1643
  msgstr "Acaba"
1644
 
@@ -1649,6 +1797,7 @@ msgstr "Acaba"
1649
  #: adminpages/admin_header.php:253
1650
  #: adminpages/discountcodes.php:788
1651
  #: adminpages/discountcodes.php:790
 
1652
  msgid "Levels"
1653
  msgstr "Nivells"
1654
 
@@ -1690,6 +1839,8 @@ msgstr "Els codis de descompte et permeten oferir"
1690
  #: adminpages/orders.php:1565
1691
  #: adminpages/orders.php:1564
1692
  #: adminpages/orders.php:1556
 
 
1693
  msgid "edit"
1694
  msgstr "Edita"
1695
 
@@ -1748,6 +1899,7 @@ msgstr "Configuració de correu electrònic"
1748
  #: adminpages/emailsettings.php:70
1749
  #: adminpages/emailsettings.php:61
1750
  #: adminpages/emailsettings.php:88
 
1751
  msgid "By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below."
1752
  msgstr "Per defecte, els correus electrònics generats són enviats desde <em><strong>wordpress@yourdomain.com</strong></em>. Pots modificar-ho utilitzant els camps que hi ha a continuació."
1753
 
@@ -1759,22 +1911,26 @@ msgstr "Per modificar l’aparença dels emails generats pel sistema, afegeix el
1759
  #: adminpages/emailsettings.php:78
1760
  #: adminpages/emailsettings.php:69
1761
  #: adminpages/emailsettings.php:94
 
1762
  msgid "From Email"
1763
  msgstr "Del Correu Electrònic"
1764
 
1765
  #: adminpages/emailsettings.php:86
1766
  #: adminpages/emailsettings.php:77
1767
  #: adminpages/emailsettings.php:102
 
1768
  msgid "From Name"
1769
  msgstr "Del Nom"
1770
 
1771
  #: adminpages/emailsettings.php:94
1772
  #: adminpages/emailsettings.php:110
 
1773
  msgid "Only Filter PMPro Emails?"
1774
  msgstr "Filtra només els correus de PMPro?"
1775
 
1776
  #: adminpages/emailsettings.php:98
1777
  #: adminpages/emailsettings.php:114
 
1778
  #, php-format
1779
  msgid "If unchecked, all emails from \"WordPress &lt;%s&gt;\" will be filtered to use the above settings."
1780
  msgstr "Si no està clicat, tots els correus de \"WordPress &lt;%s&gt;\" seran filtrats per utilitzar la configuració de dalt."
@@ -1943,6 +2099,9 @@ msgstr "Afegeix un nou nivell de subscripció"
1943
  #: adminpages/membershiplevels.php:808
1944
  #: adminpages/reports/history.php:184
1945
  #: adminpages/reports/login.php:181
 
 
 
1946
  msgid "Name"
1947
  msgstr "Nom"
1948
 
@@ -1950,6 +2109,7 @@ msgstr "Nom"
1950
  #: adminpages/membershiplevels.php:314
1951
  #: adminpages/membershiplevels.php:316
1952
  #: adminpages/membershiplevels.php:377
 
1953
  msgid "Confirmation Message"
1954
  msgstr "Missatge de confirmació"
1955
 
@@ -1963,6 +2123,8 @@ msgstr "Missatge de confirmació"
1963
  #: adminpages/membershiplevels.php:639
1964
  #: adminpages/membershiplevels.php:397
1965
  #: adminpages/membershiplevels.php:809
 
 
1966
  msgid "Billing Details"
1967
  msgstr "Detalls de facturació"
1968
 
@@ -1986,6 +2148,9 @@ msgstr "Detalls de facturació"
1986
  #: classes/gateways/class.pmprogateway_stripe.php:2700
1987
  #: classes/gateways/class.pmprogateway_stripe.php:2696
1988
  #: classes/gateways/class.pmprogateway_stripe.php:2698
 
 
 
1989
  msgid "per"
1990
  msgstr "per"
1991
 
@@ -2004,6 +2169,7 @@ msgstr "La integració d’Stripe actualment només suporta períodes de factura
2004
  #: adminpages/discountcodes.php:620
2005
  #: adminpages/membershiplevels.php:448
2006
  #: adminpages/discountcodes.php:622
 
2007
  msgid "Braintree integration currently only supports billing periods of \"Month\" or \"Year\"."
2008
  msgstr "La integració de Braintree actualment només suporta períodes de facturació de “mes” o “any”."
2009
 
@@ -2021,6 +2187,7 @@ msgstr "La integració de Payflow actualment només suporta períodes de factura
2021
  #: adminpages/membershiplevels.php:393
2022
  #: adminpages/membershiplevels.php:396
2023
  #: adminpages/membershiplevels.php:454
 
2024
  msgid "After saving this level, make note of the ID and create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to <em>pmpro_#</em>, where # is the level ID."
2025
  msgstr "Després de salvar aquest nivell, anota’t la ID i crea un \"Plan\" al dashboard de Braintree amb la mateixa configuració i el \"Plan ID\" set to <em>pmpro_#</em>, on # és el level ID."
2026
 
@@ -2043,6 +2210,8 @@ msgstr "Després de salvar aquest nivell, anota’t la ID i crea un \"Plan\" al
2043
  #: adminpages/membershiplevels.php:454
2044
  #: adminpages/membershiplevels.php:459
2045
  #: classes/gateways/class.pmprogateway_cybersource.php:89
 
 
2046
  msgid "Note"
2047
  msgstr "Nota"
2048
 
@@ -2062,6 +2231,7 @@ msgstr "Has de crear un “Plan\" a Braintree dashboard amb la mateixa configura
2062
  #: adminpages/discountcodes.php:634
2063
  #: adminpages/membershiplevels.php:471
2064
  #: adminpages/discountcodes.php:636
 
2065
  msgid "Stripe integration currently does not support billing limits. You can still set an expiration date below."
2066
  msgstr "La integració d’Stripe no suporta límits de facturació actualment. Pots posar una data de límit de facturació a sota."
2067
 
@@ -2073,6 +2243,8 @@ msgstr "La integració d’Stripe no suporta límits de facturació actualment.
2073
  #: adminpages/discountcodes.php:655
2074
  #: adminpages/membershiplevels.php:493
2075
  #: adminpages/discountcodes.php:657
 
 
2076
  msgid "2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount."
2077
  msgstr "La integració de 2Checkout no suporta proves personalitzades. Pots afegir un període de prova configurant un pagament inicial diferent del total de facturació."
2078
 
@@ -2085,6 +2257,7 @@ msgstr "La integració de 2Checkout no suporta proves personalitzades. Pots afeg
2085
  #: adminpages/discountcodes.php:676
2086
  #: adminpages/membershiplevels.php:525
2087
  #: adminpages/discountcodes.php:678
 
2088
  msgid "Stripe integration currently does not support trial amounts greater than $0."
2089
  msgstr "La integració d’Stripe no suporta preus de prova majors que $0."
2090
 
@@ -2097,6 +2270,7 @@ msgstr "La integració d’Stripe no suporta preus de prova majors que $0."
2097
  #: adminpages/discountcodes.php:678
2098
  #: adminpages/membershiplevels.php:527
2099
  #: adminpages/discountcodes.php:680
 
2100
  msgid "Braintree integration currently does not support trial amounts greater than $0."
2101
  msgstr "La integració de Braintree no suporta preus de prova majors que $0."
2102
 
@@ -2109,6 +2283,7 @@ msgstr "La integració de Braintree no suporta preus de prova majors que $0."
2109
  #: adminpages/discountcodes.php:680
2110
  #: adminpages/membershiplevels.php:529
2111
  #: adminpages/discountcodes.php:682
 
2112
  msgid "Payflow integration currently does not support trial amounts greater than $0."
2113
  msgstr "La integració de Payflow no suporta preus de prova majors que $0."
2114
 
@@ -2123,6 +2298,7 @@ msgstr "La integració de Payflow no suporta preus de prova majors que $0."
2123
  #: adminpages/dashboard.php:140
2124
  #: adminpages/membershiplevels.php:550
2125
  #: adminpages/advancedsettings.php:343
 
2126
  msgid "Other Settings"
2127
  msgstr "Configuració, altres"
2128
 
@@ -2158,6 +2334,8 @@ msgstr "Clica per amagar aquest nivell de la pàgina de nivells de subscripció
2158
  #: adminpages/advancedsettings.php:194
2159
  #: adminpages/membershiplevels.php:624
2160
  #: adminpages/advancedsettings.php:196
 
 
2161
  msgid "Content Settings"
2162
  msgstr "Configuració de continguts"
2163
 
@@ -2169,12 +2347,14 @@ msgstr "Configuració de continguts"
2169
  #: adminpages/membershiplevels.php:497
2170
  #: adminpages/membershiplevels.php:500
2171
  #: adminpages/membershiplevels.php:654
 
2172
  msgid "Categories"
2173
  msgstr "Categories"
2174
 
2175
  #: adminpages/membershiplevels.php:516
2176
  #: adminpages/membershiplevels.php:517
2177
  #: adminpages/membershiplevels.php:674
 
2178
  msgid "Save Level"
2179
  msgstr "Salva nivell"
2180
 
@@ -2209,6 +2389,14 @@ msgstr "Salva nivell"
2209
  #: includes/profile.php:918
2210
  #: adminpages/orders.php:960
2211
  #: pages/billing.php:436
 
 
 
 
 
 
 
 
2212
  msgid "Cancel"
2213
  msgstr "Cancel·la"
2214
 
@@ -2249,6 +2437,7 @@ msgstr "Cerca Nivells"
2249
  #: adminpages/membershiplevels.php:579
2250
  #: adminpages/membershiplevels.php:631
2251
  #: adminpages/membershiplevels.php:797
 
2252
  msgid "Drag and drop membership levels to reorder them on the Levels page."
2253
  msgstr "Arrossega i deixa anar els nivells de subscripció per a reordenar-los a la pàgina de nivells"
2254
 
@@ -2273,6 +2462,9 @@ msgstr "Arrossega i deixa anar els nivells de subscripció per a reordenar-los a
2273
  #: pages/confirmation.php:99
2274
  #: pages/invoice.php:89
2275
  #: shortcodes/pmpro_account.php:44
 
 
 
2276
  msgid "Expiration"
2277
  msgstr "Data final (d’expiració)"
2278
 
@@ -2285,6 +2477,7 @@ msgstr "Data final (d’expiració)"
2285
  #: adminpages/membershiplevels.php:587
2286
  #: adminpages/membershiplevels.php:641
2287
  #: adminpages/membershiplevels.php:811
 
2288
  msgid "Allow Signups"
2289
  msgstr "Permet nous “signups”"
2290
 
@@ -2298,6 +2491,7 @@ msgstr "Permet nous “signups”"
2298
  #: adminpages/membershiplevels.php:656
2299
  #: adminpages/membershiplevels.php:840
2300
  #: adminpages/membershiplevels.php:921
 
2301
  msgid "FREE"
2302
  msgstr "GRATUÏT"
2303
 
@@ -2311,6 +2505,7 @@ msgstr "GRATUÏT"
2311
  #: adminpages/membershiplevels.php:665
2312
  #: adminpages/membershiplevels.php:849
2313
  #: adminpages/membershiplevels.php:930
 
2314
  msgid "After"
2315
  msgstr "Després"
2316
 
@@ -2356,6 +2551,7 @@ msgstr "copia"
2356
  #: includes/adminpages.php:149
2357
  #: includes/adminpages.php:153
2358
  #: adminpages/memberslist.php:20
 
2359
  msgid "Members List"
2360
  msgstr "Llistat de subscriptors"
2361
 
@@ -2368,6 +2564,9 @@ msgstr "Llistat de subscriptors"
2368
  #: adminpages/orders.php:994
2369
  #: adminpages/orders.php:1000
2370
  #: adminpages/orders.php:992
 
 
 
2371
  msgid "Export to CSV"
2372
  msgstr "Exporta a CSV"
2373
 
@@ -2395,6 +2594,10 @@ msgstr "Exporta a CSV"
2395
  #: adminpages/orders.php:1012
2396
  #: adminpages/reports/sales.php:311
2397
  #: classes/class-pmpro-members-list-table.php:651
 
 
 
 
2398
  msgid "Show"
2399
  msgstr "Mostra"
2400
 
@@ -2421,6 +2624,10 @@ msgstr "Mostra"
2421
  #: classes/class.pmproemail.php:195
2422
  #: classes/class.pmproemail.php:235
2423
  #: classes/class-pmpro-members-list-table.php:653
 
 
 
 
2424
  msgid "All Levels"
2425
  msgstr "Tots els nivells"
2426
 
@@ -2430,6 +2637,7 @@ msgstr "Tots els nivells"
2430
  #: classes/class-pmpro-members-list-table.php:234
2431
  #: classes/class-pmpro-members-list-table.php:634
2432
  #: classes/class-pmpro-members-list-table.php:663
 
2433
  msgid "Cancelled Members"
2434
  msgstr "Subscriptors cancel·lats"
2435
 
@@ -2439,6 +2647,7 @@ msgstr "Subscriptors cancel·lats"
2439
  #: classes/class-pmpro-members-list-table.php:235
2440
  #: classes/class-pmpro-members-list-table.php:635
2441
  #: classes/class-pmpro-members-list-table.php:664
 
2442
  msgid "Expired Members"
2443
  msgstr "Subscriptors “expirats”"
2444
 
@@ -2449,6 +2658,7 @@ msgstr "Subscriptors “expirats”"
2449
  #: classes/class-pmpro-members-list-table.php:236
2450
  #: classes/class-pmpro-members-list-table.php:636
2451
  #: classes/class-pmpro-members-list-table.php:665
 
2452
  msgid "Old Members"
2453
  msgstr "Subscriptors antics"
2454
 
@@ -2460,6 +2670,9 @@ msgstr "Subscriptors antics"
2460
  #: adminpages/memberslist.php:28
2461
  #: adminpages/reports/history.php:115
2462
  #: adminpages/reports/history.php:119
 
 
 
2463
  msgid "Search Members"
2464
  msgstr "Cerca Subscriptors"
2465
 
@@ -2497,6 +2710,9 @@ msgstr "%d subscriptor no trobat."
2497
  #: adminpages/dashboard.php:223
2498
  #: adminpages/dashboard.php:225
2499
  #: classes/class.memberorder.php:1003
 
 
 
2500
  msgid "Username"
2501
  msgstr "Nom d’usuari"
2502
 
@@ -2539,6 +2755,8 @@ msgstr "Cognoms"
2539
  #: pages/checkout.php:230
2540
  #: pages/confirmation.php:78
2541
  #: pages/invoice.php:68
 
 
2542
  msgid "Billing Address"
2543
  msgstr "Adreça de Facturació"
2544
 
@@ -2574,6 +2792,7 @@ msgstr "Preu"
2574
  #: adminpages/reports/login.php:183
2575
  #: adminpages/dashboard.php:225
2576
  #: adminpages/dashboard.php:227
 
2577
  msgid "Joined"
2578
  msgstr "Afegit"
2579
 
@@ -2597,6 +2816,7 @@ msgstr "Finalitzat"
2597
  #: adminpages/dashboard.php:232
2598
  #: classes/class-pmpro-members-list-table.php:225
2599
  #: adminpages/dashboard.php:234
 
2600
  msgid "No members found."
2601
  msgstr "No s’han trobat subscriptors"
2602
 
@@ -2611,6 +2831,7 @@ msgstr "No s’han trobat subscriptors"
2611
  #: adminpages/reports/login.php:263
2612
  #: classes/class-pmpro-members-list-table.php:228
2613
  #: classes/class-pmpro-members-list-table.php:227
 
2614
  msgid "Search all levels"
2615
  msgstr "Cerca a tots els nivells"
2616
 
@@ -2637,6 +2858,7 @@ msgstr "Comanda esborrada correctament"
2637
  #: adminpages/orders.php:72
2638
  #: adminpages/orders.php:164
2639
  #: adminpages/orders.php:170
 
2640
  msgid "Error deleting order."
2641
  msgstr "Error esborrant comanda."
2642
 
@@ -2645,6 +2867,8 @@ msgstr "Error esborrant comanda."
2645
  #: adminpages/orders.php:169
2646
  #: adminpages/orders.php:309
2647
  #: adminpages/orders.php:315
 
 
2648
  msgid "Order saved successfully."
2649
  msgstr "Comanda salvada correctament."
2650
 
@@ -2659,6 +2883,8 @@ msgstr "Error actualitzant la marca de temps de la comanda (order timestamp)"
2659
  #: adminpages/orders.php:180
2660
  #: adminpages/orders.php:312
2661
  #: adminpages/orders.php:318
 
 
2662
  msgid "Error saving order."
2663
  msgstr "Error guardant la comanda."
2664
 
@@ -2671,6 +2897,8 @@ msgstr "Error guardant la comanda."
2671
  #: classes/class.memberorder.php:963
2672
  #: adminpages/orders.php:389
2673
  #: classes/class.memberorder.php:1005
 
 
2674
  msgid "Order"
2675
  msgstr "Comanda"
2676
 
@@ -2680,6 +2908,8 @@ msgstr "Comanda"
2680
  #: adminpages/orders.php:348
2681
  #: adminpages/orders.php:387
2682
  #: adminpages/orders.php:393
 
2
  # This file is distributed under the same license as the Paid Memberships Pro plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Paid Memberships Pro 2.8\n"
6
  "Report-Msgid-Bugs-To: info@paidmembershipspro.com\n"
7
  "Last-Translator: Paid Memberships Pro <info@paidmembershipspro.com>\n"
8
  "Language-Team: Paid Memberships Pro <info@paidmembershipspro.com>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-05-05T20:36:59+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: paid-memberships-pro\n"
92
  #: adminpages/orders.php:1022
93
  #: adminpages/orders.php:1014
94
  #: includes/metaboxes.php:19
95
+ #: adminpages/orders.php:1015
96
+ #: adminpages/orders.php:1103
97
  msgid "All"
98
  msgstr "Tot"
99
 
137
  #: adminpages/membershiplevels.php:296
138
  #: adminpages/membershiplevels.php:298
139
  #: adminpages/membershiplevels.php:359
140
+ #: adminpages/membershiplevels.php:357
141
  msgid "Description"
142
  msgstr "Descripció"
143
 
218
  #: adminpages/discountcodes.php:866
219
  #: adminpages/orders.php:1417
220
  #: adminpages/orders.php:1419
221
+ #: adminpages/orders.php:1418
222
+ #: adminpages/orders.php:1420
223
+ #: adminpages/discountcodes.php:869
224
+ #: adminpages/discountcodes.php:871
225
+ #: adminpages/membershiplevels.php:885
226
+ #: adminpages/orders.php:1533
227
+ #: adminpages/orders.php:1535
228
  msgid "Delete"
229
  msgstr "Esborra"
230
 
289
  #: adminpages/orders.php:1545
290
  #: adminpages/addons.php:250
291
  #: adminpages/orders.php:912
292
+ #: adminpages/orders.php:583
293
+ #: adminpages/orders.php:913
294
+ #: adminpages/orders.php:1537
295
+ #: adminpages/orders.php:1546
296
+ #: adminpages/orders.php:704
297
+ #: adminpages/orders.php:996
298
+ #: adminpages/orders.php:1689
299
+ #: adminpages/orders.php:1698
300
+ #: classes/class.pmproemail.php:261
301
+ #: classes/class.pmproemail.php:327
302
+ #: includes/profile.php:167
303
+ #: includes/profile.php:483
304
+ #: includes/profile.php:484
305
+ #: includes/profile.php:556
306
+ #: includes/profile.php:557
307
+ #: includes/profile.php:558
308
  msgid "N/A"
309
  msgstr "N/A"
310
 
497
  #: includes/profile.php:758
498
  #: adminpages/orders.php:1437
499
  #: adminpages/orders.php:1440
500
+ #: adminpages/orders.php:392
501
+ #: adminpages/orders.php:1438
502
+ #: adminpages/orders.php:1441
503
+ #: adminpages/orders.php:440
504
+ #: adminpages/orders.php:1553
505
+ #: adminpages/orders.php:1556
506
+ #: includes/profile.php:478
507
+ #: includes/profile.php:798
508
  msgid "Email"
509
  msgstr "Correu electrònic"
510
 
520
  #: adminpages/advancedsettings.php:42
521
  #: adminpages/advancedsettings.php:68
522
  #: adminpages/advancedsettings.php:69
523
+ #: adminpages/advancedsettings.php:76
524
  msgid "Your advanced settings have been updated."
525
  msgstr "La vostra configuració avançada s’han actualitzat."
526
 
541
  #: adminpages/advancedsettings.php:116
542
  #: includes/updates/upgrade_1.php:13
543
  #: adminpages/advancedsettings.php:118
544
+ #: adminpages/advancedsettings.php:126
545
  msgid "This content is for members only. Visit the site and log in/register to read."
546
  msgstr "Aquest contingut és només per a subscriptors. Visita el lloc i registra’t/log in per a llegir."
547
 
560
  #: adminpages/advancedsettings.php:132
561
  #: includes/adminpages.php:73
562
  #: adminpages/advancedsettings.php:134
563
+ #: adminpages/advancedsettings.php:142
564
  msgid "Advanced Settings"
565
  msgstr "Configuració Avançada"
566
 
569
  #: adminpages/advancedsettings.php:92
570
  #: adminpages/advancedsettings.php:164
571
  #: adminpages/advancedsettings.php:166
572
+ #: adminpages/advancedsettings.php:173
573
  msgid "Message for Logged-in Non-members"
574
  msgstr "Missatge per a No subscriptors “Logged-in”"
575
 
578
  #: adminpages/advancedsettings.php:96
579
  #: adminpages/advancedsettings.php:168
580
  #: adminpages/advancedsettings.php:170
581
+ #: adminpages/advancedsettings.php:177
582
  msgid "This message replaces the post content for non-members. Available variables"
583
  msgstr "Aquest missatge reemplaça el contingut de l’entrada per als no membres. Hi ha variables disponibles"
584
 
587
  #: adminpages/advancedsettings.php:101
588
  #: adminpages/advancedsettings.php:173
589
  #: adminpages/advancedsettings.php:175
590
+ #: adminpages/advancedsettings.php:182
591
  msgid "Message for Logged-out Users"
592
  msgstr "Missatge per als usuaris desconnectats (Logged-out)"
593
 
596
  #: adminpages/advancedsettings.php:105
597
  #: adminpages/advancedsettings.php:177
598
  #: adminpages/advancedsettings.php:179
599
+ #: adminpages/advancedsettings.php:186
600
  msgid "This message replaces the post content for logged-out visitors."
601
  msgstr "Aquest missatge remplaça el contingut del post per a visitants desconnectats (logged-out)"
602
 
605
  #: adminpages/advancedsettings.php:110
606
  #: adminpages/advancedsettings.php:182
607
  #: adminpages/advancedsettings.php:184
608
+ #: adminpages/advancedsettings.php:191
609
  msgid "Message for RSS Feed"
610
  msgstr "Missatge per a RSS Feed"
611
 
614
  #: adminpages/advancedsettings.php:114
615
  #: adminpages/advancedsettings.php:186
616
  #: adminpages/advancedsettings.php:188
617
+ #: adminpages/advancedsettings.php:195
618
  msgid "This message replaces the post content in RSS feeds."
619
  msgstr "Aquest missatge reemplaça el contingut del seu missatge en els canals RSS."
620
 
621
  #: adminpages/advancedsettings.php:122
622
  #: adminpages/advancedsettings.php:199
623
  #: adminpages/advancedsettings.php:201
624
+ #: adminpages/advancedsettings.php:208
625
  msgid "Filter searches and archives?"
626
  msgstr "Filtra recerques i arxius?"
627
 
628
  #: adminpages/advancedsettings.php:126
629
  #: adminpages/advancedsettings.php:203
630
  #: adminpages/advancedsettings.php:205
631
+ #: adminpages/advancedsettings.php:212
632
  msgid "No - Non-members will see restricted posts/pages in searches and archives."
633
  msgstr "No - No subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
634
 
635
  #: adminpages/advancedsettings.php:127
636
  #: adminpages/advancedsettings.php:204
637
  #: adminpages/advancedsettings.php:206
638
+ #: adminpages/advancedsettings.php:213
639
  msgid "Yes - Only members will see restricted posts/pages in searches and archives."
640
  msgstr "Sí - Només els subscriptors veuran posts restringits/pàgines en les recerques i els arxius."
641
 
644
  #: adminpages/advancedsettings.php:120
645
  #: adminpages/advancedsettings.php:210
646
  #: adminpages/advancedsettings.php:212
647
+ #: adminpages/advancedsettings.php:219
648
  msgid "Show Excerpts to Non-Members?"
649
  msgstr "Mostrar extractes als no membres?"
650
 
653
  #: adminpages/advancedsettings.php:124
654
  #: adminpages/advancedsettings.php:214
655
  #: adminpages/advancedsettings.php:216
656
+ #: adminpages/advancedsettings.php:223
657
  msgid "No - Hide excerpts."
658
  msgstr "No - Amaga extractes."
659
 
662
  #: adminpages/advancedsettings.php:125
663
  #: adminpages/advancedsettings.php:215
664
  #: adminpages/advancedsettings.php:217
665
+ #: adminpages/advancedsettings.php:224
666
  msgid "Yes - Show excerpts."
667
  msgstr "Sí - Mostra extractes."
668
 
669
  #: adminpages/advancedsettings.php:144
670
  #: adminpages/advancedsettings.php:333
671
  #: adminpages/advancedsettings.php:348
672
+ #: adminpages/advancedsettings.php:355
673
  msgid "Hide Ads From Members?"
674
  msgstr "Amaga els anuncis als subscriptors?"
675
 
735
  #: adminpages/advancedsettings.php:494
736
  #: classes/gateways/class.pmprogateway_stripe.php:404
737
  #: classes/gateways/class.pmprogateway_stripe.php:418
738
+ #: adminpages/paymentsettings.php:279
739
+ #: adminpages/advancedsettings.php:254
740
+ #: adminpages/advancedsettings.php:267
741
+ #: adminpages/advancedsettings.php:359
742
+ #: adminpages/advancedsettings.php:418
743
+ #: adminpages/advancedsettings.php:526
744
+ #: adminpages/membershiplevels.php:939
745
+ #: adminpages/paymentsettings.php:277
746
+ #: classes/gateways/class.pmprogateway_stripe.php:430
747
+ #: classes/gateways/class.pmprogateway_stripe.php:444
748
+ #: includes/profile.php:78
749
  msgid "No"
750
  msgstr "No"
751
 
754
  #: adminpages/advancedsettings.php:136
755
  #: adminpages/advancedsettings.php:338
756
  #: adminpages/advancedsettings.php:353
757
+ #: adminpages/advancedsettings.php:360
758
  msgid "Hide Ads From All Members"
759
  msgstr "Amaga Anuncis de tots els subscriptors"
760
 
763
  #: adminpages/advancedsettings.php:137
764
  #: adminpages/advancedsettings.php:339
765
  #: adminpages/advancedsettings.php:354
766
+ #: adminpages/advancedsettings.php:361
767
  msgid "Hide Ads From Certain Members"
768
  msgstr "Amaga els anuncis a certs subscriptors"
769
 
778
  #: adminpages/advancedsettings.php:145
779
  #: adminpages/advancedsettings.php:346
780
  #: adminpages/advancedsettings.php:361
781
+ #: adminpages/advancedsettings.php:368
782
  msgid "To hide ads in your template code, use code like the following"
783
  msgstr "Per amagar els anuncis al codi de la plantilla, utilitzeu el codi següent"
784
 
787
  #: adminpages/advancedsettings.php:156
788
  #: adminpages/advancedsettings.php:355
789
  #: adminpages/advancedsettings.php:370
790
+ #: adminpages/advancedsettings.php:377
791
  msgid "Choose Levels to Hide Ads From"
792
  msgstr "Escull els nivells on amagar els anuncis"
793
 
806
  #: adminpages/advancedsettings.php:390
807
  #: adminpages/advancedsettings.php:392
808
  #: adminpages/advancedsettings.php:407
809
+ #: adminpages/advancedsettings.php:414
810
  msgid "multisite only"
811
  msgstr "només “multisite”"
812
 
861
  #: adminpages/advancedsettings.php:412
862
  #: classes/gateways/class.pmprogateway_stripe.php:406
863
  #: classes/gateways/class.pmprogateway_stripe.php:420
864
+ #: adminpages/paymentsettings.php:280
865
+ #: adminpages/advancedsettings.php:419
866
+ #: adminpages/membershiplevels.php:934
867
+ #: adminpages/paymentsettings.php:278
868
+ #: classes/gateways/class.pmprogateway_stripe.php:432
869
+ #: classes/gateways/class.pmprogateway_stripe.php:446
870
+ #: includes/profile.php:79
871
  msgid "Yes"
872
  msgstr "Sí"
873
 
876
  #: adminpages/advancedsettings.php:202
877
  #: adminpages/advancedsettings.php:241
878
  #: adminpages/advancedsettings.php:256
879
+ #: adminpages/advancedsettings.php:263
880
  msgid "Use reCAPTCHA?"
881
  msgstr "Utilitzar reCAPTCHA?"
882
 
892
  #: adminpages/advancedsettings.php:208
893
  #: adminpages/advancedsettings.php:247
894
  #: adminpages/advancedsettings.php:262
895
+ #: adminpages/advancedsettings.php:269
896
  msgid "Yes - All memberships."
897
  msgstr "Sí - Tots els subscriptors"
898
 
901
  #: adminpages/advancedsettings.php:210
902
  #: adminpages/advancedsettings.php:249
903
  #: adminpages/advancedsettings.php:264
904
+ #: adminpages/advancedsettings.php:271
905
  msgid "A free reCAPTCHA key is required."
906
  msgstr "Una clau reCAPTCHA gratuïta és necessària"
907
 
910
  #: adminpages/advancedsettings.php:210
911
  #: adminpages/advancedsettings.php:249
912
  #: adminpages/advancedsettings.php:264
913
+ #: adminpages/advancedsettings.php:271
914
  msgid "Click here to signup for reCAPTCHA"
915
  msgstr "Clica aquí per a signar per al reCAPTCHA"
916
 
967
  #: adminpages/advancedsettings.php:542
968
  #: adminpages/pagesettings.php:508
969
  #: adminpages/pagesettings.php:512
970
+ #: adminpages/paymentsettings.php:316
971
+ #: adminpages/advancedsettings.php:574
972
+ #: adminpages/pagesettings.php:511
973
+ #: adminpages/paymentsettings.php:314
974
  msgid "Save Settings"
975
  msgstr "Desa la configuració"
976
 
1046
  #: adminpages/discountcodes.php:796
1047
  #: adminpages/discountcodes.php:354
1048
  #: adminpages/discountcodes.php:798
1049
+ #: adminpages/discountcodes.php:799
1050
  msgid "Code not found."
1051
  msgstr "No s’ha trobat el codi."
1052
 
1069
  #: adminpages/discountcodes.php:735
1070
  #: adminpages/discountcodes.php:377
1071
  #: adminpages/discountcodes.php:737
1072
+ #: adminpages/discountcodes.php:738
1073
  msgid "Add New Discount Code"
1074
  msgstr "Afegeix un nou codi de descompte"
1075
 
1116
  #: adminpages/discountcodes.php:446
1117
  #: adminpages/discountcodes.php:785
1118
  #: adminpages/orders.php:1331
1119
+ #: adminpages/orders.php:1332
1120
+ #: adminpages/reports/login.php:182
1121
+ #: adminpages/templates/orders-email.php:49
1122
+ #: adminpages/templates/orders-print.php:78
1123
+ #: adminpages/membershiplevels.php:345
1124
+ #: adminpages/membershiplevels.php:805
1125
  msgid "ID"
1126
  msgstr "ID"
1127
 
1136
  #: adminpages/orders.php:415
1137
  #: adminpages/orders.php:421
1138
  #: adminpages/discountcodes.php:447
1139
+ #: adminpages/orders.php:422
1140
  msgid "This will be generated when you save."
1141
  msgstr "Es generarà quan salvis."
1142
 
1168
  #: adminpages/discountcodes.php:786
1169
  #: adminpages/orders.php:1332
1170
  #: adminpages/dashboard.php:292
1171
+ #: adminpages/orders.php:429
1172
+ #: adminpages/orders.php:1333
1173
+ #: adminpages/discountcodes.php:787
1174
+ #: adminpages/orders.php:475
1175
+ #: adminpages/orders.php:1426
1176
  msgid "Code"
1177
  msgstr "Codi"
1178
 
1186
  #: adminpages/discountcodes.php:489
1187
  #: includes/profile.php:501
1188
  #: includes/profile.php:497
1189
+ #: includes/profile.php:537
1190
  msgid "Start Date"
1191
  msgstr "Data d’inici"
1192
 
1223
  #: classes/gateways/class.pmprogateway_stripe.php:1320
1224
  #: classes/gateways/class.pmprogateway_stripe.php:1326
1225
  #: classes/gateways/class.pmprogateway_stripe.php:785
1226
+ #: pages/billing.php:381
1227
+ #: classes/gateways/class.pmprogateway_braintree.php:486
1228
+ #: classes/gateways/class.pmprogateway_stripe.php:893
1229
  msgid "Expiration Date"
1230
  msgstr "Data final (d’expiració)"
1231
 
1240
  #: adminpages/discountcodes.php:787
1241
  #: adminpages/discountcodes.php:525
1242
  #: adminpages/discountcodes.php:789
1243
+ #: adminpages/discountcodes.php:790
1244
  msgid "Uses"
1245
  msgstr "Utilitza"
1246
 
1274
  #: adminpages/discountcodes.php:574
1275
  #: adminpages/membershiplevels.php:401
1276
  #: adminpages/discountcodes.php:576
1277
+ #: adminpages/membershiplevels.php:399
1278
  msgid "Initial Payment"
1279
  msgstr "Pagament inicial"
1280
 
1290
  #: adminpages/discountcodes.php:585
1291
  #: adminpages/membershiplevels.php:412
1292
  #: adminpages/discountcodes.php:587
1293
+ #: adminpages/membershiplevels.php:410
1294
  msgid "The initial amount collected at registration."
1295
  msgstr "El pagament inicial efectuat en el registre"
1296
 
1306
  #: adminpages/discountcodes.php:590
1307
  #: adminpages/membershiplevels.php:417
1308
  #: adminpages/discountcodes.php:592
1309
+ #: adminpages/membershiplevels.php:415
1310
  msgid "Recurring Subscription"
1311
  msgstr "Subscripció recurrent"
1312
 
1322
  #: adminpages/discountcodes.php:591
1323
  #: adminpages/membershiplevels.php:418
1324
  #: adminpages/discountcodes.php:593
1325
+ #: adminpages/membershiplevels.php:416
1326
  msgid "Check if this level has a recurring subscription payment."
1327
  msgstr "Clica si aquest nivell té un pagament de subscripció recurrent"
1328
 
1337
  #: adminpages/discountcodes.php:595
1338
  #: adminpages/membershiplevels.php:422
1339
  #: adminpages/discountcodes.php:597
1340
+ #: adminpages/membershiplevels.php:420
1341
  msgid "Billing Amount"
1342
  msgstr "Total a facturar"
1343
 
1375
  #: classes/gateways/class.pmprogateway_stripe.php:2641
1376
  #: classes/gateways/class.pmprogateway_stripe.php:2637
1377
  #: classes/gateways/class.pmprogateway_stripe.php:2639
1378
+ #: classes/gateways/class.pmprogateway_stripe.php:2635
1379
+ #: adminpages/discountcodes.php:700
1380
+ #: adminpages/membershiplevels.php:435
1381
+ #: adminpages/membershiplevels.php:581
1382
+ #: classes/gateways/class.pmprogateway_stripe.php:3092
1383
  msgid "Day(s)"
1384
  msgstr "Dia(es)"
1385
 
1417
  #: classes/gateways/class.pmprogateway_stripe.php:2643
1418
  #: classes/gateways/class.pmprogateway_stripe.php:2639
1419
  #: classes/gateways/class.pmprogateway_stripe.php:2641
1420
+ #: classes/gateways/class.pmprogateway_stripe.php:2637
1421
+ #: adminpages/discountcodes.php:700
1422
+ #: adminpages/membershiplevels.php:435
1423
+ #: adminpages/membershiplevels.php:581
1424
+ #: classes/gateways/class.pmprogateway_stripe.php:3094
1425
  msgid "Month(s)"
1426
  msgstr "Mes(os)"
1427
 
1459
  #: classes/gateways/class.pmprogateway_stripe.php:2642
1460
  #: classes/gateways/class.pmprogateway_stripe.php:2638
1461
  #: classes/gateways/class.pmprogateway_stripe.php:2640
1462
+ #: classes/gateways/class.pmprogateway_stripe.php:2636
1463
+ #: adminpages/discountcodes.php:700
1464
+ #: adminpages/membershiplevels.php:435
1465
+ #: adminpages/membershiplevels.php:581
1466
+ #: classes/gateways/class.pmprogateway_stripe.php:3093
1467
  msgid "Week(s)"
1468
  msgstr "Setmana(es)"
1469
 
1501
  #: classes/gateways/class.pmprogateway_stripe.php:2644
1502
  #: classes/gateways/class.pmprogateway_stripe.php:2640
1503
  #: classes/gateways/class.pmprogateway_stripe.php:2642
1504
+ #: classes/gateways/class.pmprogateway_stripe.php:2638
1505
+ #: adminpages/discountcodes.php:700
1506
+ #: adminpages/membershiplevels.php:435
1507
+ #: adminpages/membershiplevels.php:581
1508
+ #: classes/gateways/class.pmprogateway_stripe.php:3095
1509
  msgid "Year(s)"
1510
  msgstr "Any(s)"
1511
 
1521
  #: adminpages/discountcodes.php:618
1522
  #: adminpages/membershiplevels.php:446
1523
  #: adminpages/discountcodes.php:620
1524
+ #: adminpages/membershiplevels.php:444
1525
  msgid "The amount to be billed one cycle after the initial payment."
1526
  msgstr "Total a facturar en un cicle després del pagament inicial"
1527
 
1537
  #: adminpages/discountcodes.php:628
1538
  #: adminpages/membershiplevels.php:465
1539
  #: adminpages/discountcodes.php:630
1540
+ #: adminpages/membershiplevels.php:463
1541
  msgid "Billing Cycle Limit"
1542
  msgstr "Límit de cicle de facturació"
1543
 
1553
  #: adminpages/discountcodes.php:632
1554
  #: adminpages/membershiplevels.php:469
1555
  #: adminpages/discountcodes.php:634
1556
+ #: adminpages/membershiplevels.php:467
1557
  msgid "The <strong>total</strong> number of recurring billing cycles for this level, including the trial period (if applicable) but not including the initial payment. Set to zero if membership is indefinite."
1558
  msgstr "El <strong>total</strong> de cicles de pagament recurrent per a aquest nivell, incloent el període de prova (si s’aplica) però sense incloure el pagament inicial. Deixa-ho a zero si la subscripció és infinita."
1559
 
1569
  #: adminpages/discountcodes.php:651
1570
  #: adminpages/membershiplevels.php:488
1571
  #: adminpages/discountcodes.php:653
1572
+ #: adminpages/discountcodes.php:654
1573
+ #: adminpages/membershiplevels.php:487
1574
  msgid "Custom Trial"
1575
  msgstr "Prova personalitzada"
1576
 
1587
  #: adminpages/discountcodes.php:653
1588
  #: adminpages/membershiplevels.php:490
1589
  #: adminpages/discountcodes.php:655
1590
+ #: adminpages/discountcodes.php:656
1591
+ #: adminpages/membershiplevels.php:489
1592
  msgid "Check to add a custom trial period."
1593
  msgstr "Clica per afegir un període de prova personalitzat."
1594
 
1605
  #: adminpages/discountcodes.php:661
1606
  #: adminpages/membershiplevels.php:510
1607
  #: adminpages/discountcodes.php:663
1608
+ #: adminpages/discountcodes.php:664
1609
  msgid "Trial Billing Amount"
1610
  msgstr "Facturació per al període de prova"
1611
 
1622
  #: adminpages/discountcodes.php:672
1623
  #: adminpages/membershiplevels.php:521
1624
  #: adminpages/discountcodes.php:674
1625
+ #: adminpages/discountcodes.php:675
1626
  msgid "for the first"
1627
  msgstr "per al primer"
1628
 
1639
  #: adminpages/discountcodes.php:674
1640
  #: adminpages/membershiplevels.php:523
1641
  #: adminpages/discountcodes.php:676
1642
+ #: adminpages/discountcodes.php:677
1643
  msgid "subscription payments"
1644
  msgstr "pagaments de subscripció"
1645
 
1657
  #: adminpages/discountcodes.php:686
1658
  #: adminpages/membershiplevels.php:559
1659
  #: adminpages/discountcodes.php:688
1660
+ #: adminpages/discountcodes.php:689
1661
  msgid "Membership Expiration"
1662
  msgstr "Venciment de la subscripció"
1663
 
1674
  #: adminpages/discountcodes.php:687
1675
  #: adminpages/membershiplevels.php:560
1676
  #: adminpages/discountcodes.php:689
1677
+ #: adminpages/discountcodes.php:690
1678
  msgid "Check this to set when membership access expires."
1679
  msgstr "Clica per afegir quan expira l’accés del subscriptor"
1680
 
1693
  #: adminpages/membershiplevels.php:575
1694
  #: pages/confirmation.php:140
1695
  #: adminpages/discountcodes.php:693
1696
+ #: adminpages/discountcodes.php:694
1697
+ #: adminpages/membershiplevels.php:576
1698
  msgid "Expires In"
1699
  msgstr "Expira En"
1700
 
1711
  #: adminpages/discountcodes.php:707
1712
  #: adminpages/membershiplevels.php:586
1713
  #: adminpages/discountcodes.php:709
1714
+ #: adminpages/discountcodes.php:710
1715
+ #: adminpages/membershiplevels.php:587
1716
  msgid "Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires."
1717
  msgstr "Indiqueu la durada de l’accés de subcriptors. Recordeu que qualsevol pagament futur (recurrent de subscripció, si escau) es cancel·larà quan la subscripció caduqui."
1718
 
1722
  #: adminpages/discountcodes.php:556
1723
  #: adminpages/discountcodes.php:734
1724
  #: adminpages/discountcodes.php:736
1725
+ #: adminpages/discountcodes.php:737
1726
  msgid "Memberships Discount Codes"
1727
  msgstr "Codis de descompte per a subscripcions"
1728
 
1732
  #: adminpages/discountcodes.php:566
1733
  #: adminpages/discountcodes.php:771
1734
  #: adminpages/discountcodes.php:773
1735
+ #: adminpages/discountcodes.php:768
1736
  msgid "Search Discount Codes"
1737
  msgstr "Cerca codis de descompte"
1738
 
1745
  #: adminpages/reports/login.php:83
1746
  #: adminpages/discountcodes.php:774
1747
  #: adminpages/discountcodes.php:776
1748
+ #: adminpages/discountcodes.php:771
1749
  msgid "Search"
1750
  msgstr "Cerca"
1751
 
1755
  #: adminpages/discountcodes.php:587
1756
  #: adminpages/discountcodes.php:785
1757
  #: adminpages/discountcodes.php:787
1758
+ #: adminpages/discountcodes.php:788
1759
  msgid "Starts"
1760
  msgstr "Comença"
1761
 
1784
  #: adminpages/discountcodes.php:788
1785
  #: includes/profile.php:65
1786
  #: adminpages/dashboard.php:228
1787
+ #: adminpages/reports/login.php:187
1788
+ #: adminpages/discountcodes.php:789
1789
+ #: includes/profile.php:75
1790
  msgid "Expires"
1791
  msgstr "Acaba"
1792
 
1797
  #: adminpages/admin_header.php:253
1798
  #: adminpages/discountcodes.php:788
1799
  #: adminpages/discountcodes.php:790
1800
+ #: adminpages/discountcodes.php:791
1801
  msgid "Levels"
1802
  msgstr "Nivells"
1803
 
1839
  #: adminpages/orders.php:1565
1840
  #: adminpages/orders.php:1564
1841
  #: adminpages/orders.php:1556
1842
+ #: adminpages/orders.php:1557
1843
+ #: adminpages/orders.php:1726
1844
  msgid "edit"
1845
  msgstr "Edita"
1846
 
1899
  #: adminpages/emailsettings.php:70
1900
  #: adminpages/emailsettings.php:61
1901
  #: adminpages/emailsettings.php:88
1902
+ #: adminpages/emailsettings.php:87
1903
  msgid "By default, system generated emails are sent from <em><strong>wordpress@yourdomain.com</strong></em>. You can update this from address using the fields below."
1904
  msgstr "Per defecte, els correus electrònics generats són enviats desde <em><strong>wordpress@yourdomain.com</strong></em>. Pots modificar-ho utilitzant els camps que hi ha a continuació."
1905
 
1911
  #: adminpages/emailsettings.php:78
1912
  #: adminpages/emailsettings.php:69
1913
  #: adminpages/emailsettings.php:94
1914
+ #: adminpages/emailsettings.php:93
1915
  msgid "From Email"
1916
  msgstr "Del Correu Electrònic"
1917
 
1918
  #: adminpages/emailsettings.php:86
1919
  #: adminpages/emailsettings.php:77
1920
  #: adminpages/emailsettings.php:102
1921
+ #: adminpages/emailsettings.php:101
1922
  msgid "From Name"
1923
  msgstr "Del Nom"
1924
 
1925
  #: adminpages/emailsettings.php:94
1926
  #: adminpages/emailsettings.php:110
1927
+ #: adminpages/emailsettings.php:109
1928
  msgid "Only Filter PMPro Emails?"
1929
  msgstr "Filtra només els correus de PMPro?"
1930
 
1931
  #: adminpages/emailsettings.php:98
1932
  #: adminpages/emailsettings.php:114
1933
+ #: adminpages/emailsettings.php:113
1934
  #, php-format
1935
  msgid "If unchecked, all emails from \"WordPress &lt;%s&gt;\" will be filtered to use the above settings."
1936
  msgstr "Si no està clicat, tots els correus de \"WordPress &lt;%s&gt;\" seran filtrats per utilitzar la configuració de dalt."
2099
  #: adminpages/membershiplevels.php:808
2100
  #: adminpages/reports/history.php:184
2101
  #: adminpages/reports/login.php:181
2102
+ #: adminpages/reports/login.php:184
2103
+ #: adminpages/membershiplevels.php:352
2104
+ #: adminpages/membershiplevels.php:806
2105
  msgid "Name"
2106
  msgstr "Nom"
2107
 
2109
  #: adminpages/membershiplevels.php:314
2110
  #: adminpages/membershiplevels.php:316
2111
  #: adminpages/membershiplevels.php:377
2112
+ #: adminpages/membershiplevels.php:375
2113
  msgid "Confirmation Message"
2114
  msgstr "Missatge de confirmació"
2115
 
2123
  #: adminpages/membershiplevels.php:639
2124
  #: adminpages/membershiplevels.php:397
2125
  #: adminpages/membershiplevels.php:809
2126
+ #: adminpages/membershiplevels.php:395
2127
+ #: adminpages/membershiplevels.php:807
2128
  msgid "Billing Details"
2129
  msgstr "Detalls de facturació"
2130
 
2148
  #: classes/gateways/class.pmprogateway_stripe.php:2700
2149
  #: classes/gateways/class.pmprogateway_stripe.php:2696
2150
  #: classes/gateways/class.pmprogateway_stripe.php:2698
2151
+ #: classes/gateways/class.pmprogateway_stripe.php:2694
2152
+ #: adminpages/membershiplevels.php:431
2153
+ #: classes/gateways/class.pmprogateway_stripe.php:3151
2154
  msgid "per"
2155
  msgstr "per"
2156
 
2169
  #: adminpages/discountcodes.php:620
2170
  #: adminpages/membershiplevels.php:448
2171
  #: adminpages/discountcodes.php:622
2172
+ #: adminpages/membershiplevels.php:446
2173
  msgid "Braintree integration currently only supports billing periods of \"Month\" or \"Year\"."
2174
  msgstr "La integració de Braintree actualment només suporta períodes de facturació de “mes” o “any”."
2175
 
2187
  #: adminpages/membershiplevels.php:393
2188
  #: adminpages/membershiplevels.php:396
2189
  #: adminpages/membershiplevels.php:454
2190
+ #: adminpages/membershiplevels.php:452
2191
  msgid "After saving this level, make note of the ID and create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to <em>pmpro_#</em>, where # is the level ID."
2192
  msgstr "Després de salvar aquest nivell, anota’t la ID i crea un \"Plan\" al dashboard de Braintree amb la mateixa configuració i el \"Plan ID\" set to <em>pmpro_#</em>, on # és el level ID."
2193
 
2210
  #: adminpages/membershiplevels.php:454
2211
  #: adminpages/membershiplevels.php:459
2212
  #: classes/gateways/class.pmprogateway_cybersource.php:89
2213
+ #: adminpages/membershiplevels.php:452
2214
+ #: adminpages/membershiplevels.php:457
2215
  msgid "Note"
2216
  msgstr "Nota"
2217
 
2231
  #: adminpages/discountcodes.php:634
2232
  #: adminpages/membershiplevels.php:471
2233
  #: adminpages/discountcodes.php:636
2234
+ #: adminpages/membershiplevels.php:469
2235
  msgid "Stripe integration currently does not support billing limits. You can still set an expiration date below."
2236
  msgstr "La integració d’Stripe no suporta límits de facturació actualment. Pots posar una data de límit de facturació a sota."
2237
 
2243
  #: adminpages/discountcodes.php:655
2244
  #: adminpages/membershiplevels.php:493
2245
  #: adminpages/discountcodes.php:657
2246
+ #: adminpages/discountcodes.php:658
2247
+ #: adminpages/membershiplevels.php:492
2248
  msgid "2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount."
2249
  msgstr "La integració de 2Checkout no suporta proves personalitzades. Pots afegir un període de prova configurant un pagament inicial diferent del total de facturació."
2250
 
2257
  #: adminpages/discountcodes.php:676
2258
  #: adminpages/membershiplevels.php:525
2259
  #: adminpages/discountcodes.php:678
2260
+ #: adminpages/discountcodes.php:679
2261
  msgid "Stripe integration currently does not support trial amounts greater than $0."
2262
  msgstr "La integració d’Stripe no suporta preus de prova majors que $0."
2263
 
2270
  #: adminpages/discountcodes.php:678
2271
  #: adminpages/membershiplevels.php:527
2272
  #: adminpages/discountcodes.php:680
2273
+ #: adminpages/discountcodes.php:681
2274
  msgid "Braintree integration currently does not support trial amounts greater than $0."
2275
  msgstr "La integració de Braintree no suporta preus de prova majors que $0."
2276
 
2283
  #: adminpages/discountcodes.php:680
2284
  #: adminpages/membershiplevels.php:529
2285
  #: adminpages/discountcodes.php:682
2286
+ #: adminpages/discountcodes.php:683
2287
  msgid "Payflow integration currently does not support trial amounts greater than $0."
2288
  msgstr "La integració de Payflow no suporta preus de prova majors que $0."
2289
 
2298
  #: adminpages/dashboard.php:140
2299
  #: adminpages/membershiplevels.php:550
2300
  #: adminpages/advancedsettings.php:343
2301
+ #: adminpages/advancedsettings.php:350
2302
  msgid "Other Settings"
2303
  msgstr "Configuració, altres"
2304
 
2334
  #: adminpages/advancedsettings.php:194
2335
  #: adminpages/membershiplevels.php:624
2336
  #: adminpages/advancedsettings.php:196
2337
+ #: adminpages/advancedsettings.php:203
2338
+ #: adminpages/membershiplevels.php:625
2339
  msgid "Content Settings"
2340
  msgstr "Configuració de continguts"
2341
 
2347
  #: adminpages/membershiplevels.php:497
2348
  #: adminpages/membershiplevels.php:500
2349
  #: adminpages/membershiplevels.php:654
2350
+ #: adminpages/membershiplevels.php:655
2351
  msgid "Categories"
2352
  msgstr "Categories"
2353
 
2354
  #: adminpages/membershiplevels.php:516
2355
  #: adminpages/membershiplevels.php:517
2356
  #: adminpages/membershiplevels.php:674
2357
+ #: adminpages/membershiplevels.php:675
2358
  msgid "Save Level"
2359
  msgstr "Salva nivell"
2360
 
2389
  #: includes/profile.php:918
2390
  #: adminpages/orders.php:960
2391
  #: pages/billing.php:436
2392
+ #: adminpages/discountcodes.php:729
2393
+ #: adminpages/orders.php:961
2394
+ #: pages/billing.php:443
2395
+ #: adminpages/discountcodes.php:730
2396
+ #: adminpages/membershiplevels.php:676
2397
+ #: adminpages/orders.php:1044
2398
+ #: includes/profile.php:834
2399
+ #: includes/profile.php:958
2400
  msgid "Cancel"
2401
  msgstr "Cancel·la"
2402
 
2437
  #: adminpages/membershiplevels.php:579
2438
  #: adminpages/membershiplevels.php:631
2439
  #: adminpages/membershiplevels.php:797
2440
+ #: adminpages/membershiplevels.php:795
2441
  msgid "Drag and drop membership levels to reorder them on the Levels page."
2442
  msgstr "Arrossega i deixa anar els nivells de subscripció per a reordenar-los a la pàgina de nivells"
2443
 
2462
  #: pages/confirmation.php:99
2463
  #: pages/invoice.php:89
2464
  #: shortcodes/pmpro_account.php:44
2465
+ #: pages/billing.php:102
2466
+ #: adminpages/membershiplevels.php:808
2467
+ #: adminpages/orders.php:838
2468
  msgid "Expiration"
2469
  msgstr "Data final (d’expiració)"
2470
 
2477
  #: adminpages/membershiplevels.php:587
2478
  #: adminpages/membershiplevels.php:641
2479
  #: adminpages/membershiplevels.php:811
2480
+ #: adminpages/membershiplevels.php:809
2481
  msgid "Allow Signups"
2482
  msgstr "Permet nous “signups”"
2483
 
2491
  #: adminpages/membershiplevels.php:656
2492
  #: adminpages/membershiplevels.php:840
2493
  #: adminpages/membershiplevels.php:921
2494
+ #: adminpages/membershiplevels.php:919
2495
  msgid "FREE"
2496
  msgstr "GRATUÏT"
2497
 
2505
  #: adminpages/membershiplevels.php:665
2506
  #: adminpages/membershiplevels.php:849
2507
  #: adminpages/membershiplevels.php:930
2508
+ #: adminpages/membershiplevels.php:928
2509
  msgid "After"
2510
  msgstr "Després"
2511
 
2551
  #: includes/adminpages.php:149
2552
  #: includes/adminpages.php:153
2553
  #: adminpages/memberslist.php:20
2554
+ #: adminpages/memberslist.php:21
2555
  msgid "Members List"
2556
  msgstr "Llistat de subscriptors"
2557
 
2564
  #: adminpages/orders.php:994
2565
  #: adminpages/orders.php:1000
2566
  #: adminpages/orders.php:992
2567
+ #: adminpages/orders.php:993
2568
+ #: adminpages/memberslist.php:22
2569
+ #: adminpages/orders.php:1076
2570
  msgid "Export to CSV"
2571
  msgstr "Exporta a CSV"
2572
 
2594
  #: adminpages/orders.php:1012
2595
  #: adminpages/reports/sales.php:311
2596
  #: classes/class-pmpro-members-list-table.php:651
2597
+ #: adminpages/orders.php:1013
2598
+ #: classes/class-pmpro-members-list-table.php:657
2599
+ #: adminpages/orders.php:1101
2600
+ #: adminpages/reports/memberships.php:330
2601
  msgid "Show"
2602
  msgstr "Mostra"
2603
 
2624
  #: classes/class.pmproemail.php:195
2625
  #: classes/class.pmproemail.php:235
2626
  #: classes/class-pmpro-members-list-table.php:653
2627
+ #: adminpages/reports/login.php:106
2628
+ #: classes/class-pmpro-members-list-table.php:659
2629
+ #: adminpages/reports/login.php:112
2630
+ #: adminpages/reports/memberships.php:354
2631
  msgid "All Levels"
2632
  msgstr "Tots els nivells"
2633
 
2637
  #: classes/class-pmpro-members-list-table.php:234
2638
  #: classes/class-pmpro-members-list-table.php:634
2639
  #: classes/class-pmpro-members-list-table.php:663
2640
+ #: classes/class-pmpro-members-list-table.php:669
2641
  msgid "Cancelled Members"
2642
  msgstr "Subscriptors cancel·lats"
2643
 
2647
  #: classes/class-pmpro-members-list-table.php:235
2648
  #: classes/class-pmpro-members-list-table.php:635
2649
  #: classes/class-pmpro-members-list-table.php:664
2650
+ #: classes/class-pmpro-members-list-table.php:670
2651
  msgid "Expired Members"
2652
  msgstr "Subscriptors “expirats”"
2653
 
2658
  #: classes/class-pmpro-members-list-table.php:236
2659
  #: classes/class-pmpro-members-list-table.php:636
2660
  #: classes/class-pmpro-members-list-table.php:665
2661
+ #: classes/class-pmpro-members-list-table.php:671
2662
  msgid "Old Members"
2663
  msgstr "Subscriptors antics"
2664
 
2670
  #: adminpages/memberslist.php:28
2671
  #: adminpages/reports/history.php:115
2672
  #: adminpages/reports/history.php:119
2673
+ #: adminpages/reports/login.php:127
2674
+ #: adminpages/memberslist.php:27
2675
+ #: adminpages/reports/login.php:106
2676
  msgid "Search Members"
2677
  msgstr "Cerca Subscriptors"
2678
 
2710
  #: adminpages/dashboard.php:223
2711
  #: adminpages/dashboard.php:225
2712
  #: classes/class.memberorder.php:1003
2713
+ #: adminpages/reports/login.php:183
2714
+ #: adminpages/emailtemplates.php:122
2715
+ #: classes/class.memberorder.php:1012
2716
  msgid "Username"
2717
  msgstr "Nom d’usuari"
2718
 
2755
  #: pages/checkout.php:230
2756
  #: pages/confirmation.php:78
2757
  #: pages/invoice.php:68
2758
+ #: pages/billing.php:162
2759
+ #: adminpages/orders.php:568
2760
  msgid "Billing Address"
2761
  msgstr "Adreça de Facturació"
2762
 
2792
  #: adminpages/reports/login.php:183
2793
  #: adminpages/dashboard.php:225
2794
  #: adminpages/dashboard.php:227
2795
+ #: adminpages/reports/login.php:186
2796
  msgid "Joined"
2797
  msgstr "Afegit"
2798
 
2816
  #: adminpages/dashboard.php:232
2817
  #: classes/class-pmpro-members-list-table.php:225
2818
  #: adminpages/dashboard.php:234
2819
+ #: adminpages/reports/login.php:266
2820
  msgid "No members found."
2821
  msgstr "No s’han trobat subscriptors"
2822
 
2831
  #: adminpages/reports/login.php:263
2832
  #: classes/class-pmpro-members-list-table.php:228
2833
  #: classes/class-pmpro-members-list-table.php:227
2834
+ #: adminpages/reports/login.php:266
2835
  msgid "Search all levels"
2836
  msgstr "Cerca a tots els nivells"
2837
 
2858
  #: adminpages/orders.php:72
2859
  #: adminpages/orders.php:164
2860
  #: adminpages/orders.php:170
2861
+ #: adminpages/orders.php:171
2862
  msgid "Error deleting order."
2863
  msgstr "Error esborrant comanda."
2864
 
2867
  #: adminpages/orders.php:169
2868
  #: adminpages/orders.php:309
2869
  #: adminpages/orders.php:315
2870
+ #: adminpages/orders.php:316
2871
+ #: adminpages/orders.php:342
2872
  msgid "Order saved successfully."
2873
  msgstr "Comanda salvada correctament."
2874
 
2883
  #: adminpages/orders.php:180
2884
  #: adminpages/orders.php:312
2885
  #: adminpages/orders.php:318
2886
+ #: adminpages/orders.php:319
2887
+ #: adminpages/orders.php:345
2888
  msgid "Error saving order."
2889
  msgstr "Error guardant la comanda."
2890
 
2897
  #: classes/class.memberorder.php:963
2898
  #: adminpages/orders.php:389
2899
  #: classes/class.memberorder.php:1005
2900
+ #: adminpages/orders.php:390
2901
+ #: classes/class.memberorder.php:1014
2902
  msgid "Order"
2903
  msgstr "Comanda"
2904
 
2908
  #: adminpages/orders.php:348
2909
  #: adminpages/orders.php:387
2910
  #: adminpages/orders.php:393
2911
+ #: adminpages/orders.p