Paid Memberships Pro - Version 1.6.0.1

Version Description

  • Fixed Braintree integration for production environments. Braintree needed to be told "production" instead of "live".
  • Removed !!field!! lines from a couple of admin emails.
  • Added login_link as data for the cancel_admin email template.
Download this release

Release Info

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

Code changes from version 1.7.14 to 1.6.0.1

Files changed (194) hide show
  1. adminpages/addons.php +0 -142
  2. adminpages/addons/hide-admin-bar-from-non-admins.php +0 -32
  3. adminpages/addons/images/pmpro-aweber.gif +0 -0
  4. adminpages/addons/images/pmpro-bbpress.jpg +0 -0
  5. adminpages/addons/images/pmpro-constant-contact.gif +0 -0
  6. adminpages/addons/images/pmpro-email-templates.gif +0 -0
  7. adminpages/addons/images/pmpro-infusionsoft.jpg +0 -0
  8. adminpages/addons/images/pmpro-mailchimp.jpg +0 -0
  9. adminpages/addons/images/pmpro-network.gif +0 -0
  10. adminpages/addons/images/pmpro-post-affiliate-pro.jpg +0 -0
  11. adminpages/addons/images/pmpro-register-helper.gif +0 -0
  12. adminpages/addons/images/pmpro-series.gif +0 -0
  13. adminpages/addons/images/pmpro-woocommerce.gif +0 -0
  14. adminpages/addons/images/pmpro-wp-affiliate-platform.jpg +0 -0
  15. adminpages/addons/images/wp-bouncer.gif +0 -0
  16. adminpages/addons/pmpro-addon-packages.php +0 -30
  17. adminpages/addons/pmpro-affiliates.php +0 -30
  18. adminpages/addons/pmpro-aweber.php +0 -31
  19. adminpages/addons/pmpro-bbpress.php +0 -31
  20. adminpages/addons/pmpro-constant-contact.php +0 -31
  21. adminpages/addons/pmpro-disable-emails.php +0 -28
  22. adminpages/addons/pmpro-email-templates.php +0 -31
  23. adminpages/addons/pmpro-expiration.php +0 -30
  24. adminpages/addons/pmpro-freeaddress.php +0 -30
  25. adminpages/addons/pmpro-infusionsoft.php +0 -31
  26. adminpages/addons/pmpro-international-addresses.php +0 -31
  27. adminpages/addons/pmpro-level-cost-text.php +0 -30
  28. adminpages/addons/pmpro-mailchimp.php +0 -31
  29. adminpages/addons/pmpro-network-subsite.php +0 -31
  30. adminpages/addons/pmpro-network.php +0 -31
  31. adminpages/addons/pmpro-post-affiliate-pro.php +0 -31
  32. adminpages/addons/pmpro-register-helper.php +0 -31
  33. adminpages/addons/pmpro-require-code-to-register.php +0 -28
  34. adminpages/addons/pmpro-series.php +0 -31
  35. adminpages/addons/pmpro-shipping.php +0 -31
  36. adminpages/addons/pmpro-user-pages.php +0 -30
  37. adminpages/addons/pmpro-woocommerce.php +0 -31
  38. adminpages/addons/pmpro-wp-affiliate.php +0 -31
  39. adminpages/addons/tml.php +0 -32
  40. adminpages/addons/wp-bouncer.php +0 -31
  41. adminpages/admin_footer.php +0 -1
  42. adminpages/admin_header.php +22 -71
  43. adminpages/advancedsettings.php +39 -123
  44. adminpages/dashboard.php +2 -2
  45. adminpages/discountcodes.php +648 -636
  46. adminpages/emailsettings.php +152 -181
  47. adminpages/functions.php +0 -222
  48. adminpages/membershiplevels.php +574 -588
  49. adminpages/memberslist-csv.php +37 -114
  50. adminpages/memberslist.php +205 -238
  51. adminpages/orders-csv.php +24 -136
  52. adminpages/orders.php +89 -389
  53. adminpages/pagesettings.php +28 -70
  54. adminpages/paymentsettings.php +484 -538
  55. adminpages/reports.php +0 -62
  56. adminpages/reports/login.php +0 -412
  57. adminpages/reports/memberships.php +0 -651
  58. adminpages/reports/sales.php +0 -397
  59. classes/class.memberorder.php +46 -112
  60. classes/class.pmproemail.php +57 -183
  61. classes/gateways/class.pmprogateway.php +7 -26
  62. classes/gateways/class.pmprogateway_authorizenet.php +13 -14
  63. classes/gateways/class.pmprogateway_braintree.php +23 -21
  64. classes/gateways/class.pmprogateway_check.php +10 -12
  65. classes/gateways/class.pmprogateway_cybersource.php +0 -765
  66. classes/gateways/class.pmprogateway_payflowpro.php +29 -183
  67. classes/gateways/class.pmprogateway_paypal.php +17 -20
  68. classes/gateways/class.pmprogateway_paypalexpress.php +25 -72
  69. classes/gateways/class.pmprogateway_paypalstandard.php +17 -35
  70. classes/gateways/class.pmprogateway_stripe.php +40 -91
  71. classes/gateways/class.pmprogateway_twocheckout.php +0 -145
  72. css/admin-rtl.css +0 -63
  73. css/admin.css +61 -97
  74. css/frontend-rtl.css +0 -111
  75. css/frontend.css +118 -173
  76. email/admin_change.html +1 -1
  77. email/billing.html +4 -1
  78. email/billing_failure.html +5 -1
  79. email/billing_failure_admin.html +5 -1
  80. email/cancel.html +1 -1
  81. email/cancel_admin.html +1 -1
  82. email/checkout_check.html +1 -1
  83. email/checkout_express.html +2 -2
  84. email/checkout_express_admin.html +2 -2
  85. email/checkout_freetrial.html +4 -1
  86. email/checkout_freetrial_admin.html +4 -1
  87. email/checkout_paid.html +4 -1
  88. email/checkout_paid_admin.html +4 -1
  89. email/checkout_trial.html +4 -1
  90. email/checkout_trial_admin.html +4 -1
  91. email/credit_card_expiring.html +0 -13
  92. email/invoice.html +6 -2
  93. images/Paid-Memberships-Pro.png +0 -0
  94. images/Paid-Memberships-Pro_watermark.png +0 -0
  95. images/icon-pmproadmin16-sprite.png +0 -0
  96. images/icon-pmproadmin16-sprite_2x.png +0 -0
  97. images/icon-pmproadmin32.png +0 -0
  98. images/icon-pmproadmin32_2x.png +0 -0
  99. includes/adminpages.php +0 -226
  100. includes/cleanup.php +0 -40
  101. includes/content.php +0 -405
  102. includes/currencies.php +3 -12
  103. includes/email.php +0 -111
  104. includes/filters.php +3 -41
  105. includes/functions.php +1505 -1742
  106. includes/https.php +0 -185
  107. includes/init.php +0 -240
  108. includes/lib/CyberSource/cyber_source_soap_client.php +0 -87
  109. includes/lib/Stripe/Stripe.php +0 -10
  110. includes/lib/Stripe/Stripe/Account.php +6 -5
  111. includes/lib/Stripe/Stripe/ApiRequestor.php +51 -153
  112. includes/lib/Stripe/Stripe/ApiResource.php +17 -51
  113. includes/lib/Stripe/Stripe/ApplicationFee.php +0 -53
  114. includes/lib/Stripe/Stripe/AttachedObject.php +0 -23
  115. includes/lib/Stripe/Stripe/Balance.php +0 -15
  116. includes/lib/Stripe/Stripe/BalanceTransaction.php +0 -39
  117. includes/lib/Stripe/Stripe/Card.php +0 -54
  118. includes/lib/Stripe/Stripe/CardError.php +2 -4
  119. includes/lib/Stripe/Stripe/Charge.php +7 -55
  120. includes/lib/Stripe/Stripe/Coupon.php +7 -24
  121. includes/lib/Stripe/Stripe/Customer.php +6 -61
  122. includes/lib/Stripe/Stripe/Error.php +7 -9
  123. includes/lib/Stripe/Stripe/Event.php +6 -12
  124. includes/lib/Stripe/Stripe/InvalidRequestError.php +2 -4
  125. includes/lib/Stripe/Stripe/Invoice.php +6 -30
  126. includes/lib/Stripe/Stripe/InvoiceItem.php +6 -24
  127. includes/lib/Stripe/Stripe/List.php +5 -25
  128. includes/lib/Stripe/Stripe/Object.php +12 -123
  129. includes/lib/Stripe/Stripe/Plan.php +6 -26
  130. includes/lib/Stripe/Stripe/Recipient.php +0 -75
  131. includes/lib/Stripe/Stripe/SingletonApiResource.php +0 -7
  132. includes/lib/Stripe/Stripe/Stripe.php +3 -49
  133. includes/lib/Stripe/Stripe/Subscription.php +0 -58
  134. includes/lib/Stripe/Stripe/Token.php +6 -12
  135. includes/lib/Stripe/Stripe/Transfer.php +6 -34
  136. includes/lib/Stripe/Stripe/Util.php +14 -42
  137. includes/lib/Twocheckout/Twocheckout.php +0 -31
  138. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutAccount.php +0 -25
  139. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutApi.php +0 -33
  140. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutCoupon.php +0 -42
  141. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutError.php +0 -14
  142. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutOption.php +0 -42
  143. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutPayment.php +0 -24
  144. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutProduct.php +0 -42
  145. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutSale.php +0 -104
  146. includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutUtil.php +0 -72
  147. includes/lib/Twocheckout/Twocheckout/TwocheckoutCharge.php +0 -61
  148. includes/lib/Twocheckout/Twocheckout/TwocheckoutMessage.php +0 -13
  149. includes/lib/Twocheckout/Twocheckout/TwocheckoutNotification.php +0 -20
  150. includes/lib/Twocheckout/Twocheckout/TwocheckoutReturn.php +0 -21
  151. includes/localization.php +0 -30
  152. includes/login.php +0 -158
  153. includes/metaboxes.php +0 -108
  154. includes/notifications.php +0 -61
  155. includes/profile.php +0 -224
  156. includes/recaptcha.php +0 -22
  157. includes/reports.php +0 -27
  158. includes/services.php +0 -70
  159. includes/setup.sql +33 -43
  160. includes/upgradecheck.php +113 -214
  161. includes/xmlrpc.php +0 -80
  162. languages/email/da_DK/admin_change.html +0 -7
  163. languages/email/da_DK/admin_change_admin.html +0 -5
  164. languages/email/da_DK/billing.html +0 -16
  165. languages/email/da_DK/billing_admin.html +0 -17
  166. languages/email/da_DK/billing_failure.html +0 -11
  167. languages/email/da_DK/billing_failure_admin.html +0 -11
  168. languages/email/da_DK/cancel.html +0 -3
  169. languages/email/da_DK/cancel_admin.html +0 -8
  170. languages/email/da_DK/checkout_check.html +0 -17
  171. languages/email/da_DK/checkout_check_admin.html +0 -17
  172. languages/email/da_DK/checkout_express.html +0 -14
  173. languages/email/da_DK/checkout_express_admin.html +0 -14
  174. languages/email/da_DK/checkout_free.html +0 -8
  175. languages/email/da_DK/checkout_free_admin.html +0 -8
  176. languages/email/da_DK/checkout_freetrial.html +0 -19
  177. languages/email/da_DK/checkout_freetrial_admin.html +0 -19
  178. languages/email/da_DK/checkout_paid.html +0 -23
  179. languages/email/da_DK/checkout_paid_admin.html +0 -23
  180. languages/email/da_DK/checkout_trial.html +0 -23
  181. languages/email/da_DK/checkout_trial_admin.html +0 -23
  182. languages/email/da_DK/credit_card_expiring.html +0 -13
  183. languages/email/da_DK/default.html +0 -1
  184. languages/email/da_DK/footer.html +0 -4
  185. languages/email/da_DK/header.html +0 -1
  186. languages/email/da_DK/invoice.html +0 -19
  187. languages/email/da_DK/membership_expired.html +0 -7
  188. languages/email/da_DK/membership_expiring.html +0 -6
  189. languages/email/da_DK/trial_ending.html +0 -8
  190. languages/gettext.sh +0 -23
  191. languages/pmpro-cs_CZ.mo +0 -0
  192. languages/pmpro-cs_CZ.po +0 -2889
  193. languages/pmpro-da_DK.mo +0 -0
  194. languages/pmpro-da_DK.po +0 -2424
adminpages/addons.php DELETED
@@ -1,142 +0,0 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_addons")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $msg, $msgt, $pmpro_addons;
9
-
10
- /*
11
- Addon lists
12
- */
13
- $pmpro_addon_lists = array(
14
- 'repo' => array('Plugins in the WordPress Repository', 'These official PMPro plugins are available in the WordPress repository and can be installed through Plugins --> Add New.'),
15
- 'thirdparty' => array('Third-party Integration', 'These official PMPro plugins integrate with specific third-party tools and software.'),
16
- 'recommended' => array('Recommended Plugins', 'These plugins are not developed by the PMPro team, but are recommended for sites running PMPro.'),
17
- 'github' => array('Plugins on GitHub', 'These official PMPro plugins must be downloaded from GitHub and installed through Plugins --> Add New --> Upload, then activated. These plugins cannot be automatically updated and may require more developer input.'),
18
- 'gists' => array('Code Gists', 'These are bits of code that generally must be added to your active theme\'s functions.php file or included in a custom plugin. Most gists require customization and are recommended for developers only.')
19
- );
20
-
21
- /*
22
- Function to add an addon
23
- */
24
- function pmpro_add_addon($list, $addon)
25
- {
26
- global $pmpro_addons;
27
-
28
- //make sure we have the base array
29
- if(empty($pmpro_addons))
30
- $pmpro_addons = array();
31
-
32
- //make sure we have an array for the list
33
- if(empty($pmpro_addons[$list]))
34
- $pmpro_addons[$list] = array();
35
-
36
- //add addon to list
37
- $pmpro_addons[$list][] = $addon;
38
- }
39
-
40
- /*
41
- Load All Addons
42
- */
43
- $pmpro_addons_dir = dirname(__FILE__) . "/../adminpages/addons/";
44
- $cwd = getcwd();
45
- chdir($pmpro_addons_dir);
46
- $count = 0;
47
- foreach (glob("*.php") as $filename)
48
- {
49
- $count++;
50
- require_once($filename);
51
- }
52
- chdir($cwd);
53
-
54
- require_once(dirname(__FILE__) . "/admin_header.php");
55
- ?>
56
-
57
- <h2>Add Ons</h2>
58
- <ul id="addon-filters" class="subsubsub">
59
- <li id="addon-filters-all"><a href="javascript:void(0);" class="current all tab">All</a> <span>(<?php echo $count;?>)</span></li>
60
- <?php foreach($pmpro_addon_lists as $list => $list_info) { ?>
61
- <li id="addon-filters-<?php echo $list;?>"> | <a href="javascript:void(0);>" class="tab"><?php echo $list_info[0];?></a> <span>(<?php echo count($pmpro_addons[$list]);?>)</span></li>
62
- <?php } ?>
63
- </ul>
64
-
65
- <?php foreach($pmpro_addon_lists as $list => $list_info) { ?>
66
- <div id="pmpro-<?php echo $list;?>" class="pmpro-addon-list widgets-holder-wrap">
67
-
68
- <h3 class="section-title"><?php echo $list_info[0];?></h3>
69
- <p class="description"><?php echo $list_info[1];?></p>
70
- <br class="clear" />
71
-
72
- <div id="addons-list-<?php echo $list;?>" class="addon-list">
73
-
74
- <?php foreach($pmpro_addons[$list] as $slug => $addon) { ?>
75
- <div id="addon-<?php echo $slug;?>" class="widget <?php if($addon['enabled']) echo "enabled"; else echo "disabled";?>">
76
- <div class="widget-top">
77
- <div class="widget-title">
78
- <h4>
79
- <span class="status-label"><?php if($addon['enabled']) echo __("Enabled", "pmpro"); else echo __("Disabled", "pmpro");?></span>
80
- <span class="title"><?php echo $addon['title'];?></span>
81
- <span class="version pmpro_tag-grey"><?php echo $addon['version'];?></span>
82
- <span class="in-widget-title"></span>
83
- </h4>
84
- </div> <!-- end widget-title -->
85
- </div> <!-- end widget-top -->
86
- <div class="widget-inside">
87
- <?php call_user_func($addon['widget'], $addon);?>
88
- </div> <!-- end addon-inside -->
89
- </div> <!-- end widget -->
90
- <?php } ?>
91
-
92
- <br class="clear" />
93
- </div> <!-- end addon-list -->
94
-
95
- </div> <!-- end pmpro-<?php echo $list;?> -->
96
- <?php } ?>
97
-
98
- <script>
99
- //tabs
100
- jQuery(document).ready(function() {
101
- jQuery('#addon-filters a.tab').click(function() {
102
- //which tab?
103
- var tab = jQuery(this).parent().attr('id').replace('addon-filters-', '');
104
-
105
- //un select tabs
106
- jQuery('#addon-filters a.tab').removeClass('current');
107
-
108
- //select this tab
109
- jQuery('#addon-filters-'+tab+' a').addClass('current');
110
-
111
- //show all?
112
- if(tab == 'all')
113
- jQuery('div.pmpro-addon-list').show();
114
- else
115
- {
116
- //hide all
117
- jQuery('div.pmpro-addon-list').hide();
118
-
119
- //show this one
120
- jQuery('#pmpro-'+tab).show();
121
- }
122
- });
123
- });
124
-
125
- //resize addon boxes
126
- jQuery(document).ready(function() {
127
- jQuery('.addon-list').each(function() {
128
- //what's the tallest p in the list?
129
- var tallest = 32;
130
- jQuery(this).find('div.info p').each(function() {
131
- tallest = Math.max(tallest, jQuery(this).height());
132
- });
133
-
134
- //set all p's to match
135
- jQuery(this).find('div.info p').css('height', tallest);
136
- });
137
- });
138
- </script>
139
-
140
- <?php
141
- require_once(dirname(__FILE__) . "/admin_footer.php");
142
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/hide-admin-bar-from-non-admins.php DELETED
@@ -1,32 +0,0 @@
1
- <?php
2
- /*
3
- Addon: Hide Admin Bar From Non-Admins
4
- Slug: hide-admin-bar-from-non-admins
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'Hide Admin Bar From Non-Admins',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_hide_admin_bar_from_non_admins_widget',
10
- 'enabled' => function_exists('habfna_disable_admin_bar')
11
- )
12
- );
13
-
14
- function pmpro_addon_hide_admin_bar_from_non_admins_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Perfect for sites where there is only one admin who needs access to the dashboard and the admin bar. When activated only administrators will see the admin bar.</p>
19
- <div class="actions">
20
- <form method="post" name="component-actions" action="">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../hide-admin-bar-from-non-admins/hide-admin-bar-from-non-admins.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=hide-admin-bar-from-non-admins/hide-admin-bar-from-non-admins.php'), 'activate-plugin_hide-admin-bar-from-non-admins/hide-admin-bar-from-non-admins.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=hide-admin-bar-from-non-admins'), 'install-plugin_hide-admin-bar-from-non-admins'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </form>
29
- </div>
30
- </div> <!-- end info -->
31
- <?php
32
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/images/pmpro-aweber.gif DELETED
Binary file
adminpages/addons/images/pmpro-bbpress.jpg DELETED
Binary file
adminpages/addons/images/pmpro-constant-contact.gif DELETED
Binary file
adminpages/addons/images/pmpro-email-templates.gif DELETED
Binary file
adminpages/addons/images/pmpro-infusionsoft.jpg DELETED
Binary file
adminpages/addons/images/pmpro-mailchimp.jpg DELETED
Binary file
adminpages/addons/images/pmpro-network.gif DELETED
Binary file
adminpages/addons/images/pmpro-post-affiliate-pro.jpg DELETED
Binary file
adminpages/addons/images/pmpro-register-helper.gif DELETED
Binary file
adminpages/addons/images/pmpro-series.gif DELETED
Binary file
adminpages/addons/images/pmpro-woocommerce.gif DELETED
Binary file
adminpages/addons/images/pmpro-wp-affiliate-platform.jpg DELETED
Binary file
adminpages/addons/images/wp-bouncer.gif DELETED
Binary file
adminpages/addons/pmpro-addon-packages.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Addon Packages
4
- Slug: pmpro-addon-packages
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Addon Packages',
8
- 'version' => '.4.3',
9
- 'widget' => 'pmpro_addon_pmpro_addon_packages_widget',
10
- 'enabled' => function_exists('pmproap_post_meta')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_addon_packages_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Sell access to individual pages or posts for a flat fee. This is a workaround if you would like to allow multiple membership levels per user.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-addon-packages/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-addon-packages/pmpro-addon-packages.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-addon-packages/pmpro-addon-packages.php'), 'activate-plugin_pmpro-addon-packages/pmpro-addon-packages.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="https://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-addon-packages.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-affiliates.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Affiliates
4
- Slug: pmpro-affiliates
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Affiliates',
8
- 'version' => '.2.4',
9
- 'widget' => 'pmpro_addon_pmpro_affiliates_widget',
10
- 'enabled' => function_exists('pmpro_affiliates_dependencies')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_affiliates_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Lightweight Affiliate system. Create affiliate accounts and codes; tracks checkouts by affiliate account.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-affiliates/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-affiliates/pmpro-affiliates.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-affiliates/pmpro-affiliates.php'), 'activate-plugin_pmpro-affiliates/pmpro-affiliates.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-affiliates.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-aweber.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro AWeber Integration
4
- Slug: pmpro-aweber
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro AWeber Integration',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_pmpro_aweber_widget',
10
- 'enabled' => function_exists('pmproaw_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_aweber_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-aweber.gif" />
18
- <div class="info">
19
- <p>Integrate User Registrations with AWeber. Adds members to lists based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-aweber/pmpro-aweber.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-aweber/pmpro-aweber.php'), 'activate-plugin_pmpro-aweber/pmpro-aweber.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-aweber'), 'install-plugin_pmpro-aweber'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-bbpress.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro bbPress
4
- Slug: pmpro-bbpress
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'PMPro bbPress',
8
- 'version' => '1.0.1',
9
- 'widget' => 'pmpro_addon_pmpro_bbpress_widget',
10
- 'enabled' => function_exists('pmprobbp_add_meta_box')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_bbpress_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-bbpress.jpg" />
18
- <div class="info">
19
- <p>Locking down bbPress Forums by Membership Level and Forum ID.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-bbpress/pmpro-bbpress.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-bbpress/pmpro-bbpress.php'), 'activate-plugin_pmpro-bbpress/pmpro-bbpress.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-bbpress'), 'install-plugin_pmpro-bbpress'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-constant-contact.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Constant Contact Integration
4
- Slug: pmpro-constant-contact
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro Constant Contact Integration',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_pmpro_constant_contact_widget',
10
- 'enabled' => function_exists('pmprocc_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_constant_contact_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-constant-contact.gif" />
18
- <div class="info">
19
- <p>Integrate User Registrations with Constant Contact . Adds members to lists based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-constant-contact/pmpro-constant-contact.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-constant-contact/pmpro-constant-contact.php'), 'activate-plugin_pmpro-constant-contact/pmpro-constant-contact.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-constant-contact'), 'install-plugin_pmpro-constant-contact'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-disable-emails.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Disable PMPro Emails
4
- Slug: pmpro-disable-emails
5
- */
6
- pmpro_add_addon('gists', array(
7
- 'title' => 'PMPro Disable Emails',
8
- 'version' => '.1',
9
- 'widget' => 'pmpro_addon_pmpro_disable_emails_widget',
10
- 'enabled' => function_exists('dae_pmpro_email_recipient')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_disable_emails_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Disable all or specific emails sent by the PMPro plugin.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a target="_blank" href="https://gist.github.com/strangerstudios/3667545" class="button">Enabled</a>
22
- <?php } else { ?>
23
- <a target="_blank" href="https://gist.github.com/strangerstudios/3667545" class="button button-primary">View Gist</a>
24
- <?php } ?>
25
- </div>
26
- </div> <!-- end info -->
27
- <?php
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-email-templates.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Email Templates Editor
4
- Slug: pmpro-email-templates-addon
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'PMPro Email Templates',
8
- 'version' => '.5.2',
9
- 'widget' => 'pmpro_addon_email_templates_widget',
10
- 'enabled' => function_exists('pmproet_scripts')
11
- )
12
- );
13
-
14
- function pmpro_addon_email_templates_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-email-templates.gif" />
18
- <div class="info">
19
- <p>Easily edit system-generated Email Templates from the WordPress admin.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="http://wordpress.org/plugins/pmpro-email-templates-addon/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-email-templates-addon/pmpro-email-templates.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-email-templates-addon/pmpro-email-templates.php'), 'activate-plugin_pmpro-email-templates-addon/pmpro-email-templates.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-email-templates-addon'), 'install-plugin_pmpro-email-templates-addon'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-expiration.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Expiration Date
4
- Slug: pmpro-expiration
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Set Expiration Dates',
8
- 'version' => '.1.1',
9
- 'widget' => 'pmpro_addon_pmpro_expiration_widget',
10
- 'enabled' => function_exists('pmprosed_pmpro_checkout_level')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_expiration_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Set a specific expiration date (e.g. 2013-12-31) for a PMPro membership level or discount code.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-set-expiration-dates/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-set-expiration-dates/pmpro-set-expiration-dates.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-set-expiration-dates/pmpro-set-expiration-dates.php'), 'activate-plugin_pmpro-set-expiration-dates/pmpro-set-expiration-dates.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-set-expiration-dates.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-freeaddress.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Require Name and Address for Free Level
4
- Slug: pmpro-freerequire
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Require Name/Address for Free Level',
8
- 'version' => '.2',
9
- 'widget' => 'pmpro_addon_pmpro_freerequire_widget',
10
- 'enabled' => function_exists('my_pmpro_checkout_boxes_require_address')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_freerequire_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Require name/address for free Membership Level checkout.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-address-for-free-levels" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-address-for-free-levels/pmpro-address-for-free-levels.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-address-for-free-levels/pmpro-address-for-free-levels.php'), 'activate-plugin_pmpro-address-for-free-levels/pmpro-address-for-free-levels.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-address-for-free-levels.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-infusionsoft.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Infusionsoft Integration
4
- Slug: pmpro-infusionsoft
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro Infusionsoft Integration',
8
- 'version' => '1.2',
9
- 'widget' => 'pmpro_addon_pmpro_infusionsoft_widget',
10
- 'enabled' => function_exists('pmprois_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_infusionsoft_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-infusionsoft.jpg" />
18
- <div class="info">
19
- <p>Integrate with Infusionsoft. Add members to email lists (groups, tags) based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-infusionsoft/pmpro-infusionsoft.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-infusionsoft/pmpro-infusionsoft.php'), 'activate-plugin_pmpro-infusionsoft/pmpro-infusionsoft.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-infusionsoft'), 'install-plugin_pmpro-infusionsoft'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-international-addresses.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro International Addresses
4
- Slug: pmpro-international-addresses
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro International Addresses',
8
- 'version' => '.2.2',
9
- 'widget' => 'pmpro_addon_pmpro_international_addresses_widget',
10
- 'enabled' => function_exists('pmproia_pmpro_international_addresses')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_international_addresses_widget($addon)
15
- {
16
- ?>
17
- <?php /* <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-international-addresses.jpg" /> */ ?>
18
- <div class="info">
19
- <p>Adds long form addresses to the PMPro checkout.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-international-addresses/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-international-addresses/pmpro-international-addresses.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-international-addresses/pmpro-international-addresses.php'), 'activate-plugin_pmpro-international-addresses/pmpro-international-addresses.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-international-addresses.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-level-cost-text.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Custom Level Cost Text
4
- Slug: pmpro-level-cost-text
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Level Cost Text',
8
- 'version' => '.2',
9
- 'widget' => 'pmpro_addon_pmpro_level_cost_text_widget',
10
- 'enabled' => function_exists('pclct_pmpro_discount_code_after_level_settings')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_level_cost_text_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Adds a "level cost text" field to PMPro Membership Levels and Discount Codes to allow you to override the automatically generated level cost text PMPro provides.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-level-cost-text/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-level-cost-text/pmpro-level-cost-text.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-level-cost-text/pmpro-level-cost-text.php'), 'activate-plugin_pmpro-level-cost-text/pmpro-level-cost-text.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-level-cost-text.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-mailchimp.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro MailChimp Integration
4
- Slug: pmpro-mailchimp
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro MailChimp Integration',
8
- 'version' => '1.0',
9
- 'widget' => 'pmpro_addon_pmpro_mailchimp_widget',
10
- 'enabled' => function_exists('pmpromc_init')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_mailchimp_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-mailchimp.jpg" />
18
- <div class="info">
19
- <p>Integrate User Registrations with Mailchimp. Adds members to lists based on their membership level. (Note: works without PMPro as well.)</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-mailchimp/pmpro-mailchimp.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-mailchimp/pmpro-mailchimp.php'), 'activate-plugin_pmpro-mailchimp/pmpro-mailchimp.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-mailchimp'), 'install-plugin_pmpro-mailchimp'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-network-subsite.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Network
4
- Slug: pmpro-network-subsite
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Network Subsite Helper',
8
- 'version' => '.2',
9
- 'widget' => 'pmpro_addon_pmpro_network_subsite_widget',
10
- 'enabled' => function_exists('pmpron_subsite_activated_plugin')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_network_subsite_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-network.gif" />
18
- <div class="info">
19
- <p>Have network subsites use membership data from a "main" site to handle access restrictions.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-network-subsite" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-network-subsite/pmpro-network-subsite.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-network-subsite/pmpro-network-subsite.php'), 'activate-plugin_pmpro-network-subsite/pmpro-network-subsite.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-network-subsite.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-network.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Network
4
- Slug: pmpro-network
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Network',
8
- 'version' => '.3.1',
9
- 'widget' => 'pmpro_addon_pmpro_network_widget',
10
- 'enabled' => function_exists('pmpron_new_blogs_settings')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_network_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-network.gif" />
18
- <div class="info">
19
- <p>Allow users to checkout for a membership to create a site on your WordPress multisite network.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-network/blob/master/readme.txt" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-network/pmpro-network.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-network/pmpro-network.php'), 'activate-plugin_pmpro-network/pmpro-network.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-network.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-post-affiliate-pro.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Post Affiliate Pro Integration
4
- Slug: pmpro-post-affiliate-pro
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro Post Affiliate Pro Integration',
8
- 'version' => '.2.1.1',
9
- 'widget' => 'pmpro_addon_pmpro_post_affiliate_pro_widget',
10
- 'enabled' => function_exists('pap_pmpro_track_sale')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_post_affiliate_pro_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-post-affiliate-pro.jpg" />
18
- <div class="info">
19
- <p>Integrate Paid Memberships Pro with the Post Affiliate Pro platform.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-post-affiliate-pro/blob/master/readme.txt" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-post-affiliate-pro/pmpro-post-affiliate-pro.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-post-affiliate-pro/pmpro-post-affiliate-pro.php'), 'activate-plugin_pmpro-post-affiliate-pro/pmpro-post-affiliate-pro.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-post-affiliate-pro.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-register-helper.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Register Helper
4
- Slug: pmpro-register-helper
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Register Helper',
8
- 'version' => '.5.16.1',
9
- 'widget' => 'pmpro_addon_pmpro_register_helper_widget',
10
- 'enabled' => class_exists('PMProRH_Field')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_register_helper_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-register-helper.gif" />
18
- <div class="info">
19
- <p>Add additional meta fields to your PMPro checkout page and/or "Your Profile" pages. Support for text, select, multi-select, textarea, hidden, and custom HTML. Loop into existing checkout/profile field sections or add new ones.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-register-helper/blob/master/readme.txt" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-register-helper/pmpro-register-helper.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-register-helper/pmpro-register-helper.php'), 'activate-plugin_pmpro-register-helper/pmpro-register-helper.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-register-helper.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-require-code-to-register.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Require Code to Register
4
- Slug: pmpro-require-code-to-register
5
- */
6
- pmpro_add_addon('gists', array(
7
- 'title' => 'PMPro Require a Code to Register',
8
- 'version' => '.1',
9
- 'widget' => 'pmpro_addon_pmpro_require_code_to_register_widget',
10
- 'enabled' => function_exists('my_pmpro_registration_checks_require_code_to_register')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_require_code_to_register_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Require a discount code to checkout for a specific level.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a target="_blank" href="https://gist.github.com/strangerstudios/5573829" class="button">Enabled</a>
22
- <?php } else { ?>
23
- <a target="_blank" href="https://gist.github.com/strangerstudios/5573829" class="button button-primary">View Gist</a>
24
- <?php } ?>
25
- </div>
26
- </div> <!-- end info -->
27
- <?php
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-series.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Series
4
- Slug: pmpro-series
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Series',
8
- 'version' => '.3',
9
- 'widget' => 'pmpro_addon_pmpro_series_widget',
10
- 'enabled' => class_exists("PMProSeries")
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_series_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-series.gif" />
18
- <div class="info">
19
- <p>"Drip feed" content to your members over the course of their membership. Serializes content by # of days post-registration.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("edit.php?post_type=pmpro_series");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-series/pmpro-series.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-series/pmpro-series.php'), 'activate-plugin_pmpro-series/pmpro-series.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-series.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-shipping.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro Shipping Add On
4
- Slug: pmpro-shipping
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro Shipping Add On',
8
- 'version' => '.2.6',
9
- 'widget' => 'pmpro_addon_pmpro_shipping_widget',
10
- 'enabled' => function_exists('pmproship_pmpro_checkout_boxes')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_shipping_widget($addon)
15
- {
16
- ?>
17
- <?php /* <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-shipping.jpg" /> */ ?>
18
- <div class="info">
19
- <p>Adds shipping fields to the checkout page, confirmation page, confirmation emails, member's list and edit user profile pages.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-shipping/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-shipping/pmpro-shipping.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-shipping/pmpro-shipping.php'), 'activate-plugin_pmpro-shipping/pmpro-shipping.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-shipping.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-user-pages.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro User Pages
4
- Slug: pmpro-user-pages
5
- */
6
- pmpro_add_addon('github', array(
7
- 'title' => 'PMPro User Pages',
8
- 'version' => '.3',
9
- 'widget' => 'pmpro_addon_pmpro_user_pages_widget',
10
- 'enabled' => function_exists('pmproup_pmpro_after_checkout')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_user_pages_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>Creates a unique page for each Member after checkout, giving the Admin access to write customized content for each specific member.</p>
19
- <div class="actions">
20
- <?php if($addon['enabled']) { ?>
21
- <a href="https://github.com/strangerstudios/pmpro-user-pages/blob/master/readme.txt" class="button">Enabled</a>
22
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-user-pages/pmpro-user-pages.php")) { ?>
23
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-user-pages/pmpro-user-pages.php'), 'activate-plugin_pmpro-user-pages/pmpro-user-pages.php')?>" class="button button-primary">Activate</a>
24
- <?php } else { ?>
25
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-user-pages.zip" class="button button-primary">Download</a>
26
- <?php } ?>
27
- </div>
28
- </div> <!-- end info -->
29
- <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-woocommerce.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro WooCommerce
4
- Slug: pmpro-woocommerce
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro WooCommerce',
8
- 'version' => '1.2.2',
9
- 'widget' => 'pmpro_addon_pmpro_woocommerce_widget',
10
- 'enabled' => function_exists('pmprowoo_add_membership_from_order')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_woocommerce_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-woocommerce.gif" />
18
- <div class="info">
19
- <p>Use WooCommerce to purchase membership or set members-only product pricing.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-woocommerce/pmpro-woocommerce.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-woocommerce/pmpro-woocommerce.php'), 'activate-plugin_pmpro-woocommerce/pmpro-woocommerce.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-woocommerce'), 'install-plugin_pmpro-woocommerce'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/pmpro-wp-affiliate.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: PMPro WP Affiliate Platform Integration
4
- Slug: pmpro-wp-affiliate
5
- */
6
- pmpro_add_addon('thirdparty', array(
7
- 'title' => 'PMPro WP Affiliate Platform Integration',
8
- 'version' => '.3',
9
- 'widget' => 'pmpro_addon_pmpro_wp_affiliate_widget',
10
- 'enabled' => function_exists('wpa_pmpro_after_checkout')
11
- )
12
- );
13
-
14
- function pmpro_addon_pmpro_wp_affiliate_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/pmpro-wp-affiliate-platform.jpg" />
18
- <div class="info">
19
- <p>Process an affiliate via WP Affiliate Platform after a PMPro checkout.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="https://github.com/strangerstudios/pmpro-wp-affiliate-platform/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../pmpro-wp-affiliate-platform/pmpro-wp-affiliate-platform.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=pmpro-wp-affiliate-platform/pmpro-wp-affiliate-platform.php'), 'activate-plugin_pmpro-wp-affiliate-platform/pmpro-wp-affiliate-platform.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="http://www.paidmembershipspro.com/wp-content/uploads/plugins/pmpro-wp-affiliate-platform.zip" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/tml.php DELETED
@@ -1,32 +0,0 @@
1
- <?php
2
- /*
3
- Addon: Theme My Login
4
- Slug: pmpro-tml
5
- */
6
- pmpro_add_addon('recommended', array(
7
- 'title' => 'Theme My Login',
8
- 'widget' => 'pmpro_addon_tml_widget',
9
- 'enabled' => class_exists('Theme_My_Login'),
10
- 'version' => '6.3.10'
11
- )
12
- );
13
-
14
- function pmpro_addon_tml_widget($addon)
15
- {
16
- ?>
17
- <div class="info">
18
- <p>This plugin themes the WordPress login, registration and forgot password pages according to your current theme. By <a href="http://www.jfarthing.com/" target="_blank">Jeff Farthing</a></p>
19
- <div class="actions">
20
- <form method="post" name="component-actions" action="">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="<?php echo admin_url("plugins.php");?>" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../theme-my-login/theme-my-login.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=theme-my-login/theme-my-login.php'), 'activate-plugin_theme-my-login/theme-my-login.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=theme-my-login'), 'install-plugin_theme-my-login'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </form>
29
- </div>
30
- </div> <!-- end info -->
31
- <?php
32
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/addons/wp-bouncer.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
- /*
3
- Addon: WP Bouncer
4
- Slug: wp-bouncer
5
- */
6
- pmpro_add_addon('repo', array(
7
- 'title' => 'WP Bouncer',
8
- 'version' => '1.1',
9
- 'widget' => 'pmpro_addon_wp_bouncer_widget',
10
- 'enabled' => class_exists('WP_Bouncer')
11
- )
12
- );
13
-
14
- function pmpro_addon_wp_bouncer_widget($addon)
15
- {
16
- ?>
17
- <img class="addon-thumb" src="<?php echo PMPRO_URL?>/adminpages/addons/images/wp-bouncer.gif" />
18
- <div class="info">
19
- <p>Make sure users are only logged in from one computer or device at a time.</p>
20
- <div class="actions">
21
- <?php if($addon['enabled']) { ?>
22
- <a href="http://wordpress.org/plugins/wp-bouncer/" class="button">Enabled</a>
23
- <?php } elseif(file_exists(dirname(__FILE__) . "/../../../wp-bouncer/wp-bouncer.php")) { ?>
24
- <a href="<?php echo wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=wp-bouncer/wp-bouncer.php'), 'activate-plugin_wp-bouncer/wp-bouncer.php')?>" class="button button-primary">Activate</a>
25
- <?php } else { ?>
26
- <a href="<?php echo wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=wp-bouncer'), 'install-plugin_wp-bouncer'); ?>" class="button button-primary">Download</a>
27
- <?php } ?>
28
- </div>
29
- </div> <!-- end info -->
30
- <?php
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/admin_footer.php CHANGED
@@ -1,2 +1 @@
1
- <div class="clear"></div>
2
  </div>
 
1
  </div>
adminpages/admin_header.php CHANGED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once(dirname(__FILE__) . "/functions.php");
3
-
4
  if(isset($_REQUEST['page']))
5
  $view = $_REQUEST['page'];
6
  else
@@ -22,11 +20,11 @@
22
  if(empty($msg))
23
  $msg = -1;
24
  if(empty($pmpro_level_ready) && empty($edit))
25
- $msgt .= " <a href=\"?page=pmpro-membershiplevels&edit=-1\">" . __("Add a membership level to get started.", "pmpro") . "</a>";
26
  elseif($pmpro_level_ready && !$pmpro_pages_ready && $view != "pmpro-pagesettings")
27
- $msgt .= " <a href=\"?page=pmpro-pagesettings\">" . __("Setup the membership pages", "pmpro") . "</a>.";
28
  elseif($pmpro_level_ready && $pmpro_pages_ready && !$pmpro_gateway_ready && $view != "pmpro-paymentsettings")
29
- $msgt .= " <a href=\"?page=pmpro-paymentsettings\">" . __("Setup your SSL certificate and payment gateway", "pmpro") . "</a>.";
30
 
31
  if(empty($msgt))
32
  $msg = false;
@@ -35,7 +33,7 @@
35
  if(!pmpro_checkLevelForStripeCompatibility())
36
  {
37
  $msg = -1;
38
- $msgt = __("The billing details for some of your membership levels is not supported by Stripe.", "pmpro");
39
  if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
40
  {
41
  if(!pmpro_checkLevelForStripeCompatibility($_REQUEST['edit']))
@@ -43,39 +41,19 @@
43
  global $pmpro_stripe_error;
44
  $pmpro_stripe_error = true;
45
  $msg = -1;
46
- $msgt = __("The billing details for this level are not supported by Stripe. Please review the notes in the Billing Details section below.", "pmpro");
47
- }
48
- }
49
- elseif($view == "pmpro-membershiplevels")
50
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
51
- else
52
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
53
- }
54
-
55
- if(!pmpro_checkLevelForPayflowCompatibility())
56
- {
57
- $msg = -1;
58
- $msgt = __("The billing details for some of your membership levels is not supported by Payflow.", "pmpro");
59
- if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
60
- {
61
- if(!pmpro_checkLevelForPayflowCompatibility($_REQUEST['edit']))
62
- {
63
- global $pmpro_payflow_error;
64
- $pmpro_payflow_error = true;
65
- $msg = -1;
66
- $msgt = __("The billing details for this level are not supported by Payflow. Please review the notes in the Billing Details section below.", "pmpro");
67
  }
68
  }
69
  elseif($view == "pmpro-membershiplevels")
70
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
71
  else
72
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
73
  }
74
 
75
  if(!pmpro_checkLevelForBraintreeCompatibility())
76
  {
77
  $msg = -1;
78
- $msgt = __("The billing details for some of your membership levels is not supported by Braintree.", "pmpro");
79
  if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
80
  {
81
  if(!pmpro_checkLevelForBraintreeCompatibility($_REQUEST['edit']))
@@ -83,34 +61,13 @@
83
  global $pmpro_braintree_error;
84
  $pmpro_braintree_error = true;
85
  $msg = -1;
86
- $msgt = __("The billing details for this level are not supported by Braintree. Please review the notes in the Billing Details section below.", "pmpro");
87
- }
88
- }
89
- elseif($view == "pmpro-membershiplevels")
90
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
91
- else
92
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
93
- }
94
-
95
- if(!pmpro_checkLevelForTwoCheckoutCompatibility())
96
- {
97
- $msg = -1;
98
- $msgt = __("The billing details for some of your membership levels is not supported by TwoCheckout.", "pmpro");
99
- if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
100
- {
101
- if(!pmpro_checkLevelForTwoCheckoutCompatibility($_REQUEST['edit']))
102
- {
103
- global $pmpro_twocheckout_error;
104
- $pmpro_twocheckout_error = true;
105
-
106
- $msg = -1;
107
- $msgt = __("The billing details for this level are not supported by 2Checkout. Please review the notes in the Billing Details section below.", "pmpro");
108
  }
109
  }
110
  elseif($view == "pmpro-membershiplevels")
111
- $msgt .= " " . __("The levels with issues are highlighted below.", "pmpro");
112
  else
113
- $msgt .= " <a href=\"?page=pmpro-membershiplevels\">" . __("Please edit your levels", "pmpro") . "</a>.";
114
  }
115
 
116
  if(!empty($msg))
@@ -122,12 +79,13 @@
122
 
123
  ?>
124
  <div class="wrap pmpro_admin">
125
- <div class="pmpro_banner">
126
- <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><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>
127
- <div class="pmpro_meta"><span class="pmpro_tag-grey">v<?php echo PMPRO_VERSION?></span><a target="_blank" class="pmpro_tag-blue" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><?php _e('Plugin Support', 'pmpro');?></a><a target="_blank" class="pmpro_tag-blue" href="http://www.paidmembershipspro.com/forums/"><?php _e('User Forum', 'pmpro');?></a></div>
128
 
129
- <br style="clear:both;" />
130
- </div>
 
131
 
132
  <div id="pmpro_notifications">
133
  </div>
@@ -140,17 +98,10 @@
140
  });
141
  </script>
142
 
143
- <?php
144
- $settings_tabs = array("pmpro-membershiplevels", "pmpro-pagesettings", "pmpro-paymentsettings", "pmpro-emailsettings", "pmpro-advancedsettings", "pmpro-addons");
145
- if(in_array($view, $settings_tabs))
146
- {
147
- ?>
148
  <h3 class="nav-tab-wrapper">
149
- <a href="admin.php?page=pmpro-membershiplevels" class="nav-tab<?php if($view == 'pmpro-membershiplevels') { ?> nav-tab-active<?php } ?>"><?php _e('Membership Levels', 'pmpro');?></a>
150
- <a href="admin.php?page=pmpro-pagesettings" class="nav-tab<?php if($view == 'pmpro-pagesettings') { ?> nav-tab-active<?php } ?>"><?php _e('Pages', 'pmpro');?></a>
151
- <a href="admin.php?page=pmpro-paymentsettings" class="nav-tab<?php if($view == 'pmpro-paymentsettings') { ?> nav-tab-active<?php } ?>"><?php _e('Payment Gateway &amp; SSL', 'pmpro');?></a>
152
- <a href="admin.php?page=pmpro-emailsettings" class="nav-tab<?php if($view == 'pmpro-emailsettings') { ?> nav-tab-active<?php } ?>"><?php _e('Email', 'pmpro');?></a>
153
- <a href="admin.php?page=pmpro-advancedsettings" class="nav-tab<?php if($view == 'pmpro-advancedsettings') { ?> nav-tab-active<?php } ?>"><?php _e('Advanced', 'pmpro');?></a>
154
- <a href="admin.php?page=pmpro-addons" class="nav-tab<?php if($view == 'pmpro-addons') { ?> nav-tab-active<?php } ?>"><?php _e('Add Ons', 'pmpro');?></a>
155
  </h3>
156
- <?php } ?>
1
  <?php
 
 
2
  if(isset($_REQUEST['page']))
3
  $view = $_REQUEST['page'];
4
  else
20
  if(empty($msg))
21
  $msg = -1;
22
  if(empty($pmpro_level_ready) && empty($edit))
23
+ $msgt .= " <a href=\"?page=pmpro-membershiplevels&edit=-1\">Add a membership level</a> to get started.";
24
  elseif($pmpro_level_ready && !$pmpro_pages_ready && $view != "pmpro-pagesettings")
25
+ $msgt .= " <a href=\"?page=pmpro-pagesettings\">Setup the membership pages</a>.";
26
  elseif($pmpro_level_ready && $pmpro_pages_ready && !$pmpro_gateway_ready && $view != "pmpro-paymentsettings")
27
+ $msgt .= " <a href=\"?page=pmpro-paymentsettings\">Setup your SSL certificate and payment gateway</a>.";
28
 
29
  if(empty($msgt))
30
  $msg = false;
33
  if(!pmpro_checkLevelForStripeCompatibility())
34
  {
35
  $msg = -1;
36
+ $msgt = "The billing details for some of your membership levels is not supported by Stripe.";
37
  if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
38
  {
39
  if(!pmpro_checkLevelForStripeCompatibility($_REQUEST['edit']))
41
  global $pmpro_stripe_error;
42
  $pmpro_stripe_error = true;
43
  $msg = -1;
44
+ $msgt = "The billing details for this level are not supported by Stripe. Please review the notes in the Billing Details section below.";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  }
46
  }
47
  elseif($view == "pmpro-membershiplevels")
48
+ $msgt .= " The levels with issues are highlighted below.";
49
  else
50
+ $msgt .= " <a href=\"?page=pmpro-membershiplevels\">Please edit your levels</a>.";
51
  }
52
 
53
  if(!pmpro_checkLevelForBraintreeCompatibility())
54
  {
55
  $msg = -1;
56
+ $msgt = "The billing details for some of your membership levels is not supported by Braintree.";
57
  if($view == "pmpro-membershiplevels" && !empty($_REQUEST['edit']) && $_REQUEST['edit'] > 0)
58
  {
59
  if(!pmpro_checkLevelForBraintreeCompatibility($_REQUEST['edit']))
61
  global $pmpro_braintree_error;
62
  $pmpro_braintree_error = true;
63
  $msg = -1;
64
+ $msgt = "The billing details for this level are not supported by Braintree. Please review the notes in the Billing Details section below.";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
  }
67
  elseif($view == "pmpro-membershiplevels")
68
+ $msgt .= " The levels with issues are highlighted below.";
69
  else
70
+ $msgt .= " <a href=\"?page=pmpro-membershiplevels\">Please edit your levels</a>.";
71
  }
72
 
73
  if(!empty($msg))
79
 
80
  ?>
81
  <div class="wrap pmpro_admin">
82
+ <div class="pmpro_banner">
83
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
84
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
85
 
86
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
87
+ </div>
88
+ <br style="clear:both;" />
89
 
90
  <div id="pmpro_notifications">
91
  </div>
98
  });
99
  </script>
100
 
 
 
 
 
 
101
  <h3 class="nav-tab-wrapper">
102
+ <a href="admin.php?page=pmpro-membershiplevels" class="nav-tab<?php if($view == 'pmpro-membershiplevels') { ?> nav-tab-active<?php } ?>">Membership Levels</a>
103
+ <a href="admin.php?page=pmpro-pagesettings" class="nav-tab<?php if($view == 'pmpro-pagesettings') { ?> nav-tab-active<?php } ?>">Pages</a>
104
+ <a href="admin.php?page=pmpro-paymentsettings" class="nav-tab<?php if($view == 'pmpro-paymentsettings') { ?> nav-tab-active<?php } ?>">Payment Gateway &amp; SSL</a>
105
+ <a href="admin.php?page=pmpro-emailsettings" class="nav-tab<?php if($view == 'pmpro-emailsettings') { ?> nav-tab-active<?php } ?>">Email</a>
106
+ <a href="admin.php?page=pmpro-advancedsettings" class="nav-tab<?php if($view == 'pmpro-advancedsettings') { ?> nav-tab-active<?php } ?>">Advanced</a>
 
107
  </h3>
 
adminpages/advancedsettings.php CHANGED
@@ -1,8 +1,8 @@
1
  <?php
2
  //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_advancedsettings")))
4
  {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
  }
7
 
8
  global $wpdb, $msg, $msgt;
@@ -14,7 +14,6 @@
14
  pmpro_setOption("nonmembertext");
15
  pmpro_setOption("notloggedintext");
16
  pmpro_setOption("rsstext");
17
- pmpro_setOption("filterqueries");
18
  pmpro_setOption("showexcerpts");
19
  pmpro_setOption("hideads");
20
  pmpro_setOption("hideadslevels");
@@ -30,24 +29,16 @@
30
 
31
  //footer link
32
  pmpro_setOption("hide_footer_link");
33
-
34
- // custom settings (added with pmpro_custom_advanced_settings hook)
35
- foreach($_REQUEST as $key => $value ) {
36
- if (strpos($key, 'custom_') === 0) {
37
- pmpro_setOption($key);
38
- }
39
- }
40
 
41
  //assume success
42
  $msg = true;
43
- $msgt = __("Your advanced settings have been updated.", "pmpro");
44
  }
45
 
46
  $nonmembertext = pmpro_getOption("nonmembertext");
47
  $notloggedintext = pmpro_getOption("notloggedintext");
48
  $rsstext = pmpro_getOption("rsstext");
49
  $hideads = pmpro_getOption("hideads");
50
- $filterqueries = pmpro_getOption('filterqueries');
51
  $showexcerpts = pmpro_getOption("showexcerpts");
52
  $hideadslevels = pmpro_getOption("hideadslevels");
53
 
@@ -65,17 +56,17 @@
65
  //default settings
66
  if(!$nonmembertext)
67
  {
68
- $nonmembertext = sprintf( __( 'This content is for !!levels!! members only. <a href="%s">Register here</a>.', 'pmpro' ), wp_login_url() . "?action=register" );
69
  pmpro_setOption("nonmembertext", $nonmembertext);
70
  }
71
  if(!$notloggedintext)
72
  {
73
- $notloggedintext = sprintf( __( 'Please <a href="%s">login</a> to view this content. (<a href="%s">Register here</a>.)', 'pmpro' ), wp_login_url( get_permalink() ), wp_login_url() . "?action=register" );
74
  pmpro_setOption("notloggedintext", $notloggedintext);
75
  }
76
  if(!$rsstext)
77
  {
78
- $rsstext = __( 'This content is for members only. Visit the site and log in/register to read.', 'pmpro' );
79
  pmpro_setOption("rsstext", $rsstext);
80
  }
81
 
@@ -85,77 +76,66 @@
85
  ?>
86
 
87
  <form action="" method="post" enctype="multipart/form-data">
88
- <h2><?php _e('Advanced Settings', 'pmpro');?></h2>
89
 
90
  <table class="form-table">
91
  <tbody>
92
  <tr>
93
  <th scope="row" valign="top">
94
- <label for="nonmembertext"><?php _e('Message for Logged-in Non-members', 'pmpro');?>:</label>
95
  </th>
96
  <td>
97
  <textarea name="nonmembertext" rows="3" cols="80"><?php echo stripslashes($nonmembertext)?></textarea><br />
98
- <small class="litegray"><?php _e('This message replaces the post content for non-members. Available variables', 'pmpro');?>: !!levels!!, !!referrer!!</small>
99
  </td>
100
  </tr>
101
  <tr>
102
  <th scope="row" valign="top">
103
- <label for="notloggedintext"><?php _e('Message for Logged-out Users', 'pmpro');?>:</label>
104
  </th>
105
  <td>
106
  <textarea name="notloggedintext" rows="3" cols="80"><?php echo stripslashes($notloggedintext)?></textarea><br />
107
- <small class="litegray"><?php _e('This message replaces the post content for logged-out visitors.', 'pmpro');?></small>
108
  </td>
109
  </tr>
110
  <tr>
111
  <th scope="row" valign="top">
112
- <label for="rsstext"><?php _e('Message for RSS Feed', 'pmpro');?>:</label>
113
  </th>
114
  <td>
115
  <textarea name="rsstext" rows="3" cols="80"><?php echo stripslashes($rsstext)?></textarea><br />
116
- <small class="litegray"><?php _e('This message replaces the post content in RSS feeds.', 'pmpro');?></small>
117
  </td>
118
  </tr>
119
 
120
  <tr>
121
  <th scope="row" valign="top">
122
- <label for="filterqueries"><?php _e("Filter searches and archives?", 'pmpro');?></label>
123
  </th>
124
  <td>
125
- <select id="filterqueries" name="filterqueries">
126
- <option value="0" <?php if(!$filterqueries) { ?>selected="selected"<?php } ?>><?php _e('No - Non-members will see restricted posts/pages in searches and archives.', 'pmpro');?></option>
127
- <option value="1" <?php if($filterqueries == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Only members will see restricted posts/pages in searches and archives.', 'pmpro');?></option>
128
  </select>
129
  </td>
130
  </tr>
131
  <tr>
132
- <th scope="row" valign="top">
133
- <label for="showexcerpts"><?php _e('Show Excerpts to Non-Members?', 'pmpro');?></label>
134
- </th>
135
- <td>
136
- <select id="showexcerpts" name="showexcerpts">
137
- <option value="0" <?php if(!$showexcerpts) { ?>selected="selected"<?php } ?>><?php _e('No - Hide excerpts.', 'pmpro');?></option>
138
- <option value="1" <?php if($showexcerpts == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Show excerpts.', 'pmpro');?></option>
139
- </select>
140
- </td>
141
- </tr>
142
- <tr>
143
  <th scope="row" valign="top">
144
  <label for="hideads">Hide Ads From Members?</label>
145
  </th>
146
  <td>
147
  <select id="hideads" name="hideads" onchange="pmpro_updateHideAdsTRs();">
148
- <option value="0" <?php if(!$hideads) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
149
- <option value="1" <?php if($hideads == 1) { ?>selected="selected"<?php } ?>><?php _e('Hide Ads From All Members', 'pmpro');?></option>
150
- <option value="2" <?php if($hideads == 2) { ?>selected="selected"<?php } ?>><?php _e('Hide Ads From Certain Members', 'pmpro');?></option>
151
  </select>
152
  </td>
153
  </tr>
154
  <tr id="hideads_explanation" <?php if($hideads < 2) { ?>style="display: none;"<?php } ?>>
155
  <th scope="row" valign="top">&nbsp;</th>
156
  <td>
157
- <p class="top0em"><?php _e('Ads from the following plugins will be automatically turned off', 'pmpro');?>: <em>Easy Adsense</em>, ...</p>
158
- <p><?php _e('To hide ads in your template code, use code like the following', 'pmpro');?>:</p>
159
  <pre lang="PHP">
160
  if(pmpro_displayAds())
161
  {
@@ -166,7 +146,7 @@ if(pmpro_displayAds())
166
  </tr>
167
  <tr id="hideadslevels_tr" <?php if($hideads != 2) { ?>style="display: none;"<?php } ?>>
168
  <th scope="row" valign="top">
169
- <label for="hideadslevels"><?php _e('Choose Levels to Hide Ads From', 'pmpro');?>:</label>
170
  </th>
171
  <td>
172
  <div class="checkbox_box" <?php if(count($levels) > 5) { ?>style="height: 100px; overflow: auto;"<?php } ?>>
@@ -200,49 +180,49 @@ if(pmpro_displayAds())
200
  <?php if(is_multisite()) { ?>
201
  <tr>
202
  <th scope="row" valign="top">
203
- <label for="redirecttosubscription"><?php _e('Redirect all traffic from registration page to /susbcription/?', 'pmpro');?>: <em>(<?php _e('multisite only', 'pmpro');?>)</em></label>
204
  </th>
205
  <td>
206
  <select id="redirecttosubscription" name="redirecttosubscription">
207
- <option value="0" <?php if(!$redirecttosubscription) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
208
- <option value="1" <?php if($redirecttosubscription == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'pmpro');?></option>
209
  </select>
210
  </td>
211
  </tr>
212
  <?php } ?>
213
  <tr>
214
  <th scope="row" valign="top">
215
- <label for="recaptcha"><?php _e('Use reCAPTCHA?', 'pmpro');?>:</label>
216
  </th>
217
  <td>
218
  <select id="recaptcha" name="recaptcha" onchange="pmpro_updateRecaptchaTRs();">
219
- <option value="0" <?php if(!$recaptcha) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
220
- <option value="1" <?php if($recaptcha == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes - Free memberships only.', 'pmpro');?></option>
221
- <option value="2" <?php if($recaptcha == 2) { ?>selected="selected"<?php } ?>><?php _e('Yes - All memberships.', 'pmpro');?></option>
222
  </select><br />
223
- <small><?php _e('A free reCAPTCHA key is required.', 'pmpro');?> <a href="https://www.google.com/recaptcha/admin/create"><?php _e('Click here to signup for reCAPTCHA', 'pmpro');?></a>.</small>
224
  </td>
225
  </tr>
226
  <tr id="recaptcha_tr" <?php if(!$recaptcha) { ?>style="display: none;"<?php } ?>>
227
  <th scope="row" valign="top">&nbsp;</th>
228
  <td>
229
- <label for="recaptcha_publickey"><?php _e('reCAPTCHA Public Key', 'pmpro');?>:</label>
230
  <input type="text" name="recaptcha_publickey" size="60" value="<?php echo $recaptcha_publickey?>" />
231
  <br /><br />
232
- <label for="recaptcha_privatekey"><?php _e('reCAPTCHA Private Key', 'pmpro');?>:</label>
233
  <input type="text" name="recaptcha_privatekey" size="60" value="<?php echo $recaptcha_privatekey?>" />
234
  </td>
235
  </tr>
236
  <tr>
237
  <th scope="row" valign="top">
238
- <label for="tospage"><?php _e('Require Terms of Service on signups?', 'pmpro');?></label>
239
  </th>
240
  <td>
241
  <?php
242
  wp_dropdown_pages(array("name"=>"tospage", "show_option_none"=>"No", "selected"=>$tospage));
243
  ?>
244
  <br />
245
- <small><?php _e('If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above.', 'pmpro');?></small>
246
  </td>
247
  </tr>
248
 
@@ -257,73 +237,9 @@ if(pmpro_displayAds())
257
  <option value="1" <?php if($hide_footer_link == 1) { ?>selected="selected"<?php } ?>>Yes - Hide the link.</option>
258
  </select>
259
  </td>
260
- </tr>
261
- */
262
-
263
- // Filter to Add More Advanced Settings for Misc Plugin Options, etc.
264
- if (has_action('pmpro_custom_advanced_settings')) {
265
- $custom_fields = apply_filters('pmpro_custom_advanced_settings', $custom_fields);
266
- foreach ($custom_fields as $field) {
267
- ?>
268
- <tr>
269
- <th valign="top" scope="row">
270
- <label
271
- for="<?php _e($field['field_name'], 'pmpro'); ?>"><?php _e($field['label'], 'pmpro'); ?></label>
272
- </th>
273
- <td>
274
- <?php
275
- switch ($field['field_type']) {
276
- case 'select':
277
- ?>
278
- <select id="<?php _e($field['field_name'], 'pmpro'); ?>"
279
- name="<?php _e($field['field_name'], 'pmpro'); ?>">
280
- <?php foreach ($field['options'] as $option) {
281
- ?>
282
- <option value="<?php _e($option, 'pmpro'); ?>"
283
- <?php
284
- if ($option == pmpro_getOption($field['field_name'])) {
285
- _e('selected', 'pmpro');
286
- }
287
- ?>
288
- ><?php _e($option, 'pmpro'); ?></option>
289
- <?php
290
- } ?>
291
- </select>
292
- <?php
293
- break;
294
- case 'text':
295
- ?>
296
- <input id="<?php _e($field['field_name'], 'pmpro'); ?>"
297
- name="<?php _e($field['field_name'], 'pmpro'); ?>"
298
- type="<?php _e($field['field_type'], 'pmpro'); ?>"
299
- value="<?php echo pmpro_getOption($field['field_name']); ?> ">
300
- <?php
301
- break;
302
- case 'textarea':
303
- ?>
304
- <textarea id="<?php _e($field['field_name'], 'pmpro'); ?>"
305
- name="<?php _e($field['field_name'], 'pmpro'); ?>">
306
- <?php echo pmpro_getOption($field['field_name']); ?>
307
- </textarea>
308
- <?php
309
- break;
310
- default:
311
- break;
312
- }
313
- if (!empty($field['description'])) {
314
- ?>
315
- <br>
316
- <small><?php _e($field['description'], 'pmpro'); ?></small>
317
- <?php
318
- }
319
- ?>
320
- </td>
321
- <?php
322
- }
323
- }
324
- ?>
325
- </tr>
326
- </tbody>
327
  </table>
328
  <script>
329
  function pmpro_updateHideAdsTRs()
@@ -365,7 +281,7 @@ if(pmpro_displayAds())
365
  </script>
366
 
367
  <p class="submit">
368
- <input name="savesettings" type="submit" class="button button-primary" value="<?php _e('Save Settings', 'pmpro');?>" />
369
  </p>
370
  </form>
371
 
1
  <?php
2
  //only admins can get this
3
+ if(!function_exists("current_user_can") || !current_user_can("manage_options"))
4
  {
5
+ die("You do not have permissions to perform this action.");
6
  }
7
 
8
  global $wpdb, $msg, $msgt;
14
  pmpro_setOption("nonmembertext");
15
  pmpro_setOption("notloggedintext");
16
  pmpro_setOption("rsstext");
 
17
  pmpro_setOption("showexcerpts");
18
  pmpro_setOption("hideads");
19
  pmpro_setOption("hideadslevels");
29
 
30
  //footer link
31
  pmpro_setOption("hide_footer_link");
 
 
 
 
 
 
 
32
 
33
  //assume success
34
  $msg = true;
35
+ $msgt = "Your advanced settings have been updated.";
36
  }
37
 
38
  $nonmembertext = pmpro_getOption("nonmembertext");
39
  $notloggedintext = pmpro_getOption("notloggedintext");
40
  $rsstext = pmpro_getOption("rsstext");
41
  $hideads = pmpro_getOption("hideads");
 
42
  $showexcerpts = pmpro_getOption("showexcerpts");
43
  $hideadslevels = pmpro_getOption("hideadslevels");
44
 
56
  //default settings
57
  if(!$nonmembertext)
58
  {
59
+ $nonmembertext = "This content is for !!levels!! members only. <a href=\"" . wp_login_url() . "?action=register\">Register here</a>.";
60
  pmpro_setOption("nonmembertext", $nonmembertext);
61
  }
62
  if(!$notloggedintext)
63
  {
64
+ $notloggedintext = "Please <a href=\"" . wp_login_url( get_permalink() ) . "\">login</a> to view this content. (<a href=\"" . wp_login_url() . "?action=register\">Register here</a>.)";
65
  pmpro_setOption("notloggedintext", $notloggedintext);
66
  }
67
  if(!$rsstext)
68
  {
69
+ $rsstext = "This content is for members only. Visit the site and log in/register to read.";
70
  pmpro_setOption("rsstext", $rsstext);
71
  }
72
 
76
  ?>
77
 
78
  <form action="" method="post" enctype="multipart/form-data">
79
+ <h2>Advanced Settings</h2>
80
 
81
  <table class="form-table">
82
  <tbody>
83
  <tr>
84
  <th scope="row" valign="top">
85
+ <label for="nonmembertext">Message for Logged-in Non-members:</label>
86
  </th>
87
  <td>
88
  <textarea name="nonmembertext" rows="3" cols="80"><?php echo stripslashes($nonmembertext)?></textarea><br />
89
+ <small class="litegray">This message replaces the post content for non-members. Available variables: !!levels!!, !!referrer!!</small>
90
  </td>
91
  </tr>
92
  <tr>
93
  <th scope="row" valign="top">
94
+ <label for="notloggedintext">Message for Logged-out Users:</label>
95
  </th>
96
  <td>
97
  <textarea name="notloggedintext" rows="3" cols="80"><?php echo stripslashes($notloggedintext)?></textarea><br />
98
+ <small class="litegray">This message replaces the post content for logged-out visitors.</small>
99
  </td>
100
  </tr>
101
  <tr>
102
  <th scope="row" valign="top">
103
+ <label for="rsstext">Message for RSS Feed:</label>
104
  </th>
105
  <td>
106
  <textarea name="rsstext" rows="3" cols="80"><?php echo stripslashes($rsstext)?></textarea><br />
107
+ <small class="litegray">This message replaces the post content in RSS feeds.</small>
108
  </td>
109
  </tr>
110
 
111
  <tr>
112
  <th scope="row" valign="top">
113
+ <label for="showexcerpts">Show Excerpts to Non-Members?</label>
114
  </th>
115
  <td>
116
+ <select id="showexcerpts" name="showexcerpts">
117
+ <option value="0" <?php if(!$showexcerpts) { ?>selected="selected"<?php } ?>>No - Hide excerpts.</option>
118
+ <option value="1" <?php if($showexcerpts == 1) { ?>selected="selected"<?php } ?>>Yes - Show excerpts.</option>
119
  </select>
120
  </td>
121
  </tr>
122
  <tr>
 
 
 
 
 
 
 
 
 
 
 
123
  <th scope="row" valign="top">
124
  <label for="hideads">Hide Ads From Members?</label>
125
  </th>
126
  <td>
127
  <select id="hideads" name="hideads" onchange="pmpro_updateHideAdsTRs();">
128
+ <option value="0" <?php if(!$hideads) { ?>selected="selected"<?php } ?>>No</option>
129
+ <option value="1" <?php if($hideads == 1) { ?>selected="selected"<?php } ?>>Hide Ads From All Members</option>
130
+ <option value="2" <?php if($hideads == 2) { ?>selected="selected"<?php } ?>>Hide Ads From Certain Members</option>
131
  </select>
132
  </td>
133
  </tr>
134
  <tr id="hideads_explanation" <?php if($hideads < 2) { ?>style="display: none;"<?php } ?>>
135
  <th scope="row" valign="top">&nbsp;</th>
136
  <td>
137
+ <p class="top0em">Ads from the following plugins will be automatically turned off: <em>Easy Adsense</em>, ...</p>
138
+ <p>To hide ads in your template code, use code like the following:</p>
139
  <pre lang="PHP">
140
  if(pmpro_displayAds())
141
  {
146
  </tr>
147
  <tr id="hideadslevels_tr" <?php if($hideads != 2) { ?>style="display: none;"<?php } ?>>
148
  <th scope="row" valign="top">
149
+ <label for="hideadslevels">Choose Levels to Hide Ads From:</label>
150
  </th>
151
  <td>
152
  <div class="checkbox_box" <?php if(count($levels) > 5) { ?>style="height: 100px; overflow: auto;"<?php } ?>>
180
  <?php if(is_multisite()) { ?>
181
  <tr>
182
  <th scope="row" valign="top">
183
+ <label for="redirecttosubscription">Redirect all traffic from registration page to /susbcription/?: <em>(multisite only)</em></label>
184
  </th>
185
  <td>
186
  <select id="redirecttosubscription" name="redirecttosubscription">
187
+ <option value="0" <?php if(!$redirecttosubscription) { ?>selected="selected"<?php } ?>>No</option>
188
+ <option value="1" <?php if($redirecttosubscription == 1) { ?>selected="selected"<?php } ?>>Yes</option>
189
  </select>
190
  </td>
191
  </tr>
192
  <?php } ?>
193
  <tr>
194
  <th scope="row" valign="top">
195
+ <label for="recaptcha">Use reCAPTCHA?:</label>
196
  </th>
197
  <td>
198
  <select id="recaptcha" name="recaptcha" onchange="pmpro_updateRecaptchaTRs();">
199
+ <option value="0" <?php if(!$recaptcha) { ?>selected="selected"<?php } ?>>No</option>
200
+ <option value="1" <?php if($recaptcha == 1) { ?>selected="selected"<?php } ?>>Yes - Free memberships only.</option>
201
+ <option value="2" <?php if($recaptcha == 2) { ?>selected="selected"<?php } ?>>Yes - All memberships.</option>
202
  </select><br />
203
+ <small>A free reCAPTCHA key is required. <a href="https://www.google.com/recaptcha/admin/create">Click here to signup for reCAPTCHA</a>.</small>
204
  </td>
205
  </tr>
206
  <tr id="recaptcha_tr" <?php if(!$recaptcha) { ?>style="display: none;"<?php } ?>>
207
  <th scope="row" valign="top">&nbsp;</th>
208
  <td>
209
+ <label for="recaptcha_publickey">reCAPTCHA Public Key:</label>
210
  <input type="text" name="recaptcha_publickey" size="60" value="<?php echo $recaptcha_publickey?>" />
211
  <br /><br />
212
+ <label for="recaptcha_privatekey">reCAPTCHA Private Key:</label>
213
  <input type="text" name="recaptcha_privatekey" size="60" value="<?php echo $recaptcha_privatekey?>" />
214
  </td>
215
  </tr>
216
  <tr>
217
  <th scope="row" valign="top">
218
+ <label for="tospage">Require Terms of Service on signups?</label>
219
  </th>
220
  <td>
221
  <?php
222
  wp_dropdown_pages(array("name"=>"tospage", "show_option_none"=>"No", "selected"=>$tospage));
223
  ?>
224
  <br />
225
+ <small>If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above.</small>
226
  </td>
227
  </tr>
228
 
237
  <option value="1" <?php if($hide_footer_link == 1) { ?>selected="selected"<?php } ?>>Yes - Hide the link.</option>
238
  </select>
239
  </td>
240
+ </tr>
241
+ */ ?>
242
+ </tbody>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  </table>
244
  <script>
245
  function pmpro_updateHideAdsTRs()
281
  </script>
282
 
283
  <p class="submit">
284
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
285
  </p>
286
  </form>
287
 
adminpages/dashboard.php CHANGED
@@ -105,9 +105,9 @@
105
 
106
  echo '</ul>';
107
  echo '<br class="clear"/><div style="margin-top:10px;border-top: 1px solid #ddd; padding-top: 10px; text-align:center;">';
108
- echo '<a target="_blank" href="'.$pmpro_feed.'"><img src="'.get_bloginfo('wpurl').'/wp-includes/images/rss.png" alt=""/> Subscribe with RSS</a>';
109
  echo ' &nbsp; &nbsp; &nbsp; ';
110
- echo '<a target="_blank" href="http://www.paidmembershipspro.com/blog/">View Online</a>';
111
  echo '<form class="alignright" method="post"><input type="hidden" name="pmpro_removedbwidget" value="true"/><input title="Remove this widget from all users dashboards" class="button" type="submit" value="X"/></form>';
112
  echo '</div>';
113
  }
105
 
106
  echo '</ul>';
107
  echo '<br class="clear"/><div style="margin-top:10px;border-top: 1px solid #ddd; padding-top: 10px; text-align:center;">';
108
+ echo '<a href="'.$pmpro_feed.'"><img src="'.get_bloginfo('wpurl').'/wp-includes/images/rss.png" alt=""/> Subscribe with RSS</a>';
109
  echo ' &nbsp; &nbsp; &nbsp; ';
110
+ echo '<a href="http://www.paidmembershipspro.com/"><img src="'.get_bloginfo('wpurl').'/wp-includes/images/wpmini-blue.png" alt=""/> View Online</a>';
111
  echo '<form class="alignright" method="post"><input type="hidden" name="pmpro_removedbwidget" value="true"/><input title="Remove this widget from all users dashboards" class="button" type="submit" value="X"/></form>';
112
  echo '</div>';
113
  }
adminpages/discountcodes.php CHANGED
@@ -1,636 +1,648 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_discountcodes")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- //vars
9
- global $wpdb, $pmpro_currency_symbol;
10
-
11
- if(isset($_REQUEST['edit']))
12
- $edit = $_REQUEST['edit'];
13
- else
14
- $edit = false;
15
-
16
- if(isset($_REQUEST['delete']))
17
- $delete = $_REQUEST['delete'];
18
- else
19
- $delete = false;
20
-
21
- if(isset($_REQUEST['saveid']))
22
- $saveid = $_POST['saveid'];
23
- else
24
- $saveid = false;
25
-
26
- if($saveid)
27
- {
28
- //get vars
29
- $code = $_POST['code'];
30
- $starts_month = $_POST['starts_month'];
31
- $starts_day = $_POST['starts_day'];
32
- $starts_year = $_POST['starts_year'];
33
- $expires_month = $_POST['expires_month'];
34
- $expires_day = $_POST['expires_day'];
35
- $expires_year = $_POST['expires_year'];
36
- $uses = $_POST['uses'];
37
-
38
- //fix up dates
39
- $starts = date("Y-m-d", strtotime($starts_month . "/" . $starts_day . "/" . $starts_year, current_time("timestamp")));
40
- $expires = date("Y-m-d", strtotime($expires_month . "/" . $expires_day . "/" . $expires_year, current_time("timestamp")));
41
-
42
- //updating or new?
43
- if($saveid > 0)
44
- {
45
- $sqlQuery = "UPDATE $wpdb->pmpro_discount_codes SET code = '" . esc_sql($code) . "', starts = '" . $starts . "', expires = '" . $expires . "', uses = '" . intval($uses) . "' WHERE id = '" . $saveid . "' LIMIT 1";
46
- if($wpdb->query($sqlQuery) !== false)
47
- {
48
- $pmpro_msg = __("Discount code updated successfully.", "pmpro");
49
- $pmpro_msgt = "success";
50
- $saved = true;
51
- $edit = $saveid;
52
- }
53
- else
54
- {
55
- $pmpro_msg = __("Error updating discount code. That code may already be in use.", "pmpro");
56
- $pmpro_msgt = "error";
57
- }
58
- }
59
- else
60
- {
61
- $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes (code, starts, expires, uses) VALUES('" . esc_sql($code) . "', '" . $starts . "', '" . $expires . "', '" . intval($uses) . "')";
62
- if($wpdb->query($sqlQuery) !== false)
63
- {
64
- $pmpro_msg = __("Discount code added successfully.", "pmpro");
65
- $pmpro_msgt = "success";
66
- $saved = true;
67
- $edit = $wpdb->insert_id;
68
- }
69
- else
70
- {
71
- $pmpro_msg = __("Error adding discount code. That code may already be in use.", "pmpro") . $wpdb->last_error;
72
- $pmpro_msgt = "error";
73
- }
74
- }
75
-
76
- //now add the membership level rows
77
- if($saved && $edit > 0)
78
- {
79
- //get the submitted values
80
- $all_levels_a = $_REQUEST['all_levels'];
81
- if(!empty($_REQUEST['levels']))
82
- $levels_a = $_REQUEST['levels'];
83
- else
84
- $levels_a = array();
85
- $initial_payment_a = $_REQUEST['initial_payment'];
86
- if(!empty($_REQUEST['recurring']))
87
- $recurring_a = $_REQUEST['recurring'];
88
- $billing_amount_a = $_REQUEST['billing_amount'];
89
- $cycle_number_a = $_REQUEST['cycle_number'];
90
- $cycle_period_a = $_REQUEST['cycle_period'];
91
- $billing_limit_a = $_REQUEST['billing_limit'];
92
- if(!empty($_REQUEST['custom_trial']))
93
- $custom_trial_a = $_REQUEST['custom_trial'];
94
- $trial_amount_a = $_REQUEST['trial_amount'];
95
- $trial_limit_a = $_REQUEST['trial_limit'];
96
- if(!empty($_REQUEST['expiration']))
97
- $expiration_a = $_REQUEST['expiration'];
98
- $expiration_number_a = $_REQUEST['expiration_number'];
99
- $expiration_period_a = $_REQUEST['expiration_period'];
100
-
101
- //clear the old rows
102
- $sqlQuery = "DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $edit . "'";
103
- $wpdb->query($sqlQuery);
104
-
105
- //add a row for each checked level
106
- if(!empty($levels_a))
107
- {
108
- foreach($levels_a as $level_id)
109
- {
110
- //get the values ready
111
- $n = array_search($level_id, $all_levels_a); //this is the key location of this level's values
112
- $initial_payment = $initial_payment_a[$n];
113
-
114
- //is this recurring?
115
- if(!empty($recurring_a))
116
- {
117
- if(in_array($level_id, $recurring_a))
118
- $recurring = 1;
119
- else
120
- $recurring = 0;
121
- }
122
- else
123
- $recurring = 0;
124
-
125
- if(!empty($recurring))
126
- {
127
- $billing_amount = $billing_amount_a[$n];
128
- $cycle_number = $cycle_number_a[$n];
129
- $cycle_period = $cycle_period_a[$n];
130
- $billing_limit = $billing_limit_a[$n];
131
-
132
- //custom trial
133
- if(!empty($custom_trial_a))
134
- {
135
- if(in_array($level_id, $custom_trial_a))
136
- $custom_trial = 1;
137
- else
138
- $custom_trial = 0;
139
- }
140
- else
141
- $custom_trial = 0;
142
-
143
- if(!empty($custom_trial))
144
- {
145
- $trial_amount = $trial_amount_a[$n];
146
- $trial_limit = $trial_limit_a[$n];
147
- }
148
- else
149
- {
150
- $trial_amount = '';
151
- $trial_limit = '';
152
- }
153
- }
154
- else
155
- {
156
- $billing_amount = '';
157
- $cycle_number = '';
158
- $cycle_period = 'Month';
159
- $billing_limit = '';
160
- $custom_trial = 0;
161
- $trial_amount = '';
162
- $trial_limit = '';
163
- }
164
-
165
- if(!empty($expiration_a))
166
- {
167
- if(in_array($level_id, $expiration_a))
168
- $expiration = 1;
169
- else
170
- $expiration = 0;
171
- }
172
- else
173
- $expiration = 0;
174
-
175
- if(!empty($expiration))
176
- {
177
- $expiration_number = $expiration_number_a[$n];
178
- $expiration_period = $expiration_period_a[$n];
179
- }
180
- else
181
- {
182
- $expiration_number = '';
183
- $expiration_period = 'Month';
184
- }
185
-
186
- //okay, do the insert
187
- $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes_levels (code_id, level_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period) VALUES('" . esc_sql($edit) . "', '" . esc_sql($level_id) . "', '" . (double)esc_sql($initial_payment) . "', '" . (double)esc_sql($billing_amount) . "', '" . intval(esc_sql($cycle_number)) . "', '" . esc_sql($cycle_period) . "', '" . intval(esc_sql($billing_limit)) . "', '" . (double)esc_sql($trial_amount) . "', '" . intval(esc_sql($trial_limit)) . "', '" . intval(esc_sql($expiration_number)) . "', '" . esc_sql($expiration_period) . "')";
188
-
189
- if($wpdb->query($sqlQuery) !== false)
190
- {
191
- //okay
192
- do_action("pmpro_save_discount_code_level", $edit, $level_id);
193
- }
194
- else
195
- {
196
- $level_errors[] = sprintf(__("Error saving values for the %s level.", "pmpro"), $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1"));
197
- }
198
- }
199
- }
200
-
201
- //errors?
202
- if(!empty($level_errors))
203
- {
204
- $pmpro_msg = __("There were errors updating the level values: ", "pmpro") . implode(" ", $level_errors);
205
- $pmpro_msgt = "error";
206
- }
207
- else
208
- {
209
- //all good. set edit = NULL so we go back to the overview page
210
- $edit = NULL;
211
-
212
- do_action("pmpro_save_discount_code", $saveid);
213
- }
214
- }
215
- }
216
-
217
- //are we deleting?
218
- if(!empty($delete))
219
- {
220
- //is this a code?
221
- $code = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
222
- if(!empty($code))
223
- {
224
- //action
225
- do_action("pmpro_delete_discount_code", $delete);
226
-
227
- //delete the code levels
228
- $r1 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $delete . "'");
229
-
230
- if($r1 !== false)
231
- {
232
- //delete the code
233
- $r2 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
234
-
235
- if($r2 !== false)
236
- {
237
- $pmpro_msg = sprintf(__("Code %s deleted successfully.", "pmpro"), $code);
238
- $pmpro_msgt = "success";
239
- }
240
- else
241
- {
242
- $pmpro_msg = __("Error deleting discount code. The code was only partially deleted. Please try again.", "pmpro");
243
- $pmpro_msgt = "error";
244
- }
245
- }
246
- else
247
- {
248
- $pmpro_msg = __("Error deleting code. Please try again.", "pmpro");
249
- $pmpro_msgt = "error";
250
- }
251
- }
252
- else
253
- {
254
- $pmpro_msg = __("Code not found.", "pmpro");
255
- $pmpro_msgt = "error";
256
- }
257
- }
258
-
259
- require_once(dirname(__FILE__) . "/admin_header.php");
260
- ?>
261
-
262
- <?php if($edit) { ?>
263
-
264
- <h2>
265
- <?php
266
- if($edit > 0)
267
- echo __("Edit Discount Code", "pmpro");
268
- else
269
- echo __("Add New Discount Code", "pmpro");
270
- ?>
271
- </h2>
272
-
273
- <?php if(!empty($pmpro_msg)) { ?>
274
- <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
275
- <?php } ?>
276
-
277
- <div>
278
- <?php
279
- // get the code...
280
- if($edit > 0)
281
- {
282
- $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $edit . "' LIMIT 1", OBJECT);
283
- $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
284
- $levels = $wpdb->get_results("SELECT l.id, l.name, cl.initial_payment, cl.billing_amount, cl.cycle_number, cl.cycle_period, cl.billing_limit, cl.trial_amount, cl.trial_limit FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->code . "'");
285
- $temp_id = $code->id;
286
- }
287
- elseif(!empty($copy) && $copy > 0)
288
- {
289
- $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $copy . "' LIMIT 1", OBJECT);
290
- $temp_id = $level->id;
291
- $level->id = NULL;
292
- }
293
-
294
- // didn't find a discount code, let's add a new one...
295
- if(empty($code->id)) $edit = -1;
296
-
297
- //defaults for new codes
298
- if($edit == -1)
299
- {
300
- $code = new stdClass();
301
- $code->code = pmpro_getDiscountCode();
302
- }
303
- ?>
304
- <form action="" method="post">
305
- <input name="saveid" type="hidden" value="<?php echo $edit?>" />
306
- <table class="form-table">
307
- <tbody>
308
- <tr>
309
- <th scope="row" valign="top"><label><?php _e('ID', 'pmpro');?>:</label></th>
310
- <td class="pmpro_lite"><?php if(!empty($code->id)) echo $code->id; else echo __("This will be generated when you save.", "pmpro");?></td>
311
- </tr>
312
-
313
- <tr>
314
- <th scope="row" valign="top"><label for="code"><?php _e('Code', 'pmpro');?>:</label></th>
315
- <td><input name="code" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($code->code))?>" /></td>
316
- </tr>
317
-
318
- <?php
319
- //some vars for the dates
320
- $current_day = date("j");
321
- if(!empty($code->starts))
322
- $selected_starts_day = date("j", $code->starts);
323
- else
324
- $selected_starts_day = $current_day;
325
- if(!empty($code->expires))
326
- $selected_expires_day = date("j", $code->expires);
327
- else
328
- $selected_expires_day = $current_day;
329
-
330
- $current_month = date("M");
331
- if(!empty($code->starts))
332
- $selected_starts_month = date("m", $code->starts);
333
- else
334
- $selected_starts_month = date("m");
335
- if(!empty($code->expires))
336
- $selected_expires_month = date("m", $code->expires);
337
- else
338
- $selected_expires_month = date("m");
339
-
340
- $current_year = date("Y");
341
- if(!empty($code->starts))
342
- $selected_starts_year = date("Y", $code->starts);
343
- else
344
- $selected_starts_year = $current_year;
345
- if(!empty($code->expires))
346
- $selected_expires_year = date("Y", $code->expires);
347
- else
348
- $selected_expires_year = (int)$current_year + 1;
349
- ?>
350
-
351
- <tr>
352
- <th scope="row" valign="top"><label for="starts"><?php _e('Start Date', 'pmpro');?>:</label></th>
353
- <td>
354
- <select name="starts_month">
355
- <?php
356
- for($i = 1; $i < 13; $i++)
357
- {
358
- ?>
359
- <option value="<?php echo $i?>" <?php if($i == $selected_starts_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year, current_time("timestamp")))?></option>
360
- <?php
361
- }
362
- ?>
363
- </select>
364
- <input name="starts_day" type="text" size="2" value="<?php echo $selected_starts_day?>" />
365
- <input name="starts_year" type="text" size="4" value="<?php echo $selected_starts_year?>" />
366
- </td>
367
- </tr>
368
-
369
- <tr>
370
- <th scope="row" valign="top"><label for="expires"><?php _e('Expiration Date', 'pmpro');?>:</label></th>
371
- <td>
372
- <select name="expires_month">
373
- <?php
374
- for($i = 1; $i < 13; $i++)
375
- {
376
- ?>
377
- <option value="<?php echo $i?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year, current_time("timestamp")))?></option>
378
- <?php
379
- }
380
- ?>
381
- </select>
382
- <input name="expires_day" type="text" size="2" value="<?php echo $selected_expires_day?>" />
383
- <input name="expires_year" type="text" size="4" value="<?php echo $selected_expires_year?>" />
384
- </td>
385
- </tr>
386
-
387
- <tr>
388
- <th scope="row" valign="top"><label for="uses"><?php _e('Uses', 'pmpro');?>:</label></th>
389
- <td>
390
- <input name="uses" type="text" size="10" value="<?php if(!empty($code->uses)) echo str_replace("\"", "&quot;", stripslashes($code->uses));?>" />
391
- <small class="pmpro_lite"><?php _e('Leave blank for unlimited uses.', 'pmpro');?></small>
392
- </td>
393
- </tr>
394
-
395
- </tbody>
396
- </table>
397
-
398
- <?php do_action("pmpro_discount_code_after_settings"); ?>
399
-
400
- <h3><?php _e('Which Levels Will This Code Apply To?', 'pmpro'); ?></h3>
401
-
402
- <div class="pmpro_discount_levels">
403
- <?php
404
- $levels = $wpdb->get_results("SELECT * FROM $wpdb->pmpro_membership_levels");
405
- foreach($levels as $level)
406
- {
407
- //if this level is already managed for this discount code, use the code values
408
- if($edit > 0)
409
- {
410
- $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $edit . "' AND cl.level_id = '" . $level->id . "' LIMIT 1");
411
- if($code_level)
412
- {
413
- $level = $code_level;
414
- $level->checked = true;
415
- }
416
- else
417
- $level_checked = false;
418
- }
419
- else
420
- $level_checked = false;
421
- ?>
422
- <div>
423
- <input type="hidden" name="all_levels[]" value="<?php echo $level->id?>" />
424
- <input type="checkbox" name="levels[]" value="<?php echo $level->id?>" <?php if(!empty($level->checked)) { ?>checked="checked"<?php } ?> onclick="if(jQuery(this).is(':checked')) jQuery(this).next().show(); else jQuery(this).next().hide();" />
425
- <?php echo $level->name?>
426
- <div class="pmpro_discount_levels_pricing level_<?php echo $level->id?>" <?php if(empty($level->checked)) { ?>style="display: none;"<?php } ?>>
427
- <table class="form-table">
428
- <tbody>
429
- <tr>
430
- <th scope="row" valign="top"><label for="initial_payment"><?php _e('Initial Payment', 'pmpro');?>:</label></th>
431
- <td><?php echo $pmpro_currency_symbol?><input name="initial_payment[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small><?php _e('The initial amount collected at registration.', 'pmpro');?></small></td>
432
- </tr>
433
-
434
- <tr>
435
- <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'pmpro');?>:</label></th>
436
- <td><input class="recurring_checkbox" name="recurring[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo $level->id?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <small><?php _e('Check if this level has a recurring subscription payment.', 'pmpro');?></small></td>
437
- </tr>
438
-
439
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
440
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Billing Amount', 'pmpro');?>:</label></th>
441
- <td>
442
- <?php echo $pmpro_currency_symbol?><input name="billing_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small>per</small>
443
- <input name="cycle_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
444
- <select name="cycle_period[]" onchange="updateCyclePeriod();">
445
- <?php
446
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
447
- foreach ( $cycles as $name => $value ) {
448
- echo "<option value='$value'";
449
- if ( $level->cycle_period == $value ) echo " selected='selected'";
450
- echo ">$name</option>";
451
- }
452
- ?>
453
- </select>
454
- <br /><small><?php _e('The amount to be billed one cycle after the initial payment.', 'pmpro');?></small>
455
- </td>
456
- </tr>
457
-
458
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
459
- <th scope="row" valign="top"><label for="billing_limit"><?php _e('Billing Cycle Limit', 'pmpro');?>:</label></th>
460
- <td>
461
- <input name="billing_limit[]" type="text" size="20" value="<?php echo $level->billing_limit?>" />
462
- <br /><small><?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.', 'pmpro');?></small>
463
- </td>
464
- </tr>
465
-
466
- <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
467
- <th scope="row" valign="top"><label><?php _e('Custom Trial', 'pmpro');?>:</label></th>
468
- <td><input id="custom_trial_<?php echo $level->id?>" name="custom_trial[]" type="checkbox" value="<?php echo $level->id?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> <?php _e('Check to add a custom trial period.', 'pmpro');?></td>
469
- </tr>
470
-
471
- <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
472
- <th scope="row" valign="top"><label for="trial_amount"><?php _e('Trial Billing Amount', 'pmpro');?>:</label></th>
473
- <td>
474
- <?php echo $pmpro_currency_symbol?><input name="trial_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
475
- <small><?php _e('for the first', 'pmpro');?></small>
476
- <input name="trial_limit[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
477
- <small><?php _e('subscription payments', 'pmpro');?>.</small>
478
- </td>
479
- </tr>
480
-
481
- <tr>
482
- <th scope="row" valign="top"><label><?php _e('Membership Expiration', 'pmpro');?>:</label></th>
483
- <td><input id="expiration" name="expiration[]" type="checkbox" value="<?php echo $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();}" /> <?php _e('Check this to set when membership access expires.', 'pmpro');?></td>
484
- </tr>
485
-
486
- <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
487
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Expires In', 'pmpro');?>:</label></th>
488
- <td>
489
- <input id="expiration_number" name="expiration_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
490
- <select id="expiration_period" name="expiration_period[]">
491
- <?php
492
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
493
- foreach ( $cycles as $name => $value ) {
494
- echo "<option value='$value'";
495
- if ( $level->expiration_period == $value ) echo " selected='selected'";
496
- echo ">$name</option>";
497
- }
498
- ?>
499
- </select>
500
- <br /><small><?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.', 'pmpro');?></small>
501
- </td>
502
- </tr>
503
- </tbody>
504
- </table>
505
-
506
- <?php do_action("pmpro_discount_code_after_level_settings", $edit, $level); ?>
507
-
508
- </div>
509
- </div>
510
- <script>
511
-
512
- </script>
513
- <?php
514
- }
515
- ?>
516
- </div>
517
-
518
- <p class="submit topborder">
519
- <input name="save" type="submit" class="button button-primary" value="Save Code" />
520
- <input name="cancel" type="button" class="button button-secondary" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-discountcodes')?>';" />
521
- </p>
522
- </form>
523
- </div>
524
-
525
- <?php } else { ?>
526
-
527
- <h2>
528
- <?php _e('Memberships Discount Codes', 'pmpro');?>
529
- <a href="admin.php?page=pmpro-discountcodes&edit=-1" class="add-new-h2"><?php _e('Add New Discount Code', 'pmpro');?></a>
530
- </h2>
531
-
532
- <?php if(!empty($pmpro_msg)) { ?>
533
- <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
534
- <?php } ?>
535
-
536
- <form id="posts-filter" method="get" action="">
537
- <p class="search-box">
538
- <label class="screen-reader-text" for="post-search-input"><?php _e('Search Discount Codes', 'pmpro');?>:</label>
539
- <input type="hidden" name="page" value="pmpro-discountcodes" />
540
- <input id="post-search-input" type="text" value="<?php if(!empty($s)) echo $s;?>" name="s" size="30" />
541
- <input class="button" type="submit" value="<?php _e('Search', 'pmpro');?>" id="search-submit "/>
542
- </p>
543
- </form>
544
-
545
- <br class="clear" />
546
- <?php
547
- $sqlQuery = "SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes ";
548
- if(!empty($s))
549
- $sqlQuery .= "WHERE code LIKE '%$s%' ";
550
- $sqlQuery .= "ORDER BY id ASC";
551
-
552
- $codes = $wpdb->get_results($sqlQuery, OBJECT);
553
- ?>
554
- <table class="widefat">
555
- <thead>
556
- <tr>
557
- <th><?php _e('ID', 'pmpro');?></th>
558
- <th><?php _e('Code', 'pmpro');?></th>
559
- <th><?php _e('Starts', 'pmpro');?></th>
560
- <th><?php _e('Expires', 'pmpro');?></th>
561
- <th><?php _e('Uses', 'pmpro');?></th>
562
- <th><?php _e('Levels', 'pmpro');?></th>
563
- <?php do_action("pmpro_discountcodes_extra_cols_header", $codes);?>
564
- <th></th>
565
- <th></th>
566
- </tr>
567
- </thead>
568
- <tbody>
569
- <?php
570
- if(!$codes)
571
- {
572
- ?>
573
- <tr><td colspan="7" class="pmpro_pad20">
574
- <p><?php _e('Discount codes allow you to offer your memberships at discounted prices to select customers.', 'pmpro');?> <a href="admin.php?page=pmpro-discountcodes&edit=-1"><?php _e('Create your first discount code now', 'pmpro');?></a>.</p>
575
- </td></tr>
576
- <?php
577
- }
578
- else
579
- {
580
- foreach($codes as $code)
581
- {
582
- ?>
583
- <tr>
584
- <td><?php echo $code->id?></td>
585
- <td>
586
- <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php echo $code->code?></a>
587
- </td>
588
- <td>
589
- <?php echo date(get_option('date_format'), $code->starts)?>
590
- </td>
591
- <td>
592
- <?php echo date(get_option('date_format'), $code->expires)?>
593
- </td>
594
- <td>
595
- <?php
596
- $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
597
- if($code->uses > 0)
598
- echo "<strong>" . (int)$uses . "</strong>/" . $code->uses;
599
- else
600
- echo "<strong>" . (int)$uses . "</strong>/unlimited";
601
- ?>
602
- </td>
603
- <td>
604
- <?php
605
- $sqlQuery = "SELECT l.id, l.name FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->id . "'";
606
- $levels = $wpdb->get_results($sqlQuery);
607
-
608
- $level_names = array();
609
- foreach($levels as $level)
610
- $level_names[] = "<a target=\"_blank\" href=\"" . pmpro_url("checkout", "?level=" . $level->id . "&discount_code=" . $code->code) . "\">" . $level->name . "</a>";
611
- if($level_names)
612
- echo implode(", ", $level_names);
613
- else
614
- echo "None";
615
- ?>
616
- </td>
617
- <?php do_action("pmpro_discountcodes_extra_cols_body", $code);?>
618
- <td>
619
- <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php _e('edit', 'pmpro');?></a>
620
- </td>
621
- <td>
622
- <a href="javascript:askfirst('<?php printf(__('Are you sure you want to delete the %s discount code? The subscriptions for existing users will not change, but new users will not be able to use this code anymore.', 'pmpro'), $code->code);?>', '?page=pmpro-discountcodes&delete=<?php echo $code->id?>'); void(0);"><?php _e('delete', 'pmpro');?></a>
623
- </td>
624
- </tr>
625
- <?php
626
- }
627
- }
628
- ?>
629
- </tbody>
630
- </table>
631
-
632
- <?php } ?>
633
-
634
- <?php
635
- require_once(dirname(__FILE__) . "/admin_footer.php");
636
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ //only admins can get this
3
+ if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_discountcodes")))
4
+ {
5
+ die("You do not have permissions to perform this action.");
6
+ }
7
+
8
+ //vars
9
+ global $wpdb, $pmpro_currency_symbol;
10
+
11
+ if(isset($_REQUEST['edit']))
12
+ $edit = $_REQUEST['edit'];
13
+ else
14
+ $edit = false;
15
+
16
+ if(isset($_REQUEST['delete']))
17
+ $delete = $_REQUEST['delete'];
18
+ else
19
+ $delete = false;
20
+
21
+ if(isset($_REQUEST['saveid']))
22
+ $saveid = $_POST['saveid'];
23
+ else
24
+ $saveid = false;
25
+
26
+ if($saveid)
27
+ {
28
+ //get vars
29
+ $code = $_POST['code'];
30
+ $starts_month = $_POST['starts_month'];
31
+ $starts_day = $_POST['starts_day'];
32
+ $starts_year = $_POST['starts_year'];
33
+ $expires_month = $_POST['expires_month'];
34
+ $expires_day = $_POST['expires_day'];
35
+ $expires_year = $_POST['expires_year'];
36
+ $uses = $_POST['uses'];
37
+
38
+ //fix up dates
39
+ $starts = date("Y-m-d", strtotime($starts_month . "/" . $starts_day . "/" . $starts_year));
40
+ $expires = date("Y-m-d", strtotime($expires_month . "/" . $expires_day . "/" . $expires_year));
41
+
42
+ //updating or new?
43
+ if($saveid > 0)
44
+ {
45
+ $sqlQuery = "UPDATE $wpdb->pmpro_discount_codes SET code = '" . $wpdb->escape($code) . "', starts = '" . $starts . "', expires = '" . $expires . "', uses = '" . intval($uses) . "' WHERE id = '" . $saveid . "' LIMIT 1";
46
+ if($wpdb->query($sqlQuery) !== false)
47
+ {
48
+ $pmpro_msg = "Discount code updated successfully.";
49
+ $pmpro_msgt = "success";
50
+ $saved = true;
51
+ $edit = $saveid;
52
+ }
53
+ else
54
+ {
55
+ $pmpro_msg = "Error updating discount code. That code may already be in use.";
56
+ $pmpro_msgt = "error";
57
+ }
58
+ }
59
+ else
60
+ {
61
+ $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes (code, starts, expires, uses) VALUES('" . $wpdb->escape($code) . "', '" . $starts . "', '" . $expires . "', '" . intval($uses) . "')";
62
+ if($wpdb->query($sqlQuery) !== false)
63
+ {
64
+ $pmpro_msg = "Discount code added successfully.";
65
+ $pmpro_msgt = "success";
66
+ $saved = true;
67
+ $edit = $wpdb->insert_id;
68
+ }
69
+ else
70
+ {
71
+ $pmpro_msg = "Error adding discount code. That code may already be in use." . $wpdb->last_error;
72
+ $pmpro_msgt = "error";
73
+ }
74
+ }
75
+
76
+ //now add the membership level rows
77
+ if($saved && $edit > 0)
78
+ {
79
+ //get the submitted values
80
+ $all_levels_a = $_REQUEST['all_levels'];
81
+ if(!empty($_REQUEST['levels']))
82
+ $levels_a = $_REQUEST['levels'];
83
+ else
84
+ $levels_a = array();
85
+ $initial_payment_a = $_REQUEST['initial_payment'];
86
+ if(!empty($_REQUEST['recurring']))
87
+ $recurring_a = $_REQUEST['recurring'];
88
+ $billing_amount_a = $_REQUEST['billing_amount'];
89
+ $cycle_number_a = $_REQUEST['cycle_number'];
90
+ $cycle_period_a = $_REQUEST['cycle_period'];
91
+ $billing_limit_a = $_REQUEST['billing_limit'];
92
+ if(!empty($_REQUEST['custom_trial']))
93
+ $custom_trial_a = $_REQUEST['custom_trial'];
94
+ $trial_amount_a = $_REQUEST['trial_amount'];
95
+ $trial_limit_a = $_REQUEST['trial_limit'];
96
+ if(!empty($_REQUEST['expiration']))
97
+ $expiration_a = $_REQUEST['expiration'];
98
+ $expiration_number_a = $_REQUEST['expiration_number'];
99
+ $expiration_period_a = $_REQUEST['expiration_period'];
100
+
101
+ //clear the old rows
102
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $edit . "'";
103
+ $wpdb->query($sqlQuery);
104
+
105
+ //add a row for each checked level
106
+ if(!empty($levels_a))
107
+ {
108
+ foreach($levels_a as $level_id)
109
+ {
110
+ //get the values ready
111
+ $n = array_search($level_id, $all_levels_a); //this is the key location of this level's values
112
+ $initial_payment = $initial_payment_a[$n];
113
+
114
+ //is this recurring?
115
+ if(!empty($recurring_a))
116
+ {
117
+ if(in_array($level_id, $recurring_a))
118
+ $recurring = 1;
119
+ else
120
+ $recurring = 0;
121
+ }
122
+ else
123
+ $recurring = 0;
124
+
125
+ if(!empty($recurring))
126
+ {
127
+ $billing_amount = $billing_amount_a[$n];
128
+ $cycle_number = $cycle_number_a[$n];
129
+ $cycle_period = $cycle_period_a[$n];
130
+ $billing_limit = $billing_limit_a[$n];
131
+
132
+ //custom trial
133
+ if(!empty($custom_trial_a))
134
+ {
135
+ if(in_array($level_id, $custom_trial_a))
136
+ $custom_trial = 1;
137
+ else
138
+ $custom_trial = 0;
139
+ }
140
+ else
141
+ $custom_trial = 0;
142
+
143
+ if(!empty($custom_trial))
144
+ {
145
+ $trial_amount = $trial_amount_a[$n];
146
+ $trial_limit = $trial_limit_a[$n];
147
+ }
148
+ else
149
+ {
150
+ $trial_amount = '';
151
+ $trial_limit = '';
152
+ }
153
+ }
154
+ else
155
+ {
156
+ $billing_amount = '';
157
+ $cycle_number = '';
158
+ $cycle_period = 'Month';
159
+ $billing_limit = '';
160
+ $custom_trial = 0;
161
+ $trial_amount = '';
162
+ $trial_limit = '';
163
+ }
164
+
165
+ if(!empty($expiration_a))
166
+ {
167
+ if(in_array($level_id, $expiration_a))
168
+ $expiration = 1;
169
+ else
170
+ $expiration = 0;
171
+ }
172
+ else
173
+ $expiration = 0;
174
+
175
+ if(!empty($expiration))
176
+ {
177
+ $expiration_number = $expiration_number_a[$n];
178
+ $expiration_period = $expiration_period_a[$n];
179
+ }
180
+ else
181
+ {
182
+ $expiration_number = '';
183
+ $expiration_period = 'Month';
184
+ }
185
+
186
+ //okay, do the insert
187
+ $sqlQuery = "INSERT INTO $wpdb->pmpro_discount_codes_levels (code_id, level_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period) VALUES('" . $wpdb->escape($edit) . "', '" . $wpdb->escape($level_id) . "', '" . (double)$wpdb->escape($initial_payment) . "', '" . (double)$wpdb->escape($billing_amount) . "', '" . intval($wpdb->escape($cycle_number)) . "', '" . $wpdb->escape($cycle_period) . "', '" . intval($wpdb->escape($billing_limit)) . "', '" . (double)$wpdb->escape($trial_amount) . "', '" . intval($wpdb->escape($trial_limit)) . "', '" . intval($wpdb->escape($expiration_number)) . "', '" . $wpdb->escape($expiration_period) . "')";
188
+
189
+ if($wpdb->query($sqlQuery) !== false)
190
+ {
191
+ //okay
192
+ do_action("pmpro_save_discount_code_level", $saveid, $level_id);
193
+ }
194
+ else
195
+ {
196
+ $level_errors[] = "Error saving values for the " . $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1") . " level.";
197
+ }
198
+ }
199
+ }
200
+
201
+ //errors?
202
+ if(!empty($level_errors))
203
+ {
204
+ $pmpro_msg = "There were errors updating the level values: " . implode(" ", $level_errors);
205
+ $pmpro_msgt = "error";
206
+ }
207
+ else
208
+ {
209
+ //all good. set edit = NULL so we go back to the overview page
210
+ $edit = NULL;
211
+
212
+ do_action("pmpro_save_discount_code", $saveid);
213
+ }
214
+ }
215
+ }
216
+
217
+ //are we deleting?
218
+ if(!empty($delete))
219
+ {
220
+ //is this a code?
221
+ $code = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
222
+ if(!empty($code))
223
+ {
224
+ //delete the code levels
225
+ $r1 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes_levels WHERE code_id = '" . $delete . "'");
226
+
227
+ if($r1 !== false)
228
+ {
229
+ //delete the code
230
+ $r2 = $wpdb->query("DELETE FROM $wpdb->pmpro_discount_codes WHERE id = '" . $delete . "' LIMIT 1");
231
+
232
+ if($r2 !== false)
233
+ {
234
+ $pmpro_msg = "Code $code deleted successfully.";
235
+ $pmpro_msgt = "success";
236
+ }
237
+ else
238
+ {
239
+ $pmpro_msg = "Error deleting discount code. The code was only partially deleted. Please try again.";
240
+ $pmpro_msgt = "error";
241
+ }
242
+ }
243
+ else
244
+ {
245
+ $pmpro_msg = "Error deleting code. Please try again.";
246
+ $pmpro_msgt = "error";
247
+ }
248
+ }
249
+ else
250
+ {
251
+ $pmpro_msg = "Code not found.";
252
+ $pmpro_msgt = "error";
253
+ }
254
+ }
255
+ ?>
256
+ <div class="wrap pmpro_admin">
257
+ <div class="pmpro_banner">
258
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
259
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
260
+
261
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
262
+ </div>
263
+ <br style="clear:both;" />
264
+
265
+ <?php
266
+ //include(pmpro_https_filter("http://www.paidmembershipspro.com/notifications/?v=" . PMPRO_VERSION));
267
+ ?>
268
+ <div id="pmpro_notifications">
269
+ </div>
270
+ <script>
271
+ jQuery.get('<?php echo pmpro_https_filter("http://www.paidmembershipspro.com/notifications/?v=" . PMPRO_VERSION)?>', function(data) {
272
+ jQuery('#pmpro_notifications').html(data);
273
+ });
274
+ </script>
275
+
276
+ <?php if($edit) { ?>
277
+
278
+ <h2>
279
+ <?php
280
+ if($edit > 0)
281
+ echo "Edit Discount Code";
282
+ else
283
+ echo "Add New Discount Code";
284
+ ?>
285
+ </h2>
286
+
287
+ <?php if(!empty($pmpro_msg)) { ?>
288
+ <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
289
+ <?php } ?>
290
+
291
+ <div>
292
+ <?php
293
+ // get the code...
294
+ if($edit > 0)
295
+ {
296
+ $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $edit . "' LIMIT 1", OBJECT);
297
+ $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
298
+ $levels = $wpdb->get_results("SELECT l.id, l.name, cl.initial_payment, cl.billing_amount, cl.cycle_number, cl.period, cl.billing_limit, cl.trial_amount, cl.trial_limit FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->code . "'");
299
+ $temp_id = $code->id;
300
+ }
301
+ elseif(!empty($copy) && $copy > 0)
302
+ {
303
+ $code = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE id = '" . $copy . "' LIMIT 1", OBJECT);
304
+ $temp_id = $level->id;
305
+ $level->id = NULL;
306
+ }
307
+
308
+ // didn't find a discount code, let's add a new one...
309
+ if(empty($code->id)) $edit = -1;
310
+
311
+ //defaults for new codes
312
+ if($edit == -1)
313
+ {
314
+ $code = new stdClass();
315
+ $code->code = pmpro_getDiscountCode();
316
+ }
317
+ ?>
318
+ <form action="" method="post">
319
+ <input name="saveid" type="hidden" value="<?php echo $edit?>" />
320
+ <table class="form-table">
321
+ <tbody>
322
+ <tr>
323
+ <th scope="row" valign="top"><label>ID:</label></th>
324
+ <td class="pmpro_lite"><?php if(!empty($code->id)) echo $code->id; else echo "This will be generated when you save.";?></td>
325
+ </tr>
326
+
327
+ <tr>
328
+ <th scope="row" valign="top"><label for="code">Code:</label></th>
329
+ <td><input name="code" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($code->code))?>" /></td>
330
+ </tr>
331
+
332
+ <?php
333
+ //some vars for the dates
334
+ $current_day = date("j");
335
+ if(!empty($code->starts))
336
+ $selected_starts_day = date("j", $code->starts);
337
+ else
338
+ $selected_starts_day = $current_day;
339
+ if(!empty($code->expires))
340
+ $selected_expires_day = date("j", $code->expires);
341
+ else
342
+ $selected_expires_day = $current_day;
343
+
344
+ $current_month = date("M");
345
+ if(!empty($code->starts))
346
+ $selected_starts_month = date("m", $code->starts);
347
+ else
348
+ $selected_starts_month = date("m");
349
+ if(!empty($code->expires))
350
+ $selected_expires_month = date("m", $code->expires);
351
+ else
352
+ $selected_expires_month = date("m");
353
+
354
+ $current_year = date("Y");
355
+ if(!empty($code->starts))
356
+ $selected_starts_year = date("Y", $code->starts);
357
+ else
358
+ $selected_starts_year = $current_year;
359
+ if(!empty($code->expires))
360
+ $selected_expires_year = date("Y", $code->expires);
361
+ else
362
+ $selected_expires_year = (int)$current_year + 1;
363
+ ?>
364
+
365
+ <tr>
366
+ <th scope="row" valign="top"><label for="starts">Start Date:</label></th>
367
+ <td>
368
+ <select name="starts_month">
369
+ <?php
370
+ for($i = 1; $i < 13; $i++)
371
+ {
372
+ ?>
373
+ <option value="<?php echo $i?>" <?php if($i == $selected_starts_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year))?></option>
374
+ <?php
375
+ }
376
+ ?>
377
+ </select>
378
+ <input name="starts_day" type="text" size="2" value="<?php echo $selected_starts_day?>" />
379
+ <input name="starts_year" type="text" size="4" value="<?php echo $selected_starts_year?>" />
380
+ </td>
381
+ </tr>
382
+
383
+ <tr>
384
+ <th scope="row" valign="top"><label for="expires">Expiration Date:</label></th>
385
+ <td>
386
+ <select name="expires_month">
387
+ <?php
388
+ for($i = 1; $i < 13; $i++)
389
+ {
390
+ ?>
391
+ <option value="<?php echo $i?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year))?></option>
392
+ <?php
393
+ }
394
+ ?>
395
+ </select>
396
+ <input name="expires_day" type="text" size="2" value="<?php echo $selected_expires_day?>" />
397
+ <input name="expires_year" type="text" size="4" value="<?php echo $selected_expires_year?>" />
398
+ </td>
399
+ </tr>
400
+
401
+ <tr>
402
+ <th scope="row" valign="top"><label for="uses">Uses:</label></th>
403
+ <td>
404
+ <input name="uses" type="text" size="10" value="<?php if(!empty($code->uses)) echo str_replace("\"", "&quot;", stripslashes($code->uses));?>" />
405
+ <small class="pmpro_lite">Leave blank for unlimited uses.</small>
406
+ </td>
407
+ </tr>
408
+
409
+ </tbody>
410
+ </table>
411
+
412
+ <?php do_action("pmpro_discount_code_after_settings"); ?>
413
+
414
+ <h3>Which Levels Will This Code Apply To?</h3>
415
+
416
+ <div class="pmpro_discount_levels">
417
+ <?php
418
+ $levels = $wpdb->get_results("SELECT * FROM $wpdb->pmpro_membership_levels");
419
+ foreach($levels as $level)
420
+ {
421
+ //if this level is already managed for this discount code, use the code values
422
+ if($edit > 0)
423
+ {
424
+ $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $edit . "' AND cl.level_id = '" . $level->id . "' LIMIT 1");
425
+ if($code_level)
426
+ {
427
+ $level = $code_level;
428
+ $level->checked = true;
429
+ }
430
+ else
431
+ $level_checked = false;
432
+ }
433
+ else
434
+ $level_checked = false;
435
+ ?>
436
+ <div>
437
+ <input type="hidden" name="all_levels[]" value="<?php echo $level->id?>" />
438
+ <input type="checkbox" name="levels[]" value="<?php echo $level->id?>" <?php if(!empty($level->checked)) { ?>checked="checked"<?php } ?> onclick="if(jQuery(this).is(':checked')) jQuery(this).next().show(); else jQuery(this).next().hide();" />
439
+ <?php echo $level->name?>
440
+ <div class="pmpro_discount_levels_pricing level_<?php echo $level->id?>" <?php if(empty($level->checked)) { ?>style="display: none;"<?php } ?>>
441
+ <table class="form-table">
442
+ <tbody>
443
+ <tr>
444
+ <th scope="row" valign="top"><label for="initial_payment">Initial Payment:</label></th>
445
+ <td><?php echo $pmpro_currency_symbol?><input name="initial_payment[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small>The initial amount collected at registration.</small></td>
446
+ </tr>
447
+
448
+ <tr>
449
+ <th scope="row" valign="top"><label>Recurring Subscription:</label></th>
450
+ <td><input class="recurring_checkbox" name="recurring[]" type="checkbox" value="<?php echo $level->id?>" <?php if(pmpro_isLevelRecurring($level)) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) { jQuery(this).parent().parent().siblings('.recurring_info').show(); if(!jQuery('#custom_trial_<?php echo $level->id?>').is(':checked')) jQuery(this).parent().parent().siblings('.trial_info').hide();} else jQuery(this).parent().parent().siblings('.recurring_info').hide();" /> <small>Check if this level has a recurring subscription payment.</small></td>
451
+ </tr>
452
+
453
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
454
+ <th scope="row" valign="top"><label for="billing_amount">Billing Amount:</label></th>
455
+ <td>
456
+ <?php echo $pmpro_currency_symbol?><input name="billing_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small>per</small>
457
+ <input name="cycle_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
458
+ <select name="cycle_period[]" onchange="updateCyclePeriod();">
459
+ <?php
460
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
461
+ foreach ( $cycles as $name => $value ) {
462
+ echo "<option value='$value'";
463
+ if ( $level->cycle_period == $value ) echo " selected='selected'";
464
+ echo ">$name</option>";
465
+ }
466
+ ?>
467
+ </select>
468
+ <br /><small>The amount to be billed one cycle after the initial payment.</small>
469
+ </td>
470
+ </tr>
471
+
472
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
473
+ <th scope="row" valign="top"><label for="billing_limit">Billing Cycle Limit:</label></th>
474
+ <td>
475
+ <input name="billing_limit[]" type="text" size="20" value="<?php echo $level->billing_limit?>" />
476
+ <br /><small>The <strong>total</strong> number of billing cycles for this level, including the trial period (if applicable). Set to zero if membership is indefinite.</small>
477
+ </td>
478
+ </tr>
479
+
480
+ <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
481
+ <th scope="row" valign="top"><label>Custom Trial:</label></th>
482
+ <td><input id="custom_trial_<?php echo $level->id?>" name="custom_trial[]" type="checkbox" value="<?php echo $level->id?>" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="if(jQuery(this).attr('checked')) jQuery(this).parent().parent().siblings('.trial_info').show(); else jQuery(this).parent().parent().siblings('.trial_info').hide();" /> Check to add a custom trial period.</td>
483
+ </tr>
484
+
485
+ <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
486
+ <th scope="row" valign="top"><label for="trial_amount">Trial Billing Amount:</label></th>
487
+ <td>
488
+ <?php echo $pmpro_currency_symbol?><input name="trial_amount[]" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
489
+ <small>for the first</small>
490
+ <input name="trial_limit[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
491
+ <small>subscription payments.</small>
492
+ </td>
493
+ </tr>
494
+
495
+ <tr>
496
+ <th scope="row" valign="top"><label>Membership Expiration:</label></th>
497
+ <td><input id="expiration" name="expiration[]" type="checkbox" value="<?php echo $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();}" /> <small>Check this to set an expiration date for new sign ups.</small></td>
498
+ </tr>
499
+
500
+ <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
501
+ <th scope="row" valign="top"><label for="billing_amount">Expire In:</label></th>
502
+ <td>
503
+ <input id="expiration_number" name="expiration_number[]" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
504
+ <select id="expiration_period" name="expiration_period[]">
505
+ <?php
506
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
507
+ foreach ( $cycles as $name => $value ) {
508
+ echo "<option value='$value'";
509
+ if ( $level->expiration_period == $value ) echo " selected='selected'";
510
+ echo ">$name</option>";
511
+ }
512
+ ?>
513
+ </select>
514
+ <br /><small>How long before the expiration expires. Not that any future payments will be canceled when the membership expires.</small>
515
+ </td>
516
+ </tr>
517
+ </tbody>
518
+ </table>
519
+
520
+ <?php do_action("pmpro_discount_code_after_level_settings", $edit, $level); ?>
521
+
522
+ </div>
523
+ </div>
524
+ <script>
525
+
526
+ </script>
527
+ <?php
528
+ }
529
+ ?>
530
+ </div>
531
+
532
+ <p class="submit topborder">
533
+ <input name="save" type="submit" class="button-primary" value="Save Code" />
534
+ <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-discountcodes')?>';" />
535
+ </p>
536
+ </form>
537
+ </div>
538
+
539
+ <?php } else { ?>
540
+
541
+ <h2>
542
+ Memberships Discount Codes
543
+ <a href="admin.php?page=pmpro-discountcodes&edit=-1" class="button add-new-h2">Add New Discount Code</a>
544
+ </h2>
545
+
546
+ <?php if(!empty($pmpro_msg)) { ?>
547
+ <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
548
+ <?php } ?>
549
+
550
+ <form id="posts-filter" method="get" action="">
551
+ <p class="search-box">
552
+ <label class="screen-reader-text" for="post-search-input">Search Discount Codes:</label>
553
+ <input type="hidden" name="page" value="pmpro-discountcodes" />
554
+ <input id="post-search-input" type="text" value="<?php if(!empty($s)) echo $s;?>" name="s" size="30" />
555
+ <input class="button" type="submit" value="Search" id="search-submit "/>
556
+ </p>
557
+ </form>
558
+
559
+ <br class="clear" />
560
+
561
+ <table class="widefat">
562
+ <thead>
563
+ <tr>
564
+ <th>ID</th>
565
+ <th>Code</th>
566
+ <th>Starts</th>
567
+ <th>Expires</th>
568
+ <th>Uses</th>
569
+ <th>Levels</th>
570
+ <th></th>
571
+ <th></th>
572
+ </tr>
573
+ </thead>
574
+ <tbody>
575
+ <?php
576
+ $sqlQuery = "SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes ";
577
+ if(!empty($s))
578
+ $sqlQuery .= "WHERE code LIKE '%$s%' ";
579
+ $sqlQuery .= "ORDER BY id ASC";
580
+
581
+ $codes = $wpdb->get_results($sqlQuery, OBJECT);
582
+
583
+ if(!$codes)
584
+ {
585
+ ?>
586
+ <tr><td colspan="7" class="pmpro_pad20">
587
+ <p>Discount codes allow you to offer your memberships at discounted prices to select customers. <a href="admin.php?page=pmpro-discountcodes&edit=-1">Create your first discount code now</a>.</p>
588
+ </td></tr>
589
+ <?php
590
+ }
591
+ else
592
+ {
593
+ foreach($codes as $code)
594
+ {
595
+ ?>
596
+ <tr>
597
+ <td><?php echo $code->id?></td>
598
+ <td>
599
+ <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>"><?php echo $code->code?></a>
600
+ </td>
601
+ <td>
602
+ <?php echo date(get_option('date_format'), $code->starts)?>
603
+ </td>
604
+ <td>
605
+ <?php echo date(get_option('date_format'), $code->expires)?>
606
+ </td>
607
+ <td>
608
+ <?php
609
+ $uses = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $code->id . "'");
610
+ if($code->uses > 0)
611
+ echo "<strong>" . (int)$uses . "</strong>/" . $code->uses;
612
+ else
613
+ echo "<strong>" . (int)$uses . "</strong>/unlimited";
614
+ ?>
615
+ </td>
616
+ <td>
617
+ <?php
618
+ $sqlQuery = "SELECT l.id, l.name FROM $wpdb->pmpro_membership_levels l LEFT JOIN $wpdb->pmpro_discount_codes_levels cl ON l.id = cl.level_id WHERE cl.code_id = '" . $code->id . "'";
619
+ $levels = $wpdb->get_results($sqlQuery);
620
+
621
+ $level_names = array();
622
+ foreach($levels as $level)
623
+ $level_names[] = "<a target=\"_blank\" href=\"" . pmpro_url("checkout", "?level=" . $level->id . "&discount_code=" . $code->code) . "\">" . $level->name . "</a>";
624
+ if($level_names)
625
+ echo implode(", ", $level_names);
626
+ else
627
+ echo "None";
628
+ ?>
629
+ </td>
630
+ <td>
631
+ <a href="?page=pmpro-discountcodes&edit=<?php echo $code->id?>">edit</a>
632
+ </td>
633
+ <td>
634
+ <a href="javascript:askfirst('Are you sure you want to delete the <?php echo $code->code?> discount code? The subscriptions for existing users will not change, but new users will not be able to use this code anymore.', '?page=pmpro-discountcodes&delete=<?php echo $code->id?>'); void(0);">delete</a>
635
+ </td>
636
+ </tr>
637
+ <?php
638
+ }
639
+ }
640
+ ?>
641
+ </tbody>
642
+ </table>
643
+
644
+ <?php } ?>
645
+
646
+ </div>
647
+ <?php
648
+ ?>
adminpages/emailsettings.php CHANGED
@@ -1,181 +1,152 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_emailsettings")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $msg, $msgt;
9
-
10
- //get/set settings
11
- global $pmpro_pages;
12
- if(!empty($_REQUEST['savesettings']))
13
- {
14
- //email options
15
- pmpro_setOption("from_email");
16
- pmpro_setOption("from_name");
17
- pmpro_setOption("only_filter_pmpro_emails");
18
-
19
- pmpro_setOption("email_admin_checkout");
20
- pmpro_setOption("email_admin_changes");
21
- pmpro_setOption("email_admin_cancels");
22
- pmpro_setOption("email_admin_billing");
23
-
24
- pmpro_setOption("email_member_notification");
25
-
26
- //assume success
27
- $msg = true;
28
- $msgt = "Your email settings have been updated.";
29
- }
30
-
31
- $from_email = pmpro_getOption("from_email");
32
- $from_name = pmpro_getOption("from_name");
33
- $only_filter_pmpro_emails = pmpro_getOption("only_filter_pmpro_emails");
34
-
35
- $email_admin_checkout = pmpro_getOption("email_admin_checkout");
36
- $email_admin_changes = pmpro_getOption("email_admin_changes");
37
- $email_admin_cancels = pmpro_getOption("email_admin_cancels");
38
- $email_admin_billing = pmpro_getOption("email_admin_billing");
39
-
40
- $email_member_notification = pmpro_getOption("email_member_notification");
41
-
42
- if(empty($from_email))
43
- {
44
- $parsed = parse_url(home_url());
45
- $hostname = $parsed[host];
46
- $hostparts = split("\.", $hostname);
47
- $email_domain = $hostparts[count($hostparts) - 2] . "." . $hostparts[count($hostparts) - 1];
48
- $from_email = "wordpress@" . $email_domain;
49
- pmpro_setOption("from_email", $from_email);
50
- }
51
-
52
- if(empty($from_name))
53
- {
54
- $from_name = "WordPress";
55
- pmpro_setOption("from_name", $from_name);
56
- }
57
-
58
- // default from email wordpress@sitename
59
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
60
- if ( substr( $sitename, 0, 4 ) == 'www.' ) {
61
- $sitename = substr( $sitename, 4 );
62
- }
63
- $default_from_email = 'wordpress@' . $sitename;
64
-
65
- require_once(dirname(__FILE__) . "/admin_header.php");
66
- ?>
67
-
68
- <form action="" method="post" enctype="multipart/form-data">
69
- <h2><?php _e('Email Settings', 'pmpro');?></h2>
70
- <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.', 'pmpro');?></p>
71
-
72
- <p><?php _e('To modify the appearance of system generated emails, add the files <em>email_header.html</em> and <em>email_footer.html</em> to your theme\'s directory. This will modify both the WordPress default messages as well as messages generated by Paid Memberships Pro. <a title="Paid Memberships Pro - Member Communications" target="_blank" href="http://www.paidmembershipspro.com/documentation/member-communications/">Click here to learn more about Paid Memberships Pro emails</a>.', 'pmpro');?></p>
73
-
74
- <table class="form-table">
75
- <tbody>
76
- <tr>
77
- <th scope="row" valign="top">
78
- <label for="from_email"><?php _e('From Email', 'pmpro');?>:</label>
79
- </th>
80
- <td>
81
- <input type="text" name="from_email" size="60" value="<?php echo $from_email?>" />
82
- </td>
83
- </tr>
84
- <tr>
85
- <th scope="row" valign="top">
86
- <label for="from_name"><?php _e('From Name', 'pmpro');?>:</label>
87
- </th>
88
- <td>
89
- <input type="text" name="from_name" size="60" value="<?php echo $from_name?>" />
90
- </td>
91
- </tr>
92
- <tr>
93
- <th scope="row" valign="top">
94
- <label for="only_filter_pmpro_emails"><?php _e('Only Filter PMPro Emails?', 'pmpro');?>:</label>
95
- </th>
96
- <td>
97
- <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 } ?> />
98
- <?php _e('If unchecked, all emails from "WordPress &lt;' . $default_from_email . '&gt;" will be filtered to use the above settings.', 'pmpro');?>
99
- </td>
100
- </tr>
101
- </tbody>
102
- </table>
103
-
104
- <?php /* going to put something like this here in next version
105
- <h3><?php _e('Modify System-generated Email Templates', 'pmpro');?>:</h3>
106
- <?php
107
- if (function_exists('pmproet_scripts'))
108
- {
109
- _e('You have installed the PMPro Email Templates add on. <a href="' . admin_url('admin.php?page=pmpro-email-templates') . '">Click here to modify email templates</a>');
110
- }
111
- ?>
112
- <p><?php _e('To modify the subject line and body content of system generated emails, <a title="Paid Memberships Pro - Email Templates Plugin" target="_blank" href="' . wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=pmpro-email-templates-addon'), 'install-plugin_pmpro-email-templates-addon') . '">Install and Activate the PMPro Email Templates add on</a>.', 'pmpro'); ?></p>
113
- */ ?>
114
-
115
- <h3><?php _e('Send the site admin emails', 'pmpro');?>:</h3>
116
-
117
- <table class="form-table">
118
- <tbody>
119
- <tr>
120
- <th scope="row" valign="top">
121
- <label for="email_admin_checkout"><?php _e('Checkout', 'pmpro');?>:</label>
122
- </th>
123
- <td>
124
- <input type="checkbox" id="email_admin_checkout" name="email_admin_checkout" value="1" <?php if(!empty($email_admin_checkout)) { ?>checked="checked"<?php } ?> />
125
- <?php _e('when a member checks out.', 'pmpro');?>
126
- </td>
127
- </tr>
128
- <tr>
129
- <th scope="row" valign="top">
130
- <label for="email_admin_changes"><?php _e('Admin Changes', 'pmpro');?>:</label>
131
- </th>
132
- <td>
133
- <input type="checkbox" id="email_admin_changes" name="email_admin_changes" value="1" <?php if(!empty($email_admin_changes)) { ?>checked="checked"<?php } ?> />
134
- <?php _e('when an admin changes a user\'s membership level through the dashboard.', 'pmpro');?>
135
- </td>
136
- </tr>
137
- <tr>
138
- <th scope="row" valign="top">
139
- <label for="email_admin_cancels"><?php _e('Cancellation', 'pmpro');?>:</label>
140
- </th>
141
- <td>
142
- <input type="checkbox" id="email_admin_cancels" name="email_admin_cancels" value="1" <?php if(!empty($email_admin_cancels)) { ?>checked="checked"<?php } ?> />
143
- <?php _e('when a user cancels his or her account.', 'pmpro');?>
144
- </td>
145
- </tr>
146
- <tr>
147
- <th scope="row" valign="top">
148
- <label for="email_admin_billing"><?php _e('Bill Updates', 'pmpro');?>:</label>
149
- </th>
150
- <td>
151
- <input type="checkbox" id="email_admin_billing" name="email_admin_billing" value="1" <?php if(!empty($email_admin_billing)) { ?>checked="checked"<?php } ?> />
152
- <?php _e('when a user updates his or her billing information.', 'pmpro');?>
153
- </td>
154
- </tr>
155
- </tbody>
156
- </table>
157
-
158
- <h3><?php _e('Send members emails', 'pmpro');?>:</h3>
159
-
160
- <table class="form-table">
161
- <tbody>
162
- <tr>
163
- <th scope="row" valign="top">
164
- <label for="email_admin_checkout"><?php _e('New Users', 'pmpro');?>:</label>
165
- </th>
166
- <td>
167
- <input type="checkbox" id="email_member_notification" name="email_member_notification" value="1" <?php if(!empty($email_member_notification)) { ?>checked="checked"<?php } ?> />
168
- <?php _e('Default WP notification email. (Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout.)', 'pmpro');?>
169
- </td>
170
- </tr>
171
- </tbody>
172
- </table>
173
-
174
- <p class="submit">
175
- <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
176
- </p>
177
- </form>
178
-
179
- <?php
180
- require_once(dirname(__FILE__) . "/admin_footer.php");
181
- ?>
1
+ <?php
2
+ //only admins can get this
3
+ if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_emailsettings")))
4
+ {
5
+ die("You do not have permissions to perform this action.");
6
+ }
7
+
8
+ global $wpdb, $msg, $msgt;
9
+
10
+ //get/set settings
11
+ global $pmpro_pages;
12
+ if(!empty($_REQUEST['savesettings']))
13
+ {
14
+ //email options
15
+ pmpro_setOption("from_email");
16
+ pmpro_setOption("from_name");
17
+
18
+ pmpro_setOption("email_admin_checkout");
19
+ pmpro_setOption("email_admin_changes");
20
+ pmpro_setOption("email_admin_cancels");
21
+ pmpro_setOption("email_admin_billing");
22
+
23
+ pmpro_setOption("email_member_notification");
24
+
25
+ //assume success
26
+ $msg = true;
27
+ $msgt = "Your email settings have been updated.";
28
+ }
29
+
30
+ $from_email = pmpro_getOption("from_email");
31
+ $from_name = pmpro_getOption("from_name");
32
+
33
+ $email_admin_checkout = pmpro_getOption("email_admin_checkout");
34
+ $email_admin_changes = pmpro_getOption("email_admin_changes");
35
+ $email_admin_cancels = pmpro_getOption("email_admin_cancels");
36
+ $email_admin_billing = pmpro_getOption("email_admin_billing");
37
+
38
+ $email_member_notification = pmpro_getOption("email_member_notification");
39
+
40
+ if(empty($from_email))
41
+ {
42
+ $parsed = parse_url(home_url());
43
+ $hostname = $parsed[host];
44
+ $hostparts = split("\.", $hostname);
45
+ $email_domain = $hostparts[count($hostparts) - 2] . "." . $hostparts[count($hostparts) - 1];
46
+ $from_email = "wordpress@" . $email_domain;
47
+ pmpro_setOption("from_email", $from_email);
48
+ }
49
+
50
+ if(empty($from_name))
51
+ {
52
+ $from_name = "WordPress";
53
+ pmpro_setOption("from_name", $from_name);
54
+ }
55
+
56
+ require_once(dirname(__FILE__) . "/admin_header.php");
57
+ ?>
58
+
59
+ <form action="" method="post" enctype="multipart/form-data">
60
+ <h2>Email Settings</h2>
61
+ <p>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.</p>
62
+
63
+ <p>To modify the appearance of system generated emails, add the files <em>email_header.html</em> and <em>email_footer.html</em> to your theme's directory. This will modify both the WordPress default messages as well as messages generated by Paid Memberships Pro. <a title="Paid Memberships Pro - Member Communications" target="_blank" href="http://www.paidmembershipspro.com/support/member-communications/">Click here to learn more about Paid Memberships Pro emails</a>.</p>
64
+
65
+ <table class="form-table">
66
+ <tbody>
67
+ <tr>
68
+ <th scope="row" valign="top">
69
+ <label for="from_email">From Email:</label>
70
+ </th>
71
+ <td>
72
+ <input type="text" name="from_email" size="60" value="<?php echo $from_email?>" />
73
+ </td>
74
+ </tr>
75
+ <tr>
76
+ <th scope="row" valign="top">
77
+ <label for="from_name">From Name:</label>
78
+ </th>
79
+ <td>
80
+ <input type="text" name="from_name" size="60" value="<?php echo $from_name?>" />
81
+ </td>
82
+ </tr>
83
+ </tbody>
84
+ </table>
85
+
86
+ <h3>Send the site admin emails:</h3>
87
+
88
+ <table class="form-table">
89
+ <tbody>
90
+ <tr>
91
+ <th scope="row" valign="top">
92
+ <label for="email_admin_checkout">Checkout:</label>
93
+ </th>
94
+ <td>
95
+ <input type="checkbox" id="email_admin_checkout" name="email_admin_checkout" value="1" <?php if(!empty($email_admin_checkout)) { ?>checked="checked"<?php } ?> />
96
+ when a member checks out.
97
+ </td>
98
+ </tr>
99
+ <tr>
100
+ <th scope="row" valign="top">
101
+ <label for="email_admin_changes">Admin Changes:</label>
102
+ </th>
103
+ <td>
104
+ <input type="checkbox" id="email_admin_changes" name="email_admin_changes" value="1" <?php if(!empty($email_admin_changes)) { ?>checked="checked"<?php } ?> />
105
+ when an admin changes a user's membership level through the dashboard.
106
+ </td>
107
+ </tr>
108
+ <tr>
109
+ <th scope="row" valign="top">
110
+ <label for="email_admin_cancels">Cancellation:</label>
111
+ </th>
112
+ <td>
113
+ <input type="checkbox" id="email_admin_cancels" name="email_admin_cancels" value="1" <?php if(!empty($email_admin_cancels)) { ?>checked="checked"<?php } ?> />
114
+ when a user cancel's his or her account.
115
+ </td>
116
+ </tr>
117
+ <tr>
118
+ <th scope="row" valign="top">
119
+ <label for="email_admin_billing">Bill Updates:</label>
120
+ </th>
121
+ <td>
122
+ <input type="checkbox" id="email_admin_billing" name="email_admin_billing" value="1" <?php if(!empty($email_admin_billing)) { ?>checked="checked"<?php } ?> />
123
+ when a user updates his or her billing information.
124
+ </td>
125
+ </tr>
126
+ </tbody>
127
+ </table>
128
+
129
+ <h3>Send members emails:</h3>
130
+
131
+ <table class="form-table">
132
+ <tbody>
133
+ <tr>
134
+ <th scope="row" valign="top">
135
+ <label for="email_admin_checkout">New Users:</label>
136
+ </th>
137
+ <td>
138
+ <input type="checkbox" id="email_member_notification" name="email_member_notification" value="1" <?php if(!empty($email_member_notification)) { ?>checked="checked"<?php } ?> />
139
+ Default WP notification email. (Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout.)
140
+ </td>
141
+ </tr>
142
+ </tbody>
143
+ </table>
144
+
145
+ <p class="submit">
146
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
147
+ </p>
148
+ </form>
149
+
150
+ <?php
151
+ require_once(dirname(__FILE__) . "/admin_footer.php");
152
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/functions.php DELETED
@@ -1,222 +0,0 @@
1
- <?php
2
- /****************************************************************
3
-
4
- IMPORTANT. PLEASE READ.
5
-
6
- DO NOT EDIT THIS FILE or any other file in the /wp-content/plugins/paid-memberships-pro/ directory.
7
- Doing so could break the PMPro plugin and/or keep you from upgrading this plugin in the future.
8
- We regularly release updates to the plugin, including important security fixes and new features.
9
- You want to be able to upgrade.
10
-
11
- If you were asked to insert code into "your functions.php file", it was meant that you edit the functions.php
12
- in the root folder of your active theme. e.g. /wp-content/themes/twentytwelve/functions.php
13
- You can also create a custom plugin to place customization code into. Instructions are here:
14
- http://www.paidmembershipspro.com/2012/08/create-a-plugin-for-pmpro-customizations/
15
-
16
- Further documentation for customizing Paid Memberships Pro can be found here:
17
- http://www.paidmembershipspro.com/documentation/
18
-
19
- ****************************************************************/
20
-
21
- /*
22
- Checks if PMPro settings are complete or if there are any errors.
23
- */
24
- function pmpro_checkLevelForStripeCompatibility($level = NULL)
25
- {
26
- $gateway = pmpro_getOption("gateway");
27
- if($gateway == "stripe")
28
- {
29
- global $wpdb;
30
-
31
- //check ALL the levels
32
- if(empty($level))
33
- {
34
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
35
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
36
- if(!empty($levels))
37
- {
38
- foreach($levels as $level)
39
- {
40
- /*
41
- Stripe currently does not support:
42
- * Trial Amounts > 0.
43
- * Daily billing periods.
44
- * Billing Limits.
45
- */
46
- if($level->trial_amount > 0 ||
47
- ($level->cycle_number > 0 && $level->cycle_period == "Day") ||
48
- $level->billing_limit > 0)
49
- {
50
- return false;
51
- }
52
- }
53
- }
54
- }
55
- else
56
- {
57
- //need to look it up?
58
- if(is_numeric($level))
59
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
60
-
61
- //check this level
62
- if($level->trial_amount > 0 ||
63
- ($level->cycle_number > 0 && $level->cycle_period == "Day") ||
64
- $level->billing_limit > 0)
65
- {
66
- return false;
67
- }
68
- }
69
- }
70
-
71
- return true;
72
- }
73
-
74
- /*
75
- Checks if PMPro settings are complete or if there are any errors.
76
- */
77
- function pmpro_checkLevelForPayflowCompatibility($level = NULL)
78
- {
79
- $gateway = pmpro_getOption("gateway");
80
- if($gateway == "payflowpro")
81
- {
82
- global $wpdb;
83
-
84
- //check ALL the levels
85
- if(empty($level))
86
- {
87
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
88
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
89
- if(!empty($levels))
90
- {
91
- foreach($levels as $level)
92
- {
93
- /*
94
- Payflow currently does not support:
95
- * Trial Amounts > 0.
96
- * Daily billing periods.
97
- */
98
-
99
- if($level->trial_amount > 0 ||
100
- $level->cycle_number > 1 ||
101
- ($level->cycle_number == 1 && $level->cycle_period == "Day"))
102
- {
103
- return false;
104
- }
105
- }
106
- }
107
- }
108
- else
109
- {
110
- //need to look it up?
111
- if(is_numeric($level))
112
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
113
-
114
- //check this level
115
- if($level->trial_amount > 0 ||
116
- $level->cycle_number > 1 ||
117
- ($level->cycle_number == 1 && $level->cycle_period == "Day"))
118
- {
119
- return false;
120
- }
121
- }
122
- }
123
-
124
- return true;
125
- }
126
-
127
- /*
128
- Checks if PMPro settings are complete or if there are any errors.
129
- */
130
- function pmpro_checkLevelForBraintreeCompatibility($level = NULL)
131
- {
132
- $gateway = pmpro_getOption("gateway");
133
- if($gateway == "braintree")
134
- {
135
- global $wpdb;
136
-
137
- //check ALL the levels
138
- if(empty($level))
139
- {
140
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
141
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
142
- if(!empty($levels))
143
- {
144
- foreach($levels as $level)
145
- {
146
- /*
147
- Braintree currently does not support:
148
- * Trial Amounts > 0.
149
- * Daily or Weekly billing periods.
150
- */
151
- if($level->trial_amount > 0 ||
152
- ($level->cycle_number > 0 && ($level->cycle_period == "Day" || $level->cycle_period == "Week")))
153
- {
154
- return false;
155
- }
156
- }
157
- }
158
- }
159
- else
160
- {
161
- //need to look it up?
162
- if(is_numeric($level))
163
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
164
-
165
- //check this level
166
- if($level->trial_amount > 0 ||
167
- ($level->cycle_number > 0 && ($level->cycle_period == "Day" || $level->cycle_period == "Week")))
168
- {
169
- return false;
170
- }
171
- }
172
- }
173
-
174
- return true;
175
- }
176
-
177
- /*
178
- Checks if PMPro settings are complete or if there are any errors.
179
- */
180
- function pmpro_checkLevelForTwoCheckoutCompatibility($level = NULL)
181
- {
182
- $gateway = pmpro_getOption("gateway");
183
- if($gateway == "twocheckout")
184
- {
185
- global $wpdb;
186
-
187
- //check ALL the levels
188
- if(empty($level))
189
- {
190
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ORDER BY id ASC";
191
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
192
- if(!empty($levels))
193
- {
194
- foreach($levels as $level)
195
- {
196
- /*
197
- 2Checkout currently does not support:
198
- * Trial amounts less than or greater than the absolute value of amonthly recurring amount.
199
- */
200
- if(pmpro_isLevelTrial($level))
201
- {
202
- return false;
203
- }
204
- }
205
- }
206
- }
207
- else
208
- {
209
- //need to look it up?
210
- if(is_numeric($level))
211
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . esc_sql($level) . "' LIMIT 1");
212
-
213
- //check this level
214
- if(pmpro_isLevelTrial($level))
215
- {
216
- return false;
217
- }
218
- }
219
- }
220
-
221
- return true;
222
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/membershiplevels.php CHANGED
@@ -1,588 +1,574 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_membershiplevels")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $msg, $msgt, $pmpro_currency_symbol;
9
-
10
- //some vars
11
- $gateway = pmpro_getOption("gateway");
12
- global $pmpro_stripe_error, $pmpro_braintree_error, $pmpro_payflow_error, $pmpro_twocheckout_error, $wp_version;
13
-
14
- if(isset($_REQUEST['edit']))
15
- $edit = $_REQUEST['edit'];
16
- else
17
- $edit = false;
18
- if(isset($_REQUEST['copy']))
19
- $copy = $_REQUEST['copy'];
20
- if(isset($_REQUEST['s']))
21
- $s = $_REQUEST['s'];
22
- else
23
- $s = "";
24
-
25
- if(isset($_REQUEST['action']))
26
- $action = $_REQUEST['action'];
27
- else
28
- $action = false;
29
-
30
- if(isset($_REQUEST['saveandnext']))
31
- $saveandnext = $_REQUEST['saveandnext'];
32
-
33
- if(isset($_REQUEST['saveid']))
34
- $saveid = $_REQUEST['saveid'];
35
- if(isset($_REQUEST['deleteid']))
36
- $deleteid = $_REQUEST['deleteid'];
37
-
38
- if($action == "save_membershiplevel")
39
- {
40
- $ml_name = addslashes($_REQUEST['name']);
41
- $ml_description = $_REQUEST['description'];
42
- $ml_confirmation = $_REQUEST['confirmation'];
43
- $ml_initial_payment = addslashes($_REQUEST['initial_payment']);
44
- if(!empty($_REQUEST['recurring']))
45
- $ml_recurring = 1;
46
- else
47
- $ml_recurring = 0;
48
- $ml_billing_amount = addslashes($_REQUEST['billing_amount']);
49
- $ml_cycle_number = addslashes($_REQUEST['cycle_number']);
50
- $ml_cycle_period = addslashes($_REQUEST['cycle_period']);
51
- $ml_billing_limit = addslashes($_REQUEST['billing_limit']);
52
- if(!empty($_REQUEST['custom_trial']))
53
- $ml_custom_trial = 1;
54
- else
55
- $ml_custom_trial = 0;
56
- $ml_trial_amount = addslashes($_REQUEST['trial_amount']);
57
- $ml_trial_limit = addslashes($_REQUEST['trial_limit']);
58
- if(!empty($_REQUEST['expiration']))
59
- $ml_expiration = 1;
60
- else
61
- $ml_expiration = 0;
62
- $ml_expiration_number = addslashes($_REQUEST['expiration_number']);
63
- $ml_expiration_period = addslashes($_REQUEST['expiration_period']);
64
- $ml_categories = array();
65
-
66
- //reversing disable to allow here
67
- if(empty($_REQUEST['disable_signups']))
68
- $ml_allow_signups = 1;
69
- else
70
- $ml_allow_signups = 0;
71
-
72
- foreach ( $_REQUEST as $key => $value )
73
- {
74
- if ( $value == 'yes' && preg_match( '/^membershipcategory_(\d+)$/i', $key, $matches ) )
75
- {
76
- $ml_categories[] = $matches[1];
77
- }
78
- }
79
-
80
- //clearing out values if checkboxes aren't checked
81
- if(empty($ml_recurring))
82
- {
83
- $ml_billing_amount = $ml_cycle_number = $ml_cycle_period = $ml_billing_limit = $ml_trial_amount = $ml_trial_limit = 0;
84
- }
85
- elseif(empty($ml_custom_trial))
86
- {
87
- $ml_trial_amount = $ml_trial_limit = 0;
88
- }
89
- if(empty($ml_expiration))
90
- {
91
- $ml_expiration_number = $ml_expiration_period = 0;
92
- }
93
-
94
- if($saveid > 0)
95
- {
96
- $sqlQuery = " UPDATE {$wpdb->pmpro_membership_levels}
97
- SET name = '" . esc_sql($ml_name) . "',
98
- description = '" . esc_sql($ml_description) . "',
99
- confirmation = '" . esc_sql($ml_confirmation) . "',
100
- initial_payment = '" . esc_sql($ml_initial_payment) . "',
101
- billing_amount = '" . esc_sql($ml_billing_amount) . "',
102
- cycle_number = '" . esc_sql($ml_cycle_number) . "',
103
- cycle_period = '" . esc_sql($ml_cycle_period) . "',
104
- billing_limit = '" . esc_sql($ml_billing_limit) . "',
105
- trial_amount = '" . esc_sql($ml_trial_amount) . "',
106
- trial_limit = '" . esc_sql($ml_trial_limit) . "',
107
- expiration_number = '" . esc_sql($ml_expiration_number) . "',
108
- expiration_period = '" . esc_sql($ml_expiration_period) . "',
109
- allow_signups = '" . esc_sql($ml_allow_signups) . "'
110
- WHERE id = '$saveid' LIMIT 1;";
111
- $wpdb->query($sqlQuery);
112
-
113
- pmpro_updateMembershipCategories( $saveid, $ml_categories );
114
- if(!mysql_errno())
115
- {
116
- $edit = false;
117
- $msg = 2;
118
- $msgt = __("Membership level updated successfully.", "pmpro");
119
- }
120
- else
121
- {
122
- $msg = -2;
123
- $msg = true;
124
- $msgt = __("Error updating membership level.", "pmpro");
125
- }
126
- }
127
- else
128
- {
129
- $sqlQuery = " INSERT INTO {$wpdb->pmpro_membership_levels}
130
- ( name, description, confirmation, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period, allow_signups)
131
- VALUES
132
- ( '" . esc_sql($ml_name) . "', '" . esc_sql($ml_description) . "', '" . esc_sql($ml_confirmation) . "', '" . esc_sql($ml_initial_payment) . "', '" . esc_sql($ml_billing_amount) . "', '" . esc_sql($ml_cycle_number) . "', '" . esc_sql($ml_cycle_period) . "', '" . esc_sql($ml_billing_limit) . "', '" . esc_sql($ml_trial_amount) . "', '" . esc_sql($ml_trial_limit) . "', '" . esc_sql($ml_expiration_number) . "', '" . esc_sql($ml_expiration_period) . "', '" . esc_sql($ml_allow_signups) . "' )";
133
- $wpdb->query($sqlQuery);
134
- if(!mysql_errno())
135
- {
136
- $saveid = $wpdb->insert_id;
137
- pmpro_updateMembershipCategories( $saveid, $ml_categories );
138
-
139
- $edit = false;
140
- $msg = 1;
141
- $msgt = __("Membership level added successfully.", "pmpro");
142
- }
143
- else
144
- {
145
- $msg = -1;
146
- $msgt = __("Error adding membership level.", "pmpro");
147
- }
148
- }
149
-
150
- do_action("pmpro_save_membership_level", $saveid);
151
- }
152
- elseif($action == "delete_membership_level")
153
- {
154
- global $wpdb;
155
-
156
- $ml_id = $_REQUEST['deleteid'];
157
-
158
- if($ml_id > 0)
159
- {
160
- do_action("pmpro_delete_membership_level", $ml_id);
161
-
162
- //remove any categories from the ml
163
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE membership_id = '$ml_id'";
164
- $r1 = $wpdb->query($sqlQuery);
165
-
166
- //cancel any subscriptions to the ml
167
- $r2 = true;
168
- $user_ids = $wpdb->get_col("SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE membership_id = '$ml_id' AND status = 'active'");
169
- foreach($user_ids as $user_id)
170
- {
171
- //change there membership level to none. that will handle the cancel
172
- if(pmpro_changeMembershipLevel(0, $user_id))
173
- {
174
- //okay
175
- }
176
- else
177
- {
178
- //couldn't delete the subscription
179
- //we should probably notify the admin
180
- $pmproemail = new PMProEmail();
181
- $pmproemail->data = array("body"=>"<p>" . sprintf(__("There was an error canceling the subscription for user with ID=%d. You will want to check your payment gateway to see if their subscription is still active.", "pmpro"), $user_id) . "</p>");
182
- $last_order = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
183
- if($last_order)
184
- $pmproemail->data["body"] .= "<p>" . __("Last Invoice", "pmpro") . ":<br />" . nl2br(var_export($last_order, true)) . "</p>";
185
- $pmproemail->sendEmail(get_bloginfo("admin_email"));
186
-
187
- $r2 = false;
188
- }
189
- }
190
-
191
- //delete the ml
192
- $sqlQuery = "DELETE FROM $wpdb->pmpro_membership_levels WHERE id = '$ml_id' LIMIT 1";
193
- $r3 = $wpdb->query($sqlQuery);
194
-
195
- if($r1 !== FALSE && $r2 !== FALSE && $r3 !== FALSE)
196
- {
197
- $msg = 3;
198
- $msgt = __("Membership level deleted successfully.", "pmpro");
199
- }
200
- else
201
- {
202
- $msg = -3;
203
- $msgt = __("Error deleting membership level.", "pmpro");
204
- }
205
- }
206
- else
207
- {
208
- $msg = -3;
209
- $msgt = __("Error deleting membership level.", "pmpro");
210
- }
211
- }
212
-
213
- require_once(dirname(__FILE__) . "/admin_header.php");
214
- ?>
215
-
216
- <?php
217
- if($edit)
218
- {
219
- ?>
220
-
221
- <h2>
222
- <?php
223
- if($edit > 0)
224
- echo __("Edit Membership Level", "pmpro");
225
- else
226
- echo __("Add New Membership Level", "pmpro");
227
- ?>
228
- </h2>
229
-
230
- <div>
231
- <?php
232
- // get the level...
233
- if(!empty($edit) && $edit > 0)
234
- {
235
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$edit' LIMIT 1", OBJECT);
236
- $temp_id = $level->id;
237
- }
238
- elseif(!empty($copy) && $copy > 0)
239
- {
240
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$copy' LIMIT 1", OBJECT);
241
- $temp_id = $level->id;
242
- $level->id = NULL;
243
- }
244
- else
245
-
246
- // didn't find a membership level, let's add a new one...
247
- if(empty($level))
248
- {
249
- $level = new stdClass();
250
- $level->id = NULL;
251
- $level->name = NULL;
252
- $level->description = NULL;
253
- $level->confirmation = NULL;
254
- $level->billing_amount = NULL;
255
- $level->trial_amount = NULL;
256
- $level->initial_payment = NULL;
257
- $level->billing_limit = NULL;
258
- $level->trial_limit = NULL;
259
- $level->expiration_number = NULL;
260
- $level->expiration_period = NULL;
261
- $edit = -1;
262
- }
263
-
264
- //defaults for new levels
265
- if(empty($copy) && $edit == -1)
266
- {
267
- $level->cycle_number = 1;
268
- $level->cycle_period = "Month";
269
- }
270
-
271
- // grab the categories for the given level...
272
- if(!empty($temp_id))
273
- $level->categories = $wpdb->get_col("SELECT c.category_id
274
- FROM $wpdb->pmpro_memberships_categories c
275
- WHERE c.membership_id = '" . $temp_id . "'");
276
- if(empty($level->categories))
277
- $level->categories = array();
278
-
279
- ?>
280
- <form action="" method="post" enctype="multipart/form-data">
281
- <input name="saveid" type="hidden" value="<?php echo $edit?>" />
282
- <input type="hidden" name="action" value="save_membershiplevel" />
283
- <table class="form-table">
284
- <tbody>
285
- <tr>
286
- <th scope="row" valign="top"><label><?php _e('ID', 'pmpro');?>:</label></th>
287
- <td>
288
- <?php echo $level->id?>
289
- </td>
290
- </tr>
291
-
292
- <tr>
293
- <th scope="row" valign="top"><label for="name"><?php _e('Name', 'pmpro');?>:</label></th>
294
- <td><input name="name" type="text" size="50" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->name))?>" /></td>
295
- </tr>
296
-
297
- <tr>
298
- <th scope="row" valign="top"><label for="description"><?php _e('Description', 'pmpro');?>:</label></th>
299
- <td>
300
- <div id="poststuff" class="pmpro_description">
301
- <?php
302
- if(version_compare($wp_version, "3.3") >= 0)
303
- wp_editor(stripslashes($level->description), "description", array("textarea_rows"=>5));
304
- else
305
- {
306
- ?>
307
- <textarea rows="10" cols="80" name="description" id="description"><?php echo stripslashes($level->description)?></textarea>
308
- <?php
309
- }
310
- ?>
311
- </div>
312
- </td>
313
- </tr>
314
-
315
- <tr>
316
- <th scope="row" valign="top"><label for="confirmation"><?php _e('Confirmation Message', 'pmpro');?>:</label></th>
317
- <td>
318
- <div class="pmpro_confirmation">
319
- <?php
320
- if(version_compare($wp_version, "3.3") >= 0)
321
- wp_editor(stripslashes($level->confirmation), "confirmation", array("textarea_rows"=>5));
322
- else
323
- {
324
- ?>
325
- <textarea rows="10" cols="80" name="confirmation" id="confirmation"><?php echo stripslashes($level->confirmation)?></textarea>
326
- <?php
327
- }
328
- ?>
329
- </div>
330
- </td>
331
- </tr>
332
- </tbody>
333
- </table>
334
-
335
- <h3 class="topborder"><?php _e('Billing Details', 'pmpro');?></h3>
336
- <table class="form-table">
337
- <tbody>
338
- <tr>
339
- <th scope="row" valign="top"><label for="initial_payment"><?php _e('Initial Payment', 'pmpro');?>:</label></th>
340
- <td><?php echo $pmpro_currency_symbol?><input name="initial_payment" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small><?php _e('The initial amount collected at registration.', 'pmpro');?></small></td>
341
- </tr>
342
-
343
- <tr>
344
- <th scope="row" valign="top"><label><?php _e('Recurring Subscription', 'pmpro');?>:</label></th>
345
- <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();}" /> <small><?php _e('Check if this level has a recurring subscription payment.', 'pmpro');?></small></td>
346
- </tr>
347
-
348
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
349
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Billing Amount', 'pmpro');?>:</label></th>
350
- <td>
351
- <?php echo $pmpro_currency_symbol?><input name="billing_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small><?php _e('per', 'pmpro');?></small>
352
- <input id="cycle_number" name="cycle_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
353
- <select id="cycle_period" name="cycle_period">
354
- <?php
355
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
356
- foreach ( $cycles as $name => $value ) {
357
- echo "<option value='$value'";
358
- if ( $level->cycle_period == $value ) echo " selected='selected'";
359
- echo ">$name</option>";
360
- }
361
- ?>
362
- </select>
363
- <br /><small>
364
- <?php _e('The amount to be billed one cycle after the initial payment.', 'pmpro');?>
365
- <?php if($gateway == "stripe") { ?>
366
- <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently only supports billing periods of "Week", "Month" or "Year".', 'pmpro');?>
367
- <?php } elseif($gateway == "braintree") { ?>
368
- <br /><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently only supports billing periods of "Month" or "Year".', 'pmpro');?>
369
- <?php } elseif($gateway == "payflowpro") { ?>
370
- <br /><strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Payflow integration currently only supports billing frequencies of 1 and billing periods of "Week", "Month" or "Year".', 'pmpro');?>
371
- <?php } ?>
372
- </small>
373
- <?php if($gateway == "braintree" && $edit < 0) { ?>
374
- <p class="pmpro_message"><strong><?php _e('Note', 'pmpro');?>:</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.', 'pmpro');?></p>
375
- <?php } elseif($gateway == "braintree") { ?>
376
- <p class="pmpro_message"><strong><?php _e('Note', 'pmpro');?>:</strong> <?php _e('You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to', 'pmpro');?> <em>pmpro_<?php echo $level->id;?></em>.</p>
377
- <?php } ?>
378
- </td>
379
- </tr>
380
-
381
- <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
382
- <th scope="row" valign="top"><label for="billing_limit"><?php _e('Billing Cycle Limit', 'pmpro');?>:</label></th>
383
- <td>
384
- <input name="billing_limit" type="text" size="20" value="<?php echo $level->billing_limit?>" />
385
- <br /><small>
386
- <?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.', 'pmpro');?>
387
- <?php if($gateway == "stripe") { ?>
388
- <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.', 'pmpro');?></strong>
389
- <?php } ?>
390
- </small>
391
- </td>
392
- </tr>
393
-
394
- <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
395
- <th scope="row" valign="top"><label><?php _e('Custom Trial', 'pmpro');?>:</label></th>
396
- <td>
397
- <input id="custom_trial" name="custom_trial" type="checkbox" value="yes" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="jQuery('.trial_info').toggle();" /> <?php _e('Check to add a custom trial period.', 'pmpro');?>
398
-
399
- <?php if($gateway == "twocheckout") { ?>
400
- <br /><small><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.', 'pmpro');?></strong></small>
401
- <?php } ?>
402
- </td>
403
- </tr>
404
-
405
- <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
406
- <th scope="row" valign="top"><label for="trial_amount"><?php _e('Trial Billing Amount', 'pmpro');?>:</label></th>
407
- <td>
408
- <?php echo $pmpro_currency_symbol?><input name="trial_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
409
- <small><?php _e('for the first', 'pmpro');?></small>
410
- <input name="trial_limit" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
411
- <small><?php _e('subscription payments', 'pmpro');?>.</small>
412
- <?php if($gateway == "stripe") { ?>
413
- <br /><small>
414
- <strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Stripe integration currently does not support trial amounts greater than $0.', 'pmpro');?></strong>
415
- </small>
416
- <?php } elseif($gateway == "braintree") { ?>
417
- <br /><small>
418
- <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Braintree integration currently does not support trial amounts greater than $0.', 'pmpro');?></strong>
419
- </small>
420
- <?php } elseif($gateway == "payflowpro") { ?>
421
- <br /><small>
422
- <strong <?php if(!empty($pmpro_payflow_error)) { ?>class="pmpro_red"<?php } ?>><?php _e('Payflow integration currently does not support trial amounts greater than $0.', 'pmpro');?></strong>
423
- </small>
424
- <?php } ?>
425
- </td>
426
- </tr>
427
-
428
- </tbody>
429
- </table>
430
- <h3 class="topborder"><?php _e('Other Settings', 'pmpro');?></h3>
431
- <table class="form-table">
432
- <tbody>
433
- <tr>
434
- <th scope="row" valign="top"><label><?php _e('Disable New Signups', 'pmpro');?>:</label></th>
435
- <td><input name="disable_signups" type="checkbox" value="yes" <?php if($level->id && !$level->allow_signups) { ?>checked="checked"<?php } ?> /> <?php _e('Check to hide this level from the membership levels page and disable registration.', 'pmpro');?></td>
436
- </tr>
437
-
438
- <tr>
439
- <th scope="row" valign="top"><label><?php _e('Membership Expiration', 'pmpro');?>:</label></th>
440
- <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();}" /> <?php _e('Check this to set when membership access expires.', 'pmpro');?></td>
441
- </tr>
442
-
443
- <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
444
- <th scope="row" valign="top"><label for="billing_amount"><?php _e('Expires In', 'pmpro');?>:</label></th>
445
- <td>
446
- <input id="expiration_number" name="expiration_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
447
- <select id="expiration_period" name="expiration_period">
448
- <?php
449
- $cycles = array( __('Day(s)', 'pmpro') => 'Day', __('Week(s)', 'pmpro') => 'Week', __('Month(s)', 'pmpro') => 'Month', __('Year(s)', 'pmpro') => 'Year' );
450
- foreach ( $cycles as $name => $value ) {
451
- echo "<option value='$value'";
452
- if ( $level->expiration_period == $value ) echo " selected='selected'";
453
- echo ">$name</option>";
454
- }
455
- ?>
456
- </select>
457
- <br /><small><?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.', 'pmpro');?></small>
458
- </td>
459
- </tr>
460
- </tbody>
461
- </table>
462
-
463
- <?php do_action("pmpro_membership_level_after_other_settings"); ?>
464
-
465
- <h3 class="topborder"><?php _e('Content Settings', 'pmpro');?></h3>
466
- <table class="form-table">
467
- <tbody>
468
- <tr>
469
- <th scope="row" valign="top"><label><?php _e('Categories', 'pmpro');?>:</label></th>
470
- <td>
471
- <?php
472
- $categories = get_categories( array( 'hide_empty' => 0 ) );
473
- echo "<ul>";
474
- foreach ( $categories as $cat )
475
- {
476
- $checked = in_array( $cat->term_id, $level->categories ) ? "checked='checked'" : '';
477
- echo "<li><input name='membershipcategory_{$cat->term_id}' type='checkbox' value='yes' $checked /> {$cat->name}</li>\n";
478
- }
479
- echo "</ul>";
480
- ?>
481
- </td>
482
- </tr>
483
- </tbody>
484
- </table>
485
- <p class="submit topborder">
486
- <input name="save" type="submit" class="button-primary" value="Save Level" />
487
- <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-membershiplevels')?>';" />
488
- </p>
489
- </form>
490
- </div>
491
-
492
- <?php
493
- }
494
- else
495
- {
496
- ?>
497
-
498
- <h2><?php _e('Membership Levels', 'pmpro');?> <a href="admin.php?page=pmpro-membershiplevels&edit=-1" class="add-new-h2"><?php _e('Add New Level', 'pmpro');?></a></h2>
499
- <form id="posts-filter" method="get" action="">
500
- <p class="search-box">
501
- <label class="screen-reader-text" for="post-search-input"><?php _e('Search Levels', 'pmpro');?>:</label>
502
- <input type="hidden" name="page" value="pmpro-membershiplevels" />
503
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s" size="30" />
504
- <input class="button" type="submit" value="<?php _e('Search Levels', 'pmpro');?>" id="search-submit" />
505
- </p>
506
- </form>
507
-
508
- <br class="clear" />
509
-
510
- <table class="widefat">
511
- <thead>
512
- <tr>
513
- <th><?php _e('ID', 'pmpro');?></th>
514
- <th><?php _e('Name', 'pmpro');?></th>
515
- <th><?php _e('Initial Payment', 'pmpro');?></th>
516
- <th><?php _e('Billing Cycle', 'pmpro');?></th>
517
- <th><?php _e('Trial Cycle', 'pmpro');?></th>
518
- <th><?php _e('Expiration', 'pmpro');?></th>
519
- <th><?php _e('Allow Signups', 'pmpro');?></th>
520
- <th></th>
521
- <th></th>
522
- <th></th>
523
- </tr>
524
- </thead>
525
- <tbody>
526
- <?php
527
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
528
- if($s)
529
- $sqlQuery .= "WHERE name LIKE '%$s%' ";
530
- $sqlQuery .= "ORDER BY id ASC";
531
-
532
- $levels = $wpdb->get_results($sqlQuery, OBJECT);
533
-
534
- foreach($levels as $level)
535
- {
536
- ?>
537
- <tr class="<?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 } ?>">
538
- <td><?php echo $level->id?></td>
539
- <td><?php echo $level->name?></td>
540
- <td>
541
- <?php if(pmpro_isLevelFree($level)) { ?>
542
- <?php _e('FREE', 'pmpro');?>
543
- <?php } else { ?>
544
- <?php echo $pmpro_currency_symbol?><?php echo $level->initial_payment?>
545
- <?php } ?>
546
- </td>
547
- <td>
548
- <?php if(!pmpro_isLevelRecurring($level)) { ?>
549
- --
550
- <?php } else { ?>
551
- <?php echo $pmpro_currency_symbol?><?php echo $level->billing_amount?> <?php _e('every', 'pmpro');?> <?php echo $level->cycle_number.' '.pmpro_translate_billing_period($level->cycle_period,$level->cycle_number)?>
552
-
553
- <?php if($level->billing_limit) { ?>(<?php _e('for', 'pmpro');?> <?php echo $level->billing_limit?> <?php echo sornot($level->cycle_period,$level->billing_limit)?>)<?php } ?>
554
-
555
- <?php } ?>
556
- </td>
557
- <td>
558
- <?php if(!pmpro_isLevelTrial($level)) { ?>
559
- --
560
- <?php } else { ?>
561
- <?php echo $pmpro_currency_symbol?><?php echo $level->trial_amount?> <?php _e('for', 'pmpro');?> <?php echo $level->trial_limit?> <?php echo sornot("payment",$level->trial_limit)?>
562
- <?php } ?>
563
- </td>
564
- <td>
565
- <?php if(!pmpro_isLevelExpiring($level)) { ?>
566
- --
567
- <?php } else { ?>
568
- <?php _e('After', 'pmpro');?> <?php echo $level->expiration_number?> <?php echo sornot($level->expiration_period,$level->expiration_number)?>
569
- <?php } ?>
570
- </td>
571
- <td><?php if($level->allow_signups) { ?><?php _e('Yes', 'pmpro');?><?php } else { ?><?php _e('No', 'pmpro');?><?php } ?></td>
572
- <td align="center"><a href="admin.php?page=pmpro-membershiplevels&amp;edit=<?php echo $level->id?>" class="edit"><?php _e('edit', 'pmpro');?></a></td>
573
- <td align="center"><a href="admin.php?page=pmpro-membershiplevels&amp;copy=<?php echo $level->id?>&amp;edit=-1" class="edit"><?php _e('copy', 'pmpro');?></a></td>
574
- <td align="center"><a href="javascript: askfirst('<?php printf(__("Are you sure you want to delete membership level %s? All subscriptions will be cancelled.", "pmpro"), $level->name);?>','admin.php?page=pmpro-membershiplevels&amp;action=delete_membership_level&amp;deleteid=<?php echo $level->id?>'); void(0);" class="delete"><?php _e('delete', 'pmpro');?></a></td>
575
- </tr>
576
- <?php
577
- }
578
- ?>
579
- </tbody>
580
- </table>
581
- <?php
582
- }
583
- ?>
584
-
585
- <?php
586
- require_once(dirname(__FILE__) . "/admin_footer.php");
587
- ?>
588
-
1
+ <?php
2
+ //only admins can get this
3
+ if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_membershiplevels")))
4
+ {
5
+ die("You do not have permissions to perform this action.");
6
+ }
7
+
8
+ global $wpdb, $msg, $msgt, $pmpro_currency_symbol;
9
+
10
+ //some vars
11
+ $gateway = pmpro_getOption("gateway");
12
+ global $pmpro_stripe_error, $pmpro_braintree_error, $wp_version;
13
+
14
+ if(isset($_REQUEST['edit']))
15
+ $edit = $_REQUEST['edit'];
16
+ else
17
+ $edit = false;
18
+ if(isset($_REQUEST['copy']))
19
+ $copy = $_REQUEST['copy'];
20
+ if(isset($_REQUEST['s']))
21
+ $s = $_REQUEST['s'];
22
+ else
23
+ $s = "";
24
+
25
+ if(isset($_REQUEST['action']))
26
+ $action = $_REQUEST['action'];
27
+ else
28
+ $action = false;
29
+
30
+ if(isset($_REQUEST['saveandnext']))
31
+ $saveandnext = $_REQUEST['saveandnext'];
32
+
33
+ if(isset($_REQUEST['saveid']))
34
+ $saveid = $_REQUEST['saveid'];
35
+ if(isset($_REQUEST['deleteid']))
36
+ $deleteid = $_REQUEST['deleteid'];
37
+
38
+ if($action == "save_membershiplevel")
39
+ {
40
+ $ml_name = addslashes($_REQUEST['name']);
41
+ $ml_description = $_REQUEST['description'];
42
+ $ml_confirmation = $_REQUEST['confirmation'];
43
+ $ml_initial_payment = addslashes($_REQUEST['initial_payment']);
44
+ if(!empty($_REQUEST['recurring']))
45
+ $ml_recurring = 1;
46
+ else
47
+ $ml_recurring = 0;
48
+ $ml_billing_amount = addslashes($_REQUEST['billing_amount']);
49
+ $ml_cycle_number = addslashes($_REQUEST['cycle_number']);
50
+ $ml_cycle_period = addslashes($_REQUEST['cycle_period']);
51
+ $ml_billing_limit = addslashes($_REQUEST['billing_limit']);
52
+ if(!empty($_REQUEST['custom_trial']))
53
+ $ml_custom_trial = 1;
54
+ else
55
+ $ml_custom_trial = 0;
56
+ $ml_trial_amount = addslashes($_REQUEST['trial_amount']);
57
+ $ml_trial_limit = addslashes($_REQUEST['trial_limit']);
58
+ if(!empty($_REQUEST['expiration']))
59
+ $ml_expiration = 1;
60
+ else
61
+ $ml_expiration = 0;
62
+ $ml_expiration_number = addslashes($_REQUEST['expiration_number']);
63
+ $ml_expiration_period = addslashes($_REQUEST['expiration_period']);
64
+ $ml_categories = array();
65
+
66
+ //reversing disable to allow here
67
+ if(empty($_REQUEST['disable_signups']))
68
+ $ml_allow_signups = 1;
69
+ else
70
+ $ml_allow_signups = 0;
71
+
72
+ foreach ( $_REQUEST as $key => $value )
73
+ {
74
+ if ( $value == 'yes' && preg_match( '/^membershipcategory_(\d+)$/i', $key, $matches ) )
75
+ {
76
+ $ml_categories[] = $matches[1];
77
+ }
78
+ }
79
+
80
+ //clearing out values if checkboxes aren't checked
81
+ if(empty($ml_recurring))
82
+ {
83
+ $ml_billing_amount = $ml_cycle_number = $ml_cycle_period = $ml_billing_limit = $ml_trial_amount = $ml_trial_limit = 0;
84
+ }
85
+ elseif(empty($ml_custom_trial))
86
+ {
87
+ $ml_trial_amount = $ml_trial_limit = 0;
88
+ }
89
+ if(empty($ml_expiration))
90
+ {
91
+ $ml_expiration_number = $ml_expiration_period = 0;
92
+ }
93
+
94
+ if($saveid > 0)
95
+ {
96
+ $sqlQuery = " UPDATE {$wpdb->pmpro_membership_levels}
97
+ SET name = '" . $wpdb->escape($ml_name) . "',
98
+ description = '" . $wpdb->escape($ml_description) . "',
99
+ confirmation = '" . $wpdb->escape($ml_confirmation) . "',
100
+ initial_payment = '" . $wpdb->escape($ml_initial_payment) . "',
101
+ billing_amount = '" . $wpdb->escape($ml_billing_amount) . "',
102
+ cycle_number = '" . $wpdb->escape($ml_cycle_number) . "',
103
+ cycle_period = '" . $wpdb->escape($ml_cycle_period) . "',
104
+ billing_limit = '" . $wpdb->escape($ml_billing_limit) . "',
105
+ trial_amount = '" . $wpdb->escape($ml_trial_amount) . "',
106
+ trial_limit = '" . $wpdb->escape($ml_trial_limit) . "',
107
+ expiration_number = '" . $wpdb->escape($ml_expiration_number) . "',
108
+ expiration_period = '" . $wpdb->escape($ml_expiration_period) . "',
109
+ allow_signups = '" . $wpdb->escape($ml_allow_signups) . "'
110
+ WHERE id = '$saveid' LIMIT 1;";
111
+ $wpdb->query($sqlQuery);
112
+
113
+ pmpro_updateMembershipCategories( $saveid, $ml_categories );
114
+ if(!mysql_errno())
115
+ {
116
+ $edit = false;
117
+ $msg = 2;
118
+ $msgt = "Membership level updated successfully.";
119
+ }
120
+ else
121
+ {
122
+ $msg = -2;
123
+ $msg = true;
124
+ $msgt = "Error updating membership level.";
125
+ }
126
+ }
127
+ else
128
+ {
129
+ $sqlQuery = " INSERT INTO {$wpdb->pmpro_membership_levels}
130
+ ( name, description, confirmation, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, expiration_number, expiration_period, allow_signups)
131
+ VALUES
132
+ ( '" . $wpdb->escape($ml_name) . "', '" . $wpdb->escape($ml_description) . "', '" . $wpdb->escape($ml_confirmation) . "', '" . $wpdb->escape($ml_initial_payment) . "', '" . $wpdb->escape($ml_billing_amount) . "', '" . $wpdb->escape($ml_cycle_number) . "', '" . $wpdb->escape($ml_cycle_period) . "', '" . $wpdb->escape($ml_billing_limit) . "', '" . $wpdb->escape($ml_trial_amount) . "', '" . $wpdb->escape($ml_trial_limit) . "', '" . $wpdb->escape($ml_expiration_number) . "', '" . $wpdb->escape($ml_expiration_period) . "', '" . $wpdb->escape($ml_allow_signups) . "' )";
133
+ $wpdb->query($sqlQuery);
134
+ if(!mysql_errno())
135
+ {
136
+ $saveid = $wpdb->insert_id;
137
+ pmpro_updateMembershipCategories( $saveid, $ml_categories );
138
+
139
+ $edit = false;
140
+ $msg = 1;
141
+ $msgt = "Membership level added successfully.";
142
+ }
143
+ else
144
+ {
145
+ $msg = -1;
146
+ $msgt = "Error adding membership level.";
147
+ }
148
+ }
149
+
150
+ do_action("pmpro_save_membership_level", $saveid);
151
+ }
152
+ elseif($action == "delete_membership_level")
153
+ {
154
+ global $wpdb;
155
+
156
+ $ml_id = $_REQUEST['deleteid'];
157
+
158
+ if($ml_id > 0)
159
+ {
160
+ //remove any categories from the ml
161
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE membership_id = '$ml_id'";
162
+ $r1 = $wpdb->query($sqlQuery);
163
+
164
+ //cancel any subscriptions to the ml
165
+ $r2 = true;
166
+ $user_ids = $wpdb->get_col("SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE membership_id = '$ml_id'");
167
+ foreach($user_ids as $user_id)
168
+ {
169
+ //change there membership level to none. that will handle the cancel
170
+ if(pmpro_changeMembershipLevel(0, $user_id))
171
+ {
172
+ //okay
173
+ }
174
+ else
175
+ {
176
+ //couldn't delete the subscription
177
+ //we should probably notify the admin
178
+ $pmproemail = new PMProEmail();
179
+ $pmproemail->data = array("body"=>"<p>There was an error canceling the subscription for user with ID=" . $user_id . ". You will want to check your payment gateway to see if their subscription is still active.</p>");
180
+ $last_order = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
181
+ if($last_order)
182
+ $pmproemail->data["body"] .= "<p>Last Invoice:<br />" . nl2br(var_export($last_order, true)) . "</p>";
183
+ $pmproemail->sendEmail(get_bloginfo("admin_email"));
184
+
185
+ $r2 = false;
186
+ }
187
+ }
188
+
189
+ //delete the ml
190
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_membership_levels WHERE id = '$ml_id' LIMIT 1";
191
+ $r3 = $wpdb->query($sqlQuery);
192
+
193
+ if($r1 !== FALSE && $r2 !== FALSE && $r3 !== FALSE)
194
+ {
195
+ $msg = 3;
196
+ $msgt = "Membership level deleted successfully.";
197
+ }
198
+ else
199
+ {
200
+ $msg = -3;
201
+ $msgt = "Error deleting membership level.";
202
+ }
203
+ }
204
+ else
205
+ {
206
+ $msg = -3;
207
+ $msgt = "Error deleting membership level.";
208
+ }
209
+ }
210
+
211
+ require_once(dirname(__FILE__) . "/admin_header.php");
212
+ ?>
213
+
214
+ <?php
215
+ if($edit)
216
+ {
217
+ ?>
218
+
219
+ <h2>
220
+ <?php
221
+ if($edit > 0)
222
+ echo "Edit Membership Level";
223
+ else
224
+ echo "Add New Membership Level";
225
+ ?>
226
+ </h2>
227
+
228
+ <div>
229
+ <?php
230
+ // get the level...
231
+ if(!empty($edit) && $edit > 0)
232
+ {
233
+ $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$edit' LIMIT 1", OBJECT);
234
+ $temp_id = $level->id;
235
+ }
236
+ elseif(!empty($copy) && $copy > 0)
237
+ {
238
+ $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '$copy' LIMIT 1", OBJECT);
239
+ $temp_id = $level->id;
240
+ $level->id = NULL;
241
+ }
242
+ else
243
+
244
+ // didn't find a membership level, let's add a new one...
245
+ if(empty($level))
246
+ {
247
+ $level = new stdClass();
248
+ $level->id = NULL;
249
+ $level->name = NULL;
250
+ $level->description = NULL;
251
+ $level->confirmation = NULL;
252
+ $level->billing_amount = NULL;
253
+ $level->trial_amount = NULL;
254
+ $level->initial_payment = NULL;
255
+ $level->billing_limit = NULL;
256
+ $level->trial_limit = NULL;
257
+ $level->expiration_number = NULL;
258
+ $level->expiration_period = NULL;
259
+ $edit = -1;
260
+ }
261
+
262
+ //defaults for new levels
263
+ if(empty($copy) && $edit == -1)
264
+ {
265
+ $level->cycle_number = 1;
266
+ $level->cycle_period = "Month";
267
+ }
268
+
269
+ // grab the categories for the given level...
270
+ if(!empty($temp_id))
271
+ $level->categories = $wpdb->get_col("SELECT c.category_id
272
+ FROM $wpdb->pmpro_memberships_categories c
273
+ WHERE c.membership_id = '" . $temp_id . "'");
274
+ if(empty($level->categories))
275
+ $level->categories = array();
276
+
277
+ ?>
278
+ <form action="" method="post" enctype="multipart/form-data">
279
+ <input name="saveid" type="hidden" value="<?php echo $edit?>" />
280
+ <input type="hidden" name="action" value="save_membershiplevel" />
281
+ <table class="form-table">
282
+ <tbody>
283
+ <tr>
284
+ <th scope="row" valign="top"><label>ID:</label></th>
285
+ <td>
286
+ <?php echo $level->id?>
287
+ </td>
288
+ </tr>
289
+
290
+ <tr>
291
+ <th scope="row" valign="top"><label for="name">Name:</label></th>
292
+ <td><input name="name" type="text" size="50" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->name))?>" /></td>
293
+ </tr>
294
+
295
+ <tr>
296
+ <th scope="row" valign="top"><label for="description">Description:</label></th>
297
+ <td>
298
+ <div id="poststuff" class="pmpro_description">
299
+ <?php
300
+ if(version_compare($wp_version, "3.3") >= 0)
301
+ wp_editor(stripslashes($level->description), "description", array("textarea_rows"=>5));
302
+ else
303
+ {
304
+ ?>
305
+ <textarea rows="10" cols="80" name="description" id="description"><?php echo stripslashes($level->description)?></textarea>
306
+ <?php
307
+ }
308
+ ?>
309
+ </div>
310
+ </td>
311
+ </tr>
312
+
313
+ <tr>
314
+ <th scope="row" valign="top"><label for="confirmation">Confirmation Message:</label></th>
315
+ <td>
316
+ <div class="pmpro_confirmation">
317
+ <?php
318
+ if(version_compare($wp_version, "3.3") >= 0)
319
+ wp_editor(stripslashes($level->confirmation), "confirmation", array("textarea_rows"=>5));
320
+ else
321
+ {
322
+ ?>
323
+ <textarea rows="10" cols="80" name="confirmation" id="confirmation"><?php echo stripslashes($level->confirmation)?></textarea>
324
+ <?php
325
+ }
326
+ ?>
327
+ </div>
328
+ </td>
329
+ </tr>
330
+ </tbody>
331
+ </table>
332
+
333
+ <h3 class="topborder">Billing Details</h3>
334
+ <table class="form-table">
335
+ <tbody>
336
+ <tr>
337
+ <th scope="row" valign="top"><label for="initial_payment">Initial Payment:</label></th>
338
+ <td><?php echo $pmpro_currency_symbol?><input name="initial_payment" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->initial_payment))?>" /> <small>The initial amount collected at registration.</small></td>
339
+ </tr>
340
+
341
+ <tr>
342
+ <th scope="row" valign="top"><label>Recurring Subscription:</label></th>
343
+ <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();}" /> <small>Check if this level has a recurring subscription payment.</small></td>
344
+ </tr>
345
+
346
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
347
+ <th scope="row" valign="top"><label for="billing_amount">Billing Amount:</label></th>
348
+ <td>
349
+ <?php echo $pmpro_currency_symbol?><input name="billing_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->billing_amount))?>" /> <small>per</small>
350
+ <input id="cycle_number" name="cycle_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->cycle_number))?>" />
351
+ <select id="cycle_period" name="cycle_period">
352
+ <?php
353
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
354
+ foreach ( $cycles as $name => $value ) {
355
+ echo "<option value='$value'";
356
+ if ( $level->cycle_period == $value ) echo " selected='selected'";
357
+ echo ">$name</option>";
358
+ }
359
+ ?>
360
+ </select>
361
+ <br /><small>
362
+ The amount to be billed one cycle after the initial payment.
363
+ <?php if($gateway == "stripe") { ?>
364
+ <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>>Stripe integration currently only supports billing periods of "Month" or "Year".
365
+ <?php } elseif($gateway == "braintree") { ?>
366
+ <br /><strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>>Braintree integration currently only supports billing periods of "Month" or "Year".
367
+ <?php } ?>
368
+ </small>
369
+ <?php if($gateway == "braintree" && $edit < 0) { ?>
370
+ <p class="pmpro_message"><strong>Note:</strong> 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.</p>
371
+ <?php } elseif($gateway == "braintree") { ?>
372
+ <p class="pmpro_message"><strong>Note:</strong> You will need to create a "Plan" in your Braintree dashboard with the same settings and the "Plan ID" set to <em>pmpro_<?php echo $level->id;?></em>.</p>
373
+ <?php } ?>
374
+ </td>
375
+ </tr>
376
+
377
+ <tr class="recurring_info" <?php if(!pmpro_isLevelRecurring($level)) {?>style="display: none;"<?php } ?>>
378
+ <th scope="row" valign="top"><label for="billing_limit">Billing Cycle Limit:</label></th>
379
+ <td>
380
+ <input name="billing_limit" type="text" size="20" value="<?php echo $level->billing_limit?>" />
381
+ <br /><small>
382
+ 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.
383
+ <?php if($gateway == "stripe") { ?>
384
+ <br /><strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>>Stripe integration currently does not support billing limits. You can still set an expiration date below.</strong>
385
+ <?php } ?>
386
+ </small>
387
+ </td>
388
+ </tr>
389
+
390
+ <tr class="recurring_info" <?php if (!pmpro_isLevelRecurring($level)) echo "style='display:none;'";?>>
391
+ <th scope="row" valign="top"><label>Custom Trial:</label></th>
392
+ <td><input id="custom_trial" name="custom_trial" type="checkbox" value="yes" <?php if ( pmpro_isLevelTrial($level) ) { echo "checked='checked'"; } ?> onclick="jQuery('.trial_info').toggle();" /> Check to add a custom trial period.</td>
393
+ </tr>
394
+
395
+ <tr class="trial_info recurring_info" <?php if (!pmpro_isLevelTrial($level)) echo "style='display:none;'";?>>
396
+ <th scope="row" valign="top"><label for="trial_amount">Trial Billing Amount:</label></th>
397
+ <td>
398
+ <?php echo $pmpro_currency_symbol?><input name="trial_amount" type="text" size="20" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_amount))?>" />
399
+ <small>for the first</small>
400
+ <input name="trial_limit" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->trial_limit))?>" />
401
+ <small>subscription payments.</small>
402
+ <?php if($gateway == "stripe") { ?>
403
+ <br /><small>
404
+ <strong <?php if(!empty($pmpro_stripe_error)) { ?>class="pmpro_red"<?php } ?>>Stripe integration currently does not support trial amounts greater than $0.</strong>
405
+ </small>
406
+ <?php } elseif($gateway == "braintree") { ?>
407
+ <br /><small>
408
+ <strong <?php if(!empty($pmpro_braintree_error)) { ?>class="pmpro_red"<?php } ?>>Braintree integration currently does not support trial amounts greater than $0.</strong>
409
+ </small>
410
+ <?php } ?>
411
+ </td>
412
+ </tr>
413
+
414
+ </tbody>
415
+ </table>
416
+ <h3 class="topborder">Other Settings</h3>
417
+ <table class="form-table">
418
+ <tbody>
419
+ <tr>
420
+ <th scope="row" valign="top"><label>Disable New Signups:</label></th>
421
+ <td><input name="disable_signups" type="checkbox" value="yes" <?php if($level->id && !$level->allow_signups) { ?>checked="checked"<?php } ?> /> Check to hide this level from the membership levels page and disable registration.</td>
422
+ </tr>
423
+
424
+ <tr>
425
+ <th scope="row" valign="top"><label>Membership Expiration:</label></th>
426
+ <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();}" /> Check this to set an expiration date for new sign ups.</td>
427
+ </tr>
428
+
429
+ <tr class="expiration_info" <?php if(!pmpro_isLevelExpiring($level)) {?>style="display: none;"<?php } ?>>
430
+ <th scope="row" valign="top"><label for="billing_amount">Expires In:</label></th>
431
+ <td>
432
+ <input id="expiration_number" name="expiration_number" type="text" size="10" value="<?php echo str_replace("\"", "&quot;", stripslashes($level->expiration_number))?>" />
433
+ <select id="expiration_period" name="expiration_period">
434
+ <?php
435
+ $cycles = array( 'Day(s)' => 'Day', 'Week(s)' => 'Week', 'Month(s)' => 'Month', 'Year(s)' => 'Year' );
436
+ foreach ( $cycles as $name => $value ) {
437
+ echo "<option value='$value'";
438
+ if ( $level->expiration_period == $value ) echo " selected='selected'";
439
+ echo ">$name</option>";
440
+ }
441
+ ?>
442
+ </select>
443
+ <br /><small>How long before the expiration expires. Note that any future payments will be canceled when the membership expires.</small>
444
+ </td>
445
+ </tr>
446
+ </tbody>
447
+ </table>
448
+
449
+ <?php do_action("pmpro_membership_level_after_other_settings"); ?>
450
+
451
+ <h3 class="topborder">Content Settings</h3>
452
+ <table class="form-table">
453
+ <tbody>
454
+ <tr>
455
+ <th scope="row" valign="top"><label>Categories:</label></th>
456
+ <td>
457
+ <?php
458
+ $categories = get_categories( array( 'hide_empty' => 0 ) );
459
+ echo "<ul>";
460
+ foreach ( $categories as $cat )
461
+ {
462
+ $checked = in_array( $cat->term_id, $level->categories ) ? "checked='checked'" : '';
463
+ echo "<li><input name='membershipcategory_{$cat->term_id}' type='checkbox' value='yes' $checked /> {$cat->name}</li>\n";
464
+ }
465
+ echo "</ul>";
466
+ ?>
467
+ </td>
468
+ </tr>
469
+ </tbody>
470
+ </table>
471
+ <p class="submit topborder">
472
+ <input name="save" type="submit" class="button-primary" value="Save Level" />
473
+ <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-membershiplevels')?>';" />
474
+ </p>
475
+ </form>
476
+ </div>
477
+
478
+ <?php
479
+ }
480
+ else
481
+ {
482
+ ?>
483
+
484
+ <h2>Membership Levels <a href="admin.php?page=pmpro-membershiplevels&edit=-1" class="button add-new-h2">Add New Level</a></h2>
485
+ <form id="posts-filter" method="get" action="">
486
+ <p class="search-box">
487
+ <label class="screen-reader-text" for="post-search-input">Search Levels:</label>
488
+ <input type="hidden" name="page" value="pmpro-membershiplevels" />
489
+ <input id="post-search-input" type="text" value="<?php echo $s?>" name="s" size="30" />
490
+ <input class="button" type="submit" value="Search Levels" id="search-submit "/>
491
+ </p>
492
+ </form>
493
+
494
+ <br class="clear" />
495
+
496
+ <table class="widefat">
497
+ <thead>
498
+ <tr>
499
+ <th>ID</th>
500
+ <th>Name</th>
501
+ <th>Initial Payment</th>
502
+ <th>Billing Cycle</th>
503
+ <th>Trial Cycle</th>
504
+ <th>Expiration</th>
505
+ <th>Allow Signups</th>
506
+ <th></th>
507
+ <th></th>
508
+ <th></th>
509
+ </tr>
510
+ </thead>
511
+ <tbody>
512
+ <?php
513
+ $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
514
+ if($s)
515
+ $sqlQuery .= "WHERE name LIKE '%$s%' ";
516
+ $sqlQuery .= "ORDER BY id ASC";
517
+
518
+ $levels = $wpdb->get_results($sqlQuery, OBJECT);
519
+
520
+ foreach($levels as $level)
521
+ {
522
+ ?>
523
+ <tr class="<?php if(!$level->allow_signups) { ?>pmpro_gray<?php } ?> <?php if(!pmpro_checkLevelForStripeCompatibility($level) || !pmpro_checkLevelForBraintreeCompatibility($level)) { ?>pmpro_error<?php } ?>">
524
+ <td><?php echo $level->id?></td>
525
+ <td><?php echo $level->name?></td>
526
+ <td>
527
+ <?php if(pmpro_isLevelFree($level)) { ?>
528
+ FREE
529
+ <?php } else { ?>
530
+ <?php echo $pmpro_currency_symbol?><?php echo $level->initial_payment?>
531
+ <?php } ?>
532
+ </td>
533
+ <td>
534
+ <?php if(!pmpro_isLevelRecurring($level)) { ?>
535
+ --
536
+ <?php } else { ?>
537
+ <?php echo $pmpro_currency_symbol?><?php echo $level->billing_amount?> every <?php echo $level->cycle_number.' '.sornot($level->cycle_period,$level->cycle_number)?>
538
+
539
+ <?php if($level->billing_limit) { ?>(for <?php echo $level->billing_limit?> <?php echo sornot($level->cycle_period,$level->billing_limit)?>)<?php } ?>
540
+
541
+ <?php } ?>
542
+ </td>
543
+ <td>
544
+ <?php if(!pmpro_isLevelTrial($level)) { ?>
545
+ --
546
+ <?php } else { ?>
547
+ <?php echo $pmpro_currency_symbol?><?php echo $level->trial_amount?> for <?php echo $level->trial_limit?> <?php echo sornot("payment",$level->trial_limit)?>
548
+ <?php } ?>
549
+ </td>
550
+ <td>
551
+ <?php if(!pmpro_isLevelExpiring($level)) { ?>
552
+ --
553
+ <?php } else { ?>
554
+ After <?php echo $level->expiration_number?> <?php echo sornot($level->expiration_period,$level->expiration_number)?>
555
+ <?php } ?>
556
+ </td>
557
+ <td><?php if($level->allow_signups) { ?>Yes<?php } else { ?>No<?php } ?></td>
558
+ <td align="center"><a href="admin.php?page=pmpro-membershiplevels&edit=<?php echo $level->id?>" class="edit">edit</a></td>
559
+ <td align="center"><a href="admin.php?page=pmpro-membershiplevels&copy=<?php echo $level->id?>&edit=-1" class="edit">copy</a></td>
560
+ <td align="center"><a href="javascript: askfirst('Are you sure you want to delete membership level <?php echo $level->name?>? All subscriptions will be canceled.','admin.php?page=pmpro-membershiplevels&action=delete_membership_level&deleteid=<?php echo $level->id?>'); void(0);" class="delete">delete</a></td>
561
+ </tr>
562
+ <?php
563
+ }
564
+ ?>
565
+ </tbody>
566
+ </table>
567
+ <?php
568
+ }
569
+ ?>
570
+
571
+ <?php
572
+ require_once(dirname(__FILE__) . "/admin_footer.php");
573
+ ?>
574
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/memberslist-csv.php CHANGED
@@ -2,7 +2,7 @@
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist_csv")))
4
  {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
  }
7
 
8
  global $wpdb;
@@ -42,85 +42,26 @@
42
 
43
  if($s)
44
  {
45
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) 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 LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
46
-
47
- if($l == "oldmembers")
48
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
49
-
50
- $sqlQuery .= " WHERE mu.membership_id > 0 AND (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%') ";
51
 
52
- if($l == "oldmembers")
53
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
54
- elseif($l)
55
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . esc_sql($l) . "' ";
56
- else
57
- $sqlQuery .= " AND mu.status = 'active' ";
58
 
59
- $sqlQuery .= "GROUP BY u.ID ";
60
-
61
- if($l == "oldmembers")
62
- $sqlQuery .= "ORDER BY enddate DESC ";
63
- else
64
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
65
-
66
- if($limit)
67
- $sqlQuery .= "LIMIT $start, $limit";
68
  }
69
  else
70
  {
71
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, UNIX_TIMESTAMP(mu.enddate) as enddate FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
72
-
73
- if($l == "oldmembers")
74
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
75
-
76
- $sqlQuery .= " WHERE mu.membership_id > 0 ";
77
-
78
- if($l == "oldmembers")
79
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
80
- elseif($l)
81
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . $l . "' ";
82
- else
83
- $sqlQuery .= " AND mu.status = 'active' ";
84
-
85
- $sqlQuery .= "GROUP BY u.ID ";
86
-
87
- if($l == "oldmembers")
88
- $sqlQuery .= "ORDER BY enddate DESC ";
89
- else
90
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
91
-
92
  if($limit)
93
  $sqlQuery .= "LIMIT $start, $limit";
94
  }
95
-
96
- //filter
97
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
98
 
99
- //get users
100
- $theusers = $wpdb->get_col($sqlQuery);
101
-
102
- //begin output
103
- header("Content-type: text/csv");
104
- if($s && $l == "oldmembers")
105
- header("Content-Disposition: attachment; filename=members_list_expired_" . sanitize_file_name($s) . ".csv");
106
- elseif($s && $l)
107
- header("Content-Disposition: attachment; filename=members_list_" . intval($l) . "_level_" . sanitize_file_name($s) . ".csv");
108
- elseif($s)
109
- header("Content-Disposition: attachment; filename=members_list_" . sanitize_file_name($s) . ".csv");
110
- elseif($l == "oldmembers")
111
- header("Content-Disposition: attachment; filename=members_list_expired.csv");
112
- else
113
- header("Content-Disposition: attachment; filename=members_list.csv");
114
-
115
- $heading = "id,username,firstname,lastname,email,billing firstname,billing lastname,address1,address2,city,state,zipcode,country,phone,membership,initial payment,fee,term,discount_code_id,discount_code,joined";
116
-
117
- if($l == "oldmembers")
118
- $heading .= ",ended";
119
- else
120
- $heading .= ",expires";
121
-
122
- $heading = apply_filters("pmpro_members_list_csv_heading", $heading);
123
- $csvoutput = $heading;
124
 
125
  //these are the meta_keys for the fields (arrays are object, property. so e.g. $theuser->ID)
126
  $default_columns = array(
@@ -134,21 +75,16 @@
134
  array("metavalues", "pmpro_baddress1"),
135
  array("metavalues", "pmpro_baddress2"),
136
  array("metavalues", "pmpro_bcity"),
137
- array("metavalues", "pmpro_bstate"),
138
  array("metavalues", "pmpro_bzipcode"),
139
  array("metavalues", "pmpro_bcountry"),
140
  array("metavalues", "pmpro_bphone"),
141
  array("theuser", "membership"),
142
  array("theuser", "initial_payment"),
143
  array("theuser", "billing_amount"),
144
- array("theuser", "cycle_period"),
145
- array("discount_code", "id"),
146
- array("discount_code", "code")
147
  //joindate and enddate are handled specifically below
148
  );
149
-
150
- //filter
151
- $default_columns = apply_filters("pmpro_members_list_csv_default_columns", $default_columns);
152
 
153
  //any extra columns
154
  $extra_columns = apply_filters("pmpro_members_list_csv_extra_columns", array());
@@ -162,28 +98,15 @@
162
 
163
  $csvoutput .= "\n";
164
 
165
- //output
166
- echo $csvoutput;
167
- $csvoutput = "";
168
-
169
  if($theusers)
170
  {
171
- foreach($theusers as $user_id)
172
  {
173
- //MULTI: This query will need to be updated to support multiple levels per user. Should probably just dump multiple rows for each membership.
174
  //get meta
175
-
176
- if($l == "oldmembers")
177
- $theuser = $wpdb->get_row("SELECT u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) 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 LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE u.ID = '" . $user_id . "' ORDER BY mu.id DESC LIMIT 1");
178
- else
179
- $theuser = $wpdb->get_row("SELECT u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) 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.ID = '" . $user_id . "' LIMIT 1");
180
-
181
- $sqlQuery = "SELECT meta_key as `key`, meta_value as `value` FROM $wpdb->usermeta WHERE $wpdb->usermeta.user_id = '" . $user_id . "'";
182
  $metavalues = pmpro_getMetavalues($sqlQuery);
183
  $theuser->metavalues = $metavalues;
184
- $sqlQuery = "SELECT c.id, c.code FROM $wpdb->pmpro_discount_codes_uses cu LEFT JOIN $wpdb->pmpro_discount_codes c ON cu.code_id = c.id WHERE cu.user_id = '" . $theuser->ID . "' ORDER BY c.id DESC LIMIT 1";
185
- $discount_code = $wpdb->get_row($sqlQuery);
186
-
187
  //default columns
188
  if(!empty($default_columns))
189
  {
@@ -203,41 +126,41 @@
203
 
204
  //joindate and enddate
205
  $csvoutput .= "," . pmpro_enclose(date("Y-m-d", $theuser->joindate)) . ",";
206
-
207
- if($theuser->membership_id)
208
- {
209
- if($theuser->enddate)
210
- $csvoutput .= pmpro_enclose(apply_filters("pmpro_memberslist_expires_column", date("Y-m-d", $theuser->enddate), $theuser));
211
- else
212
- $csvoutput .= pmpro_enclose(apply_filters("pmpro_memberslist_expires_column", "Never", $theuser));
213
- }
214
- elseif($l == "oldmembers" && $theuser->enddate)
215
- {
216
  $csvoutput .= pmpro_enclose(date("Y-m-d", $theuser->enddate));
217
- }
218
  else
219
- $csvoutput .= "N/A";
220
-
221
  //any extra columns
222
  if(!empty($extra_columns))
223
  {
224
  foreach($extra_columns as $heading => $callback)
225
  {
226
- $csvoutput .= "," . pmpro_enclose(call_user_func($callback, $theuser, $heading));
227
  }
228
  }
229
 
230
  $csvoutput .= "\n";
231
-
232
- //output
233
- echo $csvoutput;
234
- $csvoutput = "";
235
  }
236
  }
237
-
 
 
 
 
 
 
 
 
 
 
 
 
238
  print $csvoutput;
239
 
240
  function pmpro_enclose($s)
241
  {
242
  return "\"" . str_replace("\"", "\\\"", $s) . "\"";
243
- }
 
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist_csv")))
4
  {
5
+ die("You do not have permissions to perform this action.");
6
  }
7
 
8
  global $wpdb;
42
 
43
  if($s)
44
  {
45
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) 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 LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE mu.status = 'active' AND mu.membership_id > 0 AND (u.user_login LIKE '%" . $wpdb->escape($s) . "%' OR u.user_email LIKE '%" . $wpdb->escape($s) . "%' OR um.meta_value LIKE '%" . $wpdb->escape($s) . "%') ";
 
 
 
 
 
46
 
47
+ if($l)
48
+ $sqlQuery .= " AND mu.membership_id = '" . $wpdb->escape($l) . "' ";
 
 
 
 
49
 
50
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
 
 
 
 
 
 
 
 
51
  }
52
  else
53
  {
54
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, u.user_login, u.user_nicename, u.user_url, u.user_registered, u.user_status, u.display_name, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
55
+ $sqlQuery .= " WHERE mu.membership_id > 0 AND mu.status = 'active' ";
56
+ if($l)
57
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
58
+ $sqlQuery .= "ORDER BY user_registered DESC ";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  if($limit)
60
  $sqlQuery .= "LIMIT $start, $limit";
61
  }
 
 
 
62
 
63
+ $theusers = $wpdb->get_results($sqlQuery);
64
+ $csvoutput = "id,username,firstname,lastname,email,billing firstname,billing lastname,address1,address2,city,state,zipcode,country,phone,membership,initial payment,fee,term,joined,expires";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
  //these are the meta_keys for the fields (arrays are object, property. so e.g. $theuser->ID)
67
  $default_columns = array(
75
  array("metavalues", "pmpro_baddress1"),
76
  array("metavalues", "pmpro_baddress2"),
77
  array("metavalues", "pmpro_bcity"),
78
+ array("metavalues", "pmpro_bzipcode"),
79
  array("metavalues", "pmpro_bzipcode"),
80
  array("metavalues", "pmpro_bcountry"),
81
  array("metavalues", "pmpro_bphone"),
82
  array("theuser", "membership"),
83
  array("theuser", "initial_payment"),
84
  array("theuser", "billing_amount"),
85
+ array("theuser", "cycle_period")
 
 
86
  //joindate and enddate are handled specifically below
87
  );
 
 
 
88
 
89
  //any extra columns
90
  $extra_columns = apply_filters("pmpro_members_list_csv_extra_columns", array());
98
 
99
  $csvoutput .= "\n";
100
 
 
 
 
 
101
  if($theusers)
102
  {
103
+ foreach($theusers as $theuser)
104
  {
 
105
  //get meta
106
+ $sqlQuery = "SELECT meta_key as `key`, meta_value as `value` FROM $wpdb->usermeta WHERE $wpdb->usermeta.user_id = '" . $theuser->ID . "'";
 
 
 
 
 
 
107
  $metavalues = pmpro_getMetavalues($sqlQuery);
108
  $theuser->metavalues = $metavalues;
109
+
 
 
110
  //default columns
111
  if(!empty($default_columns))
112
  {
126
 
127
  //joindate and enddate
128
  $csvoutput .= "," . pmpro_enclose(date("Y-m-d", $theuser->joindate)) . ",";
129
+ if($theuser->enddate)
 
 
 
 
 
 
 
 
 
130
  $csvoutput .= pmpro_enclose(date("Y-m-d", $theuser->enddate));
 
131
  else
132
+ $csvoutput .= pmpro_enclose("Never");
133
+
134
  //any extra columns
135
  if(!empty($extra_columns))
136
  {
137
  foreach($extra_columns as $heading => $callback)
138
  {
139
+ $csvoutput .= "," . pmpro_enclose(call_user_func($callback, $theuser));
140
  }
141
  }
142
 
143
  $csvoutput .= "\n";
144
+
 
 
 
145
  }
146
  }
147
+
148
+ $size_in_bytes = strlen($csvoutput);
149
+ header("Content-type: text/csv");
150
+ //header("Content-type: application/vnd.ms-excel");
151
+ if($s && $l)
152
+ header("Content-Disposition: attachment; filename=members_list_" . intval($l) . "_level" . sanitize_file_name($s) . ".csv; size=$size_in_bytes");
153
+ elseif($s)
154
+ header("Content-Disposition: attachment; filename=members_list_" . sanitize_file_name($s) . ".csv; size=$size_in_bytes");
155
+ elseif($l)
156
+ header("Content-Disposition: attachment; filename=members_list_level" . intval($l) . ".csv; size=$size_in_bytes");
157
+ else
158
+ header("Content-Disposition: attachment; filename=members_list.csv; size=$size_in_bytes");
159
+
160
  print $csvoutput;
161
 
162
  function pmpro_enclose($s)
163
  {
164
  return "\"" . str_replace("\"", "\\\"", $s) . "\"";
165
+ }
166
+ ?>
adminpages/memberslist.php CHANGED
@@ -1,238 +1,205 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- //vars
9
- global $wpdb, $pmpro_currency_symbol;
10
- if(isset($_REQUEST['s']))
11
- $s = $_REQUEST['s'];
12
- else
13
- $s = "";
14
-
15
- if(isset($_REQUEST['l']))
16
- $l = $_REQUEST['l'];
17
- else
18
- $l = false;
19
-
20
- require_once(dirname(__FILE__) . "/admin_header.php");
21
- ?>
22
-
23
- <form id="posts-filter" method="get" action="">
24
- <h2>
25
- <?php _e('Members List', 'pmpro');?>
26
- <a target="_blank" href="<?php echo admin_url('admin-ajax.php');?>?action=memberslist_csv&s=<?php echo $s?>&l=<?php echo $l?>" class="add-new-h2"><?php _e('Export to CSV', 'pmpro');?></a>
27
- </h2>
28
- <ul class="subsubsub">
29
- <li>
30
- <?php _e('Show', 'pmpro');?>
31
- <select name="l" onchange="jQuery('#posts-filter').submit();">
32
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro');?></option>
33
- <?php
34
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
35
- foreach($levels as $level)
36
- {
37
- ?>
38
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
39
- <?php
40
- }
41
- ?>
42
- <option value="oldmembers" <?php if($l == "oldmembers") { ?>selected="selected"<?php } ?>><?php _e('Old Members', 'pmpro');?></option>
43
- </select>
44
- </li>
45
- </ul>
46
- <p class="search-box">
47
- <label class="hidden" for="post-search-input"><?php _e('Search Members', 'pmpro');?>:</label>
48
- <input type="hidden" name="page" value="pmpro-memberslist" />
49
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
50
- <input class="button" type="submit" value="<?php _e('Search Members', 'pmpro');?>"/>
51
- </p>
52
- <?php
53
- //some vars for the search
54
- if(isset($_REQUEST['pn']))
55
- $pn = $_REQUEST['pn'];
56
- else
57
- $pn = 1;
58
-
59
- if(isset($_REQUEST['limit']))
60
- $limit = $_REQUEST['limit'];
61
- else
62
- $limit = 15;
63
-
64
- $end = $pn * $limit;
65
- $start = $end - $limit;
66
-
67
- if($s)
68
- {
69
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) 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(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) 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 LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
70
-
71
- if($l == "oldmembers")
72
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
73
-
74
- $sqlQuery .= " WHERE mu.membership_id > 0 AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
75
-
76
- if($l == "oldmembers")
77
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
78
- elseif($l)
79
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . $l . "' ";
80
- else
81
- $sqlQuery .= " AND mu.status = 'active' ";
82
-
83
- $sqlQuery .= "GROUP BY u.ID ";
84
-
85
- if($l == "oldmembers")
86
- $sqlQuery .= "ORDER BY enddate DESC ";
87
- else
88
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
89
-
90
- $sqlQuery .= "LIMIT $start, $limit";
91
- }
92
- else
93
- {
94
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) 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(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
95
-
96
- if($l == "oldmembers")
97
- $sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
98
-
99
- $sqlQuery .= " WHERE mu.membership_id > 0 ";
100
-
101
- if($l == "oldmembers")
102
- $sqlQuery .= " AND mu.status = 'inactive' AND mu2.status IS NULL ";
103
- elseif($l)
104
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . $l . "' ";
105
- else
106
- $sqlQuery .= " AND mu.status = 'active' ";
107
- $sqlQuery .= "GROUP BY u.ID ";
108
-
109
- if($l == "oldmembers")
110
- $sqlQuery .= "ORDER BY enddate DESC ";
111
- else
112
- $sqlQuery .= "ORDER BY u.user_registered DESC ";
113
-
114
- $sqlQuery .= "LIMIT $start, $limit";
115
- }
116
-
117
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
118
-
119
- $theusers = $wpdb->get_results($sqlQuery);
120
- $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
121
-
122
- if($theusers)
123
- {
124
- $calculate_revenue = apply_filters("pmpro_memberslist_calculate_revenue", false);
125
- if($calculate_revenue)
126
- {
127
- $initial_payments = pmpro_calculateInitialPaymentRevenue($s, $l);
128
- $recurring_payments = pmpro_calculateRecurringRevenue($s, $l);
129
- ?>
130
- <p class="clear"><?php echo strval($totalrows)?> members found. These members have paid <strong>$<?php echo number_format($initial_payments)?> in initial payments</strong> and will generate an estimated <strong>$<?php echo number_format($recurring_payments)?> in revenue over the next year</strong>, or <strong>$<?php echo number_format($recurring_payments/12)?>/month</strong>. <span class="pmpro_lite">(This estimate does not take into account trial periods or billing limits.)</span></p>
131
- <?php
132
- }
133
- else
134
- {
135
- ?>
136
- <p class="clear"><?php printf(__("%d members found.", "pmpro"), $totalrows);?></span></p>
137
- <?php
138
- }
139
- }
140
- ?>
141
- <table class="widefat">
142
- <thead>
143
- <tr class="thead">
144
- <th><?php _e('ID', 'pmpro');?></th>
145
- <th><?php _e('Username', 'pmpro');?></th>
146
- <th><?php _e('First&nbsp;Name', 'pmpro');?></th>
147
- <th><?php _e('Last&nbsp;Name', 'pmpro');?></th>
148
- <th><?php _e('Email', 'pmpro');?></th>
149
- <?php do_action("pmpro_memberslist_extra_cols_header", $theusers);?>
150
- <th><?php _e('Billing Address', 'pmpro');?></th>
151
- <th><?php _e('Membership', 'pmpro');?></th>
152
- <th><?php _e('Fee', 'pmpro');?></th>
153
- <th><?php _e('Joined', 'pmpro');?></th>
154
- <th>
155
- <?php
156
- if($l == "oldmembers")
157
- _e('Ended', 'pmpro');
158
- else
159
- _e('Expires', 'pmpro');
160
- ?>
161
- </th>
162
- </tr>
163
- </thead>
164
- <tbody id="users" class="list:user user-list">
165
- <?php
166
- $count = 0;
167
- foreach($theusers as $auser)
168
- {
169
- //get meta
170
- $theuser = get_userdata($auser->ID);
171
- ?>
172
- <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
173
- <td><?php echo $theuser->ID?></td>
174
- <td>
175
- <?php echo get_avatar($theuser->ID, 32)?>
176
- <strong>
177
- <?php
178
- $userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
179
- $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
180
- echo $userlink;
181
- ?>
182
- </strong>
183
- </td>
184
- <td><?php echo $theuser->first_name?></td>
185
- <td><?php echo $theuser->last_name?></td>
186
- <td><a href="mailto:<?php echo $theuser->user_email?>"><?php echo $theuser->user_email?></a></td>
187
- <?php do_action("pmpro_memberslist_extra_cols_body", $theuser);?>
188
- <td>
189
- <?php
190
- echo pmpro_formatAddress(trim($theuser->pmpro_bfirstname . " " . $theuser->pmpro_blastname), $theuser->pmpro_baddress1, $theuser->pmpro_baddress2, $theuser->pmpro_bcity, $theuser->pmpro_bstate, $theuser->pmpro_bzipcode, $theuser->pmpro_bcountry, $theuser->pmpro_bphone);
191
- ?>
192
- </td>
193
- <td><?php echo $auser->membership?></td>
194
- <td>
195
- <?php if((float)$auser->initial_payment > 0) { ?>
196
- <?php echo $pmpro_currency_symbol; ?><?php echo $auser->initial_payment?>
197
- <?php } ?>
198
- <?php if((float)$auser->initial_payment > 0 && (float)$auser->billing_amount > 0) { ?>+<br /><?php } ?>
199
- <?php if((float)$auser->billing_amount > 0) { ?>
200
- <?php echo $pmpro_currency_symbol; ?><?php echo $auser->billing_amount?>/<?php echo $auser->cycle_period?>
201
- <?php } ?>
202
- <?php if((float)$auser->initial_payment <= 0 && (float)$auser->billing_amount <= 0) { ?>
203
- -
204
- <?php } ?>
205
- </td>
206
- <td><?php echo date(get_option("date_format"), strtotime($theuser->user_registered, current_time("timestamp")))?></td>
207
- <td>
208
- <?php
209
- if($auser->enddate)
210
- echo apply_filters("pmpro_memberslist_expires_column", date(get_option('date_format'), $auser->enddate), $auser);
211
- else
212
- echo __(apply_filters("pmpro_memberslist_expires_column", "Never", $auser), "pmpro");
213
- ?>
214
- </td>
215
- </tr>
216
- <?php
217
- }
218
-
219
- if(!$theusers)
220
- {
221
- ?>
222
- <tr>
223
- <td colspan="9"><p><?php _e("No members found.", "pmpro");?> <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo $s?>"><?php _e("Search all levels", "pmpro");?></a>.<?php } ?></p></td>
224
- </tr>
225
- <?php
226
- }
227
- ?>
228
- </tbody>
229
- </table>
230
- </form>
231
-
232
- <?php
233
- echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-memberslist&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
234
- ?>
235
-
236
- <?php
237
- require_once(dirname(__FILE__) . "/admin_footer.php");
238
- ?>
1
+ <?php
2
+ //only admins can get this
3
+ if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist")))
4
+ {
5
+ die("You do not have permissions to perform this action.");
6
+ }
7
+
8
+ //vars
9
+ global $wpdb, $pmpro_currency_symbol;
10
+ if(isset($_REQUEST['s']))
11
+ $s = $_REQUEST['s'];
12
+ else
13
+ $s = "";
14
+
15
+ if(isset($_REQUEST['l']))
16
+ $l = $_REQUEST['l'];
17
+ else
18
+ $l = false;
19
+ ?>
20
+ <div class="wrap pmpro_admin">
21
+ <div class="pmpro_banner">
22
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
23
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
24
+
25
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
26
+ </div>
27
+ <br style="clear:both;" />
28
+
29
+ <form id="posts-filter" method="get" action="">
30
+ <h2>
31
+ Members Report
32
+ <small>(<a target="_blank" href="<?php echo admin_url('admin-ajax.php');?>?action=memberslist_csv&s=<?php echo $s?>&l=<?php echo $l?>">Export to CSV</a>)</small>
33
+ </h2>
34
+ <ul class="subsubsub">
35
+ <li>
36
+ Show <select name="l" onchange="jQuery('#posts-filter').submit();">
37
+ <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>>All Levels</option>
38
+ <?php
39
+ $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
40
+ foreach($levels as $level)
41
+ {
42
+ ?>
43
+ <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
44
+ <?php
45
+ }
46
+ ?>
47
+ </select>
48
+ </li>
49
+ </ul>
50
+ <p class="search-box">
51
+ <label class="hidden" for="post-search-input">Search Members:</label>
52
+ <input type="hidden" name="page" value="pmpro-memberslist" />
53
+ <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
54
+ <input class="button" type="submit" value="Search Members"/>
55
+ </p>
56
+ <?php
57
+ //some vars for the search
58
+ if(isset($_REQUEST['pn']))
59
+ $pn = $_REQUEST['pn'];
60
+ else
61
+ $pn = 1;
62
+
63
+ if(isset($_REQUEST['limit']))
64
+ $limit = $_REQUEST['limit'];
65
+ else
66
+ $limit = 15;
67
+
68
+ $end = $pn * $limit;
69
+ $start = $end - $limit;
70
+
71
+ if($s)
72
+ {
73
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) 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(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) 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 LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE mu.status = 'active' AND mu.membership_id > 0 AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
74
+
75
+ if($l)
76
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
77
+
78
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
79
+ }
80
+ else
81
+ {
82
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) 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(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
83
+ $sqlQuery .= " WHERE mu.membership_id > 0 AND mu.status = 'active' ";
84
+ if($l)
85
+ $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
86
+ $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
87
+ }
88
+
89
+ $theusers = $wpdb->get_results($sqlQuery);
90
+ $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
91
+
92
+ if($theusers)
93
+ {
94
+ $calculate_revenue = apply_filters("pmpro_memberslist_calculate_revenue", false);
95
+ if($calculate_revenue)
96
+ {
97
+ $initial_payments = pmpro_calculateInitialPaymentRevenue($s, $l);
98
+ $recurring_payments = pmpro_calculateRecurringRevenue($s, $l);
99
+ ?>
100
+ <p class="clear"><?php echo strval($totalrows)?> members found. These members have paid <strong>$<?php echo number_format($initial_payments)?> in initial payments</strong> and will generate an estimated <strong>$<?php echo number_format($recurring_payments)?> in revenue over the next year</strong>, or <strong>$<?php echo number_format($recurring_payments/12)?>/month</strong>. <span class="pmpro_lite">(This estimate does not take into account trial periods or billing limits.)</span></p>
101
+ <?php
102
+ }
103
+ else
104
+ {
105
+ ?>
106
+ <p class="clear"><?php echo strval($totalrows)?> members found.
107
+ <?php
108
+ }
109
+ }
110
+ ?>
111
+ <table class="widefat">
112
+ <thead>
113
+ <tr class="thead">
114
+ <th>ID</th>
115
+ <th>Username</th>
116
+ <th>First&nbsp;Name</th>
117
+ <th>Last&nbsp;Name</th>
118
+ <th>Email</th>
119
+ <?php do_action("pmpro_memberslist_extra_cols_header", $theusers);?>
120
+ <th>Billing Address</th>
121
+ <th>Membership</th>
122
+ <th>Fee</th>
123
+ <th>Joined</th>
124
+ <th>Expires</th>
125
+ </tr>
126
+ </thead>
127
+ <tbody id="users" class="list:user user-list">
128
+ <?php
129
+ $count = 0;
130
+ foreach($theusers as $auser)
131
+ {
132
+ //get meta
133
+ $theuser = get_userdata($auser->ID);
134
+ ?>
135
+ <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
136
+ <td><?php echo $theuser->ID?></td>
137
+ <td>
138
+ <?php echo get_avatar($theuser->ID, 32)?>
139
+ <strong><a href="user-edit.php?user_id=<?php echo $theuser->ID?>"><?php echo $theuser->user_login?></a></strong>
140
+ </td>
141
+ <td><?php echo $theuser->first_name?></td>
142
+ <td><?php echo $theuser->last_name?></td>
143
+ <td><a href="mailto:<?php echo $theuser->user_email?>"><?php echo $theuser->user_email?></a></td>
144
+ <?php do_action("pmpro_memberslist_extra_cols_body", $theuser);?>
145
+ <td>
146
+ <?php
147
+ if(empty($theuser->pmpro_bfirstname))
148
+ $theuser->pmpro_bfirstname = "";
149
+ if(empty($theuser->pmpro_blastname))
150
+ $theuser->pmpro_blastname = "";
151
+ echo trim($theuser->pmpro_bfirstname . " " . $theuser->pmpro_blastname);
152
+ ?><br />
153
+ <?php if(!empty($theuser->pmpro_baddress1)) { ?>
154
+ <?php echo $theuser->pmpro_baddress1; ?><br />
155
+ <?php if(!empty($theuser->pmpro_baddress2)) echo $theuser->pmpro_baddress2 . "<br />"; ?>
156
+ <?php if($theuser->pmpro_bcity && $theuser->pmpro_bstate) { ?>
157
+ <?php echo $theuser->pmpro_bcity?>, <?php echo $theuser->pmpro_bstate?> <?php echo $theuser->pmpro_bzipcode?> <?php if(!empty($theuser->pmpro_bcountry)) echo $theuser->pmpro_bcountry?><br />
158
+ <?php } ?>
159
+ <?php } ?>
160
+ <?php if(!empty($theuser->pmpro_bphone)) echo formatPhone($theuser->pmpro_bphone);?>
161
+ </td>
162
+ <td><?php echo $auser->membership?></td>
163
+ <td>
164
+ <?php if((float)$auser->initial_payment > 0) { ?>
165
+ <?php echo $pmpro_currency_symbol; ?><?php echo $auser->initial_payment?>
166
+ <?php } ?>
167
+ <?php if((float)$auser->initial_payment > 0 && (float)$auser->billing_amount > 0) { ?>+<br /><?php } ?>
168
+ <?php if((float)$auser->billing_amount > 0) { ?>
169
+ <?php echo $pmpro_currency_symbol; ?><?php echo $auser->billing_amount?>/<?php echo $auser->cycle_period?>
170
+ <?php } ?>
171
+ <?php if((float)$auser->initial_payment <= 0 && (float)$auser->billing_amount <= 0) { ?>
172
+ -
173
+ <?php } ?>
174
+ </td>
175
+ <td><?php echo date("m/d/Y", strtotime($theuser->user_registered))?></td>
176
+ <td>
177
+ <?php
178
+ if($auser->enddate)
179
+ echo date(get_option('date_format'), $auser->enddate);
180
+ else
181
+ echo "Never";
182
+ ?>
183
+ </td>
184
+ </tr>
185
+ <?php
186
+ }
187
+
188
+ if(!$theusers)
189
+ {
190
+ ?>
191
+ <tr>
192
+ <td colspan="9"><p>No members found. <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo $s?>">Search all levels</a>.<?php } ?></p></td>
193
+ </tr>
194
+ <?php
195
+ }
196
+ ?>
197
+ </tbody>
198
+ </table>
199
+ </form>
200
+
201
+ <?php
202
+ echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-memberslist&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
203
+ ?>
204
+
205
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/orders-csv.php CHANGED
@@ -2,7 +2,7 @@
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_orders_csv")))
4
  {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
  }
7
 
8
  global $wpdb;
@@ -17,51 +17,6 @@
17
  $l = $_REQUEST['l'];
18
  else
19
  $l = false;
20
-
21
- if(isset($_REQUEST['start-month']))
22
- $start_month = $_REQUEST['start-month'];
23
- else
24
- $start_month = "1";
25
-
26
- if(isset($_REQUEST['start-day']))
27
- $start_day = $_REQUEST['start-day'];
28
- else
29
- $start_day = "1";
30
-
31
- if(isset($_REQUEST['start-year']))
32
- $start_year = $_REQUEST['start-year'];
33
- else
34
- $start_year = date("Y");
35
-
36
- if(isset($_REQUEST['end-month']))
37
- $end_month = $_REQUEST['end-month'];
38
- else
39
- $end_month = date("n");
40
-
41
- if(isset($_REQUEST['end-day']))
42
- $end_day = $_REQUEST['end-day'];
43
- else
44
- $end_day = date("j");
45
-
46
- if(isset($_REQUEST['end-year']))
47
- $end_year = $_REQUEST['end-year'];
48
- else
49
- $end_year = date("Y");
50
-
51
- if(isset($_REQUEST['predefined-date']))
52
- $predefined_date = $_REQUEST['predefined-date'];
53
- else
54
- $predefined_date = "This Month";
55
-
56
- if(isset($_REQUEST['status']))
57
- $status = $_REQUEST['status'];
58
- else
59
- $status = "";
60
-
61
- if(isset($_REQUEST['filter']))
62
- $filter = sanitize_text_field($_REQUEST['filter']);
63
- else
64
- $filter = "all";
65
 
66
  //some vars for the search
67
  if(!empty($_REQUEST['pn']))
@@ -85,62 +40,6 @@
85
  $start = NULL;
86
  }
87
 
88
- //filters
89
- if($filter == "all" || !$filter)
90
- $condition = "1=1";
91
- elseif($filter == "within-a-date-range")
92
- {
93
- $start_date = $start_year."-".$start_month."-".$start_day;
94
- $end_date = $end_year."-".$end_month."-".$end_day;
95
-
96
- //add times to dates
97
- $start_date = $start_date . " 00:00:00";
98
- $end_date = $end_date . " 23:59:59";
99
-
100
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
101
- }
102
- elseif($filter == "predefined-date-range")
103
- {
104
- if($predefined_date == "Last Month")
105
- {
106
- $start_date = date("Y-m-d", strtotime("first day of last month", current_time("timestamp")));
107
- $end_date = date("Y-m-d", strtotime("last day of last month", current_time("timestamp")));
108
- }
109
- elseif($predefined_date == "This Month")
110
- {
111
- $start_date = date("Y-m-d", strtotime("first day of this month", current_time("timestamp")));
112
- $end_date = date("Y-m-d", strtotime("last day of this month", current_time("timestamp")));
113
- }
114
- elseif($predefined_date == "This Year")
115
- {
116
- $year = date('Y');
117
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
118
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
119
- }
120
-
121
- elseif($predefined_date == "Last Year")
122
- {
123
- $year = date('Y') - 1;
124
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
125
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
126
- }
127
-
128
- //add times to dates
129
- $start_date = $start_date . " 00:00:00";
130
- $end_date = $end_date . " 23:59:59";
131
-
132
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
133
- }
134
- elseif($filter == "within-a-level")
135
- {
136
- $condition = "membership_id = $l";
137
- }
138
- elseif($filter == "within-a-status")
139
- {
140
- $condition = "status = '$status' ";
141
- }
142
-
143
- //string search
144
  if($s)
145
  {
146
  $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 ";
@@ -150,42 +49,30 @@
150
  $sqlQuery .= "LEFT JOIN $wpdb->usermeta um ON o.user_id = um.user_id ";
151
 
152
  $sqlQuery .= "WHERE (1=2 ";
153
-
154
  $fields = array("o.id", "o.code", "o.billing_name", "o.billing_street", "o.billing_city", "o.billing_state", "o.billing_zip", "o.billing_phone", "o.payment_type", "o.cardtype", "o.accountnumber", "o.status", "o.gateway", "o.gateway_environment", "o.payment_transaction_id", "o.subscription_transaction_id", "u.user_login", "u.user_email", "u.display_name", "l.name");
155
 
156
  if($join_with_usermeta)
157
  $fields[] = "um.meta_value";
158
-
159
  $fields = apply_filters("pmpro_orders_search_fields", $fields);
160
 
161
  foreach($fields as $field)
162
- $sqlQuery .= " OR " . $field . " LIKE '%" . esc_sql($s) . "%' ";
163
  $sqlQuery .= ") ";
164
-
165
- $sqlQuery .= "AND " . $condition . " ";
166
-
167
- $sqlQuery .= "GROUP BY o.id ORDER BY o.id DESC, o.timestamp DESC ";
168
  }
169
  else
170
  {
171
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders WHERE ".$condition." ORDER BY id DESC, timestamp DESC ";
172
  }
173
 
174
- if(!empty($start) && !empty($limit))
175
  $sqlQuery .= "LIMIT $start, $limit";
176
 
177
  $order_ids = $wpdb->get_col($sqlQuery);
178
 
179
- //begin output
180
- header("Content-type: text/csv");
181
-
182
- $filename = "orders.csv";
183
- /*
184
- Insert logic here for building filename from $filter and other values.
185
- */
186
- header("Content-Disposition: attachment; filename=$filename;");
187
-
188
- $csvoutput = "id,user_id,user_login,first_name,last_name,user_email,billing_name,billing_street,billing_city,billing_state,billing_zip,billing_country,billing_phone,membership_id,level_name,subtotal,tax,couponamount,total,payment_type,cardtype,accountnumber,expirationmonth,expirationyear,status,gateway,gateway_environment,payment_transaction_id,subscription_transaction_id,discount_code_id,discount_code,timestamp";
189
 
190
  //these are the meta_keys for the fields (arrays are object, property. so e.g. $theuser->ID)
191
  $default_columns = array(
@@ -205,7 +92,7 @@
205
  array("order", "membership_id"),
206
  array("level", "name"),
207
  array("order", "subtotal"),
208
- array("order", "tax"),
209
  array("order", "couponamount"),
210
  array("order", "total"),
211
  array("order", "payment_type"),
@@ -217,9 +104,7 @@
217
  array("order", "gateway"),
218
  array("order", "gateway_environment"),
219
  array("order", "payment_transaction_id"),
220
- array("order", "subscription_transactiond_id"),
221
- array("discount_code", "id"),
222
- array("discount_code", "code")
223
  );
224
 
225
  //any extra columns
@@ -234,10 +119,6 @@
234
 
235
  $csvoutput .= "\n";
236
 
237
- //output
238
- echo $csvoutput;
239
- $csvoutput = "";
240
-
241
  if($order_ids)
242
  {
243
  foreach($order_ids as $order_id)
@@ -247,8 +128,6 @@
247
  $order->getMemberOrderByID($order_id);
248
  $user = get_userdata($order->user_id);
249
  $level = $order->getMembershipLevel();
250
- $sqlQuery = "SELECT c.id, c.code FROM $wpdb->pmpro_discount_codes_uses cu LEFT JOIN $wpdb->pmpro_discount_codes c ON cu.code_id = c.id WHERE cu.order_id = '" . $order_id . "' LIMIT 1";
251
- $discount_code = $wpdb->get_row($sqlQuery);
252
 
253
  //default columns
254
  if(!empty($default_columns))
@@ -282,12 +161,21 @@
282
  }
283
 
284
  $csvoutput .= "\n";
285
-
286
- //output
287
- echo $csvoutput;
288
- $csvoutput = "";
289
  }
290
- }
 
 
 
 
 
 
 
 
 
 
 
 
291
 
292
  print $csvoutput;
293
 
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_orders_csv")))
4
  {
5
+ die("You do not have permissions to perform this action.");
6
  }
7
 
8
  global $wpdb;
17
  $l = $_REQUEST['l'];
18
  else
19
  $l = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
  //some vars for the search
22
  if(!empty($_REQUEST['pn']))
40
  $start = NULL;
41
  }
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  if($s)
44
  {
45
  $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 ";
49
  $sqlQuery .= "LEFT JOIN $wpdb->usermeta um ON o.user_id = um.user_id ";
50
 
51
  $sqlQuery .= "WHERE (1=2 ";
52
+
53
  $fields = array("o.id", "o.code", "o.billing_name", "o.billing_street", "o.billing_city", "o.billing_state", "o.billing_zip", "o.billing_phone", "o.payment_type", "o.cardtype", "o.accountnumber", "o.status", "o.gateway", "o.gateway_environment", "o.payment_transaction_id", "o.subscription_transaction_id", "u.user_login", "u.user_email", "u.display_name", "l.name");
54
 
55
  if($join_with_usermeta)
56
  $fields[] = "um.meta_value";
57
+
58
  $fields = apply_filters("pmpro_orders_search_fields", $fields);
59
 
60
  foreach($fields as $field)
61
+ $sqlQuery .= " OR " . $field . " LIKE '%" . $wpdb->escape($s) . "%' ";
62
  $sqlQuery .= ") ";
63
+ $sqlQuery .= "ORDER BY o.timestamp DESC ";
 
 
 
64
  }
65
  else
66
  {
67
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders ORDER BY timestamp DESC ";
68
  }
69
 
70
+ if($limit)
71
  $sqlQuery .= "LIMIT $start, $limit";
72
 
73
  $order_ids = $wpdb->get_col($sqlQuery);
74
 
75
+ $csvoutput = "id,user_id,user_login,first_name,last_name,user_email,billing_name,billing_street,billing_city,billing_state,billing_zip,billing_country,billing_phone,membership_id,level_name,subtotal,tax,couponamount,total,payment_type,cardtype,accountnumber,expirationmonth,expirationyear,status,gateway,gateway_environment,payment_transaction_id,subscription_transaction_id,timestamp";
 
 
 
 
 
 
 
 
 
76
 
77
  //these are the meta_keys for the fields (arrays are object, property. so e.g. $theuser->ID)
78
  $default_columns = array(
92
  array("order", "membership_id"),
93
  array("level", "name"),
94
  array("order", "subtotal"),
95
+ array("order", "tax"),
96
  array("order", "couponamount"),
97
  array("order", "total"),
98
  array("order", "payment_type"),
104
  array("order", "gateway"),
105
  array("order", "gateway_environment"),
106
  array("order", "payment_transaction_id"),
107
+ array("order", "subscription_transactiond_id")
 
 
108
  );
109
 
110
  //any extra columns
119
 
120
  $csvoutput .= "\n";
121
 
 
 
 
 
122
  if($order_ids)
123
  {
124
  foreach($order_ids as $order_id)
128
  $order->getMemberOrderByID($order_id);
129
  $user = get_userdata($order->user_id);
130
  $level = $order->getMembershipLevel();
 
 
131
 
132
  //default columns
133
  if(!empty($default_columns))
161
  }
162
 
163
  $csvoutput .= "\n";
164
+
 
 
 
165
  }
166
+ }
167
+
168
+ $size_in_bytes = strlen($csvoutput);
169
+ header("Content-type: text/csv");
170
+ //header("Content-type: application/vnd.ms-excel");
171
+ if($s && $l)
172
+ header("Content-Disposition: attachment; filename=orders" . intval($l) . "_level" . sanitize_file_name($s) . ".csv; size=$size_in_bytes");
173
+ elseif($s)
174
+ header("Content-Disposition: attachment; filename=orders_" . sanitize_file_name($s) . ".csv; size=$size_in_bytes");
175
+ elseif($l)
176
+ header("Content-Disposition: attachment; filename=orders_level" . intval($l) . ".csv; size=$size_in_bytes");
177
+ else
178
+ header("Content-Disposition: attachment; filename=orders.csv; size=$size_in_bytes");
179
 
180
  print $csvoutput;
181
 
adminpages/orders.php CHANGED
@@ -2,7 +2,7 @@
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_orders")))
4
  {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
  }
7
 
8
  //vars
@@ -16,47 +16,6 @@
16
  $l = $_REQUEST['l'];
17
  else
18
  $l = false;
19
-
20
- if(isset($_REQUEST['start-month']))
21
- $start_month = $_REQUEST['start-month'];
22
- else
23
- $start_month = "1";
24
-
25
- if(isset($_REQUEST['start-day']))
26
- $start_day = $_REQUEST['start-day'];
27
- else
28
- $start_day = "1";
29
-
30
- if(isset($_REQUEST['start-year']))
31
- $start_year = $_REQUEST['start-year'];
32
- else
33
- $start_year = date("Y");
34
-
35
- if(isset($_REQUEST['end-month']))
36
- $end_month = $_REQUEST['end-month'];
37
- else
38
- $end_month = date("n");
39
-
40
- if(isset($_REQUEST['end-day']))
41
- $end_day = $_REQUEST['end-day'];
42
- else
43
- $end_day = date("j");
44
-
45
- if(isset($_REQUEST['end-year']))
46
- $end_year = $_REQUEST['end-year'];
47
- else
48
- $end_year = date("Y");
49
-
50
- if(isset($_REQUEST['predefined-date']))
51
- $predefined_date = $_REQUEST['predefined-date'];
52
- else
53
- $predefined_date = "This Month";
54
-
55
- if(isset($_REQUEST['status']))
56
- $status = $_REQUEST['status'];
57
- else
58
- $status = "";
59
-
60
 
61
  //deleting?
62
  if(!empty($_REQUEST['delete']))
@@ -64,25 +23,16 @@
64
  $dorder = new MemberOrder(intval($_REQUEST['delete']));
65
  if($dorder->deleteMe())
66
  {
67
- $pmpro_msg = __("Order deleted successfully.", "pmpro");
68
  $pmpro_msgt = "success";
69
  }
70
  else
71
  {
72
- $pmpro_msg = __("Error deleting order.", "pmpro");
73
  $pmpro_msgt = "error";
74
  }
75
  }
76
 
77
- if(isset($_REQUEST['filter']))
78
- $filter = sanitize_text_field($_REQUEST['filter']);
79
- else
80
- $filter = "all";
81
-
82
- $thisyear = date("Y");
83
-
84
-
85
-
86
  //this array stores fields that should be read only
87
  $read_only_fields = apply_filters("pmpro_orders_read_only_fields", array("code", "payment_transaction_id", "subscription_transaction_id"));
88
 
@@ -166,18 +116,18 @@
166
  //handle timestamp
167
  if($order->updateTimestamp($_POST['ts_year'], $_POST['ts_month'], $_POST['ts_day']) !== false)
168
  {
169
- $pmpro_msg = __("Order saved successfully.", "pmpro");
170
  $pmpro_msgt = "success";
171
  }
172
  else
173
  {
174
- $pmpro_msg = __("Error updating order timestamp.", "pmpro");
175
  $pmpro_msgt = "error";
176
  }
177
  }
178
  else
179
  {
180
- $pmpro_msg = __("Error saving order.", "pmpro");
181
  $pmpro_msgt = "error";
182
  }
183
  }
@@ -235,16 +185,23 @@
235
  }
236
  }
237
 
238
- require_once(dirname(__FILE__) . "/admin_header.php");
239
  ?>
 
 
 
 
 
 
 
 
240
 
241
  <?php if(!empty($order)) { ?>
242
 
243
  <h2>
244
  <?php if(!empty($order->id)) { ?>
245
- <?php _e('Order', 'pmpro');?> #<?php echo $order->id?>: <?php echo $order->code?>
246
  <?php } else { ?>
247
- <?php _e('New Order', 'pmpro');?>
248
  <?php } ?>
249
  </h2>
250
 
@@ -258,21 +215,21 @@
258
  <tbody>
259
  <tr>
260
  <th scope="row" valign="top"><label>ID:</label></th>
261
- <td><?php if(!empty($order->id)) echo $order->id; else echo __("This will be generated when you save.", "pmpro");?></td>
262
  </tr>
263
 
264
  <tr>
265
- <th scope="row" valign="top"><label for="code"><?php _e('Code', 'pmpro');?>:</label></th>
266
  <td>
267
  <?php if(in_array("code", $read_only_fields)) { echo $order->code; } else { ?>
268
  <input id="code" name="code" type="text" size="50" value="<?php echo esc_attr($order->code);?>" />
269
  <?php } ?>
270
- <?php if($order_id < 0) { ?><small class="pmpro_lite"><?php _e('Randomly generated for you.', 'pmpro');?></small><?php } ?>
271
  </td>
272
  </tr>
273
 
274
  <tr>
275
- <th scope="row" valign="top"><label for="user_id"><?php _e('User ID', 'pmpro');?>:</label></th>
276
  <td>
277
  <?php if(in_array("user_id", $read_only_fields) && $order_id > 0) { echo $order->user_id; } else { ?>
278
  <input id="user_id" name="user_id" type="text" size="50" value="<?php echo esc_attr($order->user_id);?>" />
@@ -281,7 +238,7 @@
281
  </tr>
282
 
283
  <tr>
284
- <th scope="row" valign="top"><label for="membership_id"><?php _e('Membership Level ID', 'pmpro');?>:</label></th>
285
  <td>
286
  <?php if(in_array("membership_id", $read_only_fields) && $order_id > 0) { echo $order->membership_id; } else { ?>
287
  <input id="membership_id" name="membership_id" type="text" size="50" value="<?php echo esc_attr($order->membership_id);?>" />
@@ -290,7 +247,7 @@
290
  </tr>
291
 
292
  <tr>
293
- <th scope="row" valign="top"><label for="billing_name"><?php _e('Billing Name', 'pmpro');?>:</label></th>
294
  <td>
295
  <?php if(in_array("billing_name", $read_only_fields) && $order_id > 0) { echo $order->billing_name; } else { ?>
296
  <input id="billing_name" name="billing_name" type="text" size="50" value="<?php echo esc_attr($order->billing->name);?>" />
@@ -298,35 +255,35 @@
298
  </td>
299
  </tr>
300
  <tr>
301
- <th scope="row" valign="top"><label for="billing_street"><?php _e('Billing Street', 'pmpro');?>:</label></th>
302
  <td>
303
  <?php if(in_array("billing_street", $read_only_fields) && $order_id > 0) { echo $order->billing_street; } else { ?>
304
  <input id="billing_street" name="billing_street" type="text" size="50" value="<?php echo esc_attr($order->billing->street);?>" /></td>
305
  <?php } ?>
306
  </tr>
307
  <tr>
308
- <th scope="row" valign="top"><label for="billing_city"><?php _e('Billing City', 'pmpro');?>:</label></th>
309
  <td>
310
  <?php if(in_array("billing_city", $read_only_fields) && $order_id > 0) { echo $order->billing_city; } else { ?>
311
  <input id="billing_city" name="billing_city" type="text" size="50" value="<?php echo esc_attr($order->billing->city);?>" /></td>
312
  <?php } ?>
313
  </tr>
314
  <tr>
315
- <th scope="row" valign="top"><label for="billing_state"><?php _e('Billing State', 'pmpro');?>:</label></th>
316
  <td>
317
  <?php if(in_array("billing_state", $read_only_fields) && $order_id > 0) { echo $order->billing_state; } else { ?>
318
  <input id="billing_state" name="billing_state" type="text" size="50" value="<?php echo esc_attr($order->billing->state);?>" /></td>
319
  <?php } ?>
320
  </tr>
321
  <tr>
322
- <th scope="row" valign="top"><label for="billing_zip"><?php _e('Billing Postal Code', 'pmpro');?>:</label></th>
323
  <td>
324
  <?php if(in_array("billing_zip", $read_only_fields) && $order_id > 0) { echo $order->billing_zip; } else { ?>
325
  <input id="billing_zip" name="billing_zip" type="text" size="50" value="<?php echo esc_attr($order->billing->zip);?>" /></td>
326
  <?php } ?>
327
  </tr>
328
  <tr>
329
- <th scope="row" valign="top"><label for="billing_country"><?php _e('Billing Country', 'pmpro');?>:</label></th>
330
  <td>
331
  <?php if(in_array("billing_country", $read_only_fields) && $order_id > 0) { echo $order->billing_country; } else { ?>
332
  <input id="billing_country" name="billing_country" type="text" size="50" value="<?php echo esc_attr($order->billing->country);?>" />
@@ -334,7 +291,7 @@
334
  </td>
335
  </tr>
336
  <tr>
337
- <th scope="row" valign="top"><label for="billing_phone"><?php _e('Billing Phone', 'pmpro');?>:</label></th>
338
  <td>
339
  <?php if(in_array("billing_phone", $read_only_fields) && $order_id > 0) { echo $order->billing_phone; } else { ?>
340
  <input id="billing_phone" name="billing_phone" type="text" size="50" value="<?php echo esc_attr($order->billing->phone);?>" />
@@ -343,7 +300,7 @@
343
  </tr>
344
 
345
  <tr>
346
- <th scope="row" valign="top"><label for="subtotal"><?php _e('Sub Total', 'pmpro');?>:</label></th>
347
  <td>
348
  <?php if(in_array("subtotal", $read_only_fields) && $order_id > 0) { echo $order->subtotal; } else { ?>
349
  <input id="subtotal" name="subtotal" type="text" size="10" value="<?php echo esc_attr($order->subtotal);?>" />
@@ -351,7 +308,7 @@
351
  </td>
352
  </tr>
353
  <tr>
354
- <th scope="row" valign="top"><label for="tax"><?php _e('Tax', 'pmpro');?>:</label></th>
355
  <td>
356
  <?php if(in_array("tax", $read_only_fields) && $order_id > 0) { echo $order->tax; } else { ?>
357
  <input id="tax" name="tax" type="text" size="10" value="<?php echo esc_attr($order->tax);?>" />
@@ -359,7 +316,7 @@
359
  </td>
360
  </tr>
361
  <tr>
362
- <th scope="row" valign="top"><label for="couponamount"><?php _e('Coupon Amount', 'pmpro');?>:</label></th>
363
  <td>
364
  <?php if(in_array("couponamount", $read_only_fields) && $order_id > 0) { echo $order->couponamount; } else { ?>
365
  <input id="couponamount" name="couponamount" type="text" size="10" value="<?php echo esc_attr($order->couponamount);?>" />
@@ -367,52 +324,52 @@
367
  </td>
368
  </tr>
369
  <tr>
370
- <th scope="row" valign="top"><label for="total"><?php _e('Total', 'pmpro');?>:</label></th>
371
  <td>
372
  <?php if(in_array("total", $read_only_fields) && $order_id > 0) { echo $order->total; } else { ?>
373
  <input id="total" name="total" type="text" size="10" value="<?php echo esc_attr($order->total);?>" />
374
  <?php } ?>
375
- <small class="pmpro_lite"><?php _e('Should be subtotal + tax - couponamount.', 'pmpro');?></small>
376
  </td>
377
  </tr>
378
 
379
  <tr>
380
- <th scope="row" valign="top"><label for="payment_type"><?php _e('Payment Type', 'pmpro');?>:</label></th>
381
  <td>
382
  <?php if(in_array("payment_type", $read_only_fields) && $order_id > 0) { echo $order->payment_type; } else { ?>
383
  <input id="payment_type" name="payment_type" type="text" size="50" value="<?php echo esc_attr($order->payment_type);?>" />
384
  <?php } ?>
385
- <small class="pmpro_lite"><?php _e('e.g. PayPal Express, PayPal Standard, Credit Card.', 'pmpro');?></small>
386
  </td>
387
  </tr>
388
  <tr>
389
- <th scope="row" valign="top"><label for="cardtype"><?php _e('Card Type', 'pmpro');?></label></th>
390
  <td>
391
  <?php if(in_array("cardtype", $read_only_fields) && $order_id > 0) { echo $order->cardtype; } else { ?>
392
  <input id="cardtype" name="cardtype" type="text" size="50" value="<?php echo esc_attr($order->cardtype);?>" />
393
  <?php } ?>
394
- <small class="pmpro_lite"><?php _e('e.g. Visa, MasterCard, AMEX, etc', 'pmpro');?></small>
395
  </td>
396
  </tr>
397
  <tr>
398
- <th scope="row" valign="top"><label for="accountnumber"><?php _e('Account Number', 'pmpro');?>:</label></th>
399
  <td>
400
  <?php if(in_array("accountnumber", $read_only_fields) && $order_id > 0) { echo $order->accountnumber; } else { ?>
401
  <input id="accountnumber" name="accountnumber" type="text" size="50" value="<?php echo esc_attr($order->accountnumber);?>" />
402
  <?php } ?>
403
- <small class="pmpro_lite"><?php _e('Obscure all but last 4 digits.', 'pmpro');?></small>
404
  </td>
405
  </tr>
406
  <?php if(in_array("ExpirationDate", $read_only_fields) && $order_id > 0) { echo $order->ExpirationDate; } else { ?>
407
  <tr>
408
- <th scope="row" valign="top"><label for="expirationmonth"><?php _e('Expiration Month', 'pmpro');?>:</label></th>
409
  <td>
410
  <input id="expirationmonth" name="expirationmonth" type="text" size="10" value="<?php echo esc_attr($order->expirationmonth);?>" />
411
  <small class="pmpro_lite">MM</small>
412
  </td>
413
  </tr>
414
  <tr>
415
- <th scope="row" valign="top"><label for="expirationyear"><?php _e('Expiration Year', 'pmpro');?>:</label></th>
416
  <td>
417
  <input id="expirationyear" name="expirationyear" type="text" size="10" value="<?php echo esc_attr($order->expirationyear);?>" />
418
  <small class="pmpro_lite">YYYY</small>
@@ -420,7 +377,7 @@
420
  </tr>
421
  <?php } ?>
422
  <tr>
423
- <th scope="row" valign="top"><label for="status"><?php _e('Status', 'pmpro');?>:</label></th>
424
  <td>
425
  <?php if(in_array("status", $read_only_fields) && $order_id > 0) { echo $order->status; } else { ?>
426
  <?php
@@ -441,12 +398,12 @@
441
  </tr>
442
 
443
  <tr>
444
- <th scope="row" valign="top"><label for="gateway"><?php _e('Gateway', 'pmpro');?>:</label></th>
445
  <td>
446
  <?php if(in_array("gateway", $read_only_fields) && $order_id > 0) { echo $order->gateway; } else { ?>
447
  <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
448
- <option value="" <?php if(empty($order->gateway)) { ?>selected="selected"<?php } ?>><?php _e('Testing Only', 'pmpro');?></option>
449
- <option value="check" <?php if($order->gateway == "check") { ?>selected="selected"<?php } ?>><?php _e('Pay by Check', 'pmpro');?></option>
450
  <option value="stripe" <?php if($order->gateway == "stripe") { ?>selected="selected"<?php } ?>>Stripe</option>
451
  <option value="paypalstandard" <?php if($order->gateway == "paypalstandard") { ?>selected="selected"<?php } ?>>PayPal Standard</option>
452
  <option value="paypalexpress" <?php if($order->gateway == "paypalexpress") { ?>selected="selected"<?php } ?>>PayPal Express</option>
@@ -458,38 +415,38 @@
458
  </td>
459
  </tr>
460
  <tr>
461
- <th scope="row" valign="top"><label for="gateway_environment"><?php _e('Gateway Environment', 'pmpro');?>:</label></th>
462
  <td>
463
  <?php if(in_array("gateway_environment", $read_only_fields) && $order_id > 0) { echo $order->gateway_environment; } else { ?>
464
  <select name="gateway_environment">
465
- <option value="sandbox" <?php if($order->gateway_environment == "sandbox") { ?>selected="selected"<?php } ?>><?php _e('Sandbox/Testing', 'pmpro');?></option>
466
- <option value="live" <?php if($order->gateway_environment == "live") { ?>selected="selected"<?php } ?>><?php _e('Live/Production', 'pmpro');?></option>
467
  </select>
468
  <?php } ?>
469
  </td>
470
  </tr>
471
 
472
  <tr>
473
- <th scope="row" valign="top"><label for="payment_transaction_id"><?php _e('Payment Transaction ID', 'pmpro');?>:</label></th>
474
  <td>
475
  <?php if(in_array("payment_transaction_id", $read_only_fields) && $order_id > 0) { echo $order->payment_transaction_id; } else { ?>
476
  <input id="payment_transaction_id" name="payment_transaction_id" type="text" size="50" value="<?php echo esc_attr($order->payment_transaction_id);?>" />
477
  <?php } ?>
478
- <small class="pmpro_lite"><?php _e('Generated by the gateway. Useful to cross reference orders.', 'pmpro');?></small>
479
  </td>
480
  </tr>
481
  <tr>
482
- <th scope="row" valign="top"><label for="subscription_transaction_id"><?php _e('Subscription Transaction ID', 'pmpro');?>:</label></th>
483
  <td>
484
- <?php if(in_array("subscription_transaction_id", $read_only_fields) && $order_id > 0) { echo $order->subscription_transaction_id; } else { ?>
485
  <input id="subscription_transaction_id" name="subscription_transaction_id" type="text" size="50" value="<?php echo esc_attr($order->subscription_transaction_id);?>" />
486
  <?php } ?>
487
- <small class="pmpro_lite"><?php _e('Generated by the gateway. Useful to cross reference subscriptions.', 'pmpro');?></small>
488
  </td>
489
  </tr>
490
 
491
  <tr>
492
- <th scope="row" valign="top"><label for="ts_month"><?php _e('Date', 'pmpro');?>:</label></th>
493
  <td>
494
  <?php if(in_array("timestamp", $read_only_fields) && $order_id > 0) { echo date(option("date_format"), $order->timestamp); } else { ?>
495
  <?php
@@ -497,7 +454,7 @@
497
  if(!empty($order->timestamp))
498
  $timestamp = $order->timestamp;
499
  else
500
- $timestamp = current_time('timestamp');
501
 
502
  $year = date("Y", $timestamp);
503
  $month = date("n", $timestamp);
@@ -508,7 +465,7 @@
508
  for($i = 1; $i < 13; $i++)
509
  {
510
  ?>
511
- <option value="<?php echo $i?>" <?php if($i == $month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $year, current_time("timestamp")))?></option>
512
  <?php
513
  }
514
  ?>
@@ -524,7 +481,7 @@
524
  if(!empty($affiliates)) {
525
  ?>
526
  <tr>
527
- <th scope="row" valign="top"><label for="affiliate_id"><?php _e('Affiliate ID', 'pmpro');?>Affiliate ID:</label></th>
528
  <td>
529
  <?php if(in_array("affiliate_id", $read_only_fields) && $order_id > 0) { echo $order->affiliate_id; } else { ?>
530
  <input id="affiliate_id" name="affiliate_id" type="text" size="50" value="<?php echo esc_attr($order->affiliate_id);?>" />
@@ -532,7 +489,7 @@
532
  </td>
533
  </tr>
534
  <tr>
535
- <th scope="row" valign="top"><label for="affiliate_subid"><?php _e('Affiliate SubID', 'pmpro');?>Affiliate SubID:</label></th>
536
  <td>
537
  <?php if(in_array("affiliate_subid", $read_only_fields) && $order_id > 0) { echo $order->affiliate_subid; } else { ?>
538
  <input id="affiliate_subid" name="affiliate_subid" type="text" size="50" value="<?php echo esc_attr($order->affiliate_subid);?>" />
@@ -542,7 +499,7 @@
542
  <?php } ?>
543
 
544
  <tr>
545
- <th scope="row" valign="top"><label for="notes"><?php _e('Notes', 'pmpro');?>:</label></th>
546
  <td>
547
  <?php if(in_array("notes", $read_only_fields) && $order_id > 0) { echo $order->notes; } else { ?>
548
  <textarea id="notes" name="notes" rows="5" cols="80"><?php echo esc_textarea($order->notes);?></textarea>
@@ -557,8 +514,8 @@
557
 
558
  <p class="submit topborder">
559
  <input name="order" type="hidden" value="<?php if(!empty($order->id)) echo $order->id; else echo $order_id;?>" />
560
- <input name="save" type="submit" class="button-primary" value="<?php _e('Save Order', 'pmpro');?>" />
561
- <input name="cancel" type="button" class="cancel button-secondary" value="<?php _e('Cancel', 'pmpro');?>" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-orders')?>';" />
562
  </p>
563
 
564
  </form>
@@ -567,219 +524,26 @@
567
 
568
  <form id="posts-filter" method="get" action="">
569
  <h2>
570
- <?php _e('Orders', 'pmpro');?>
571
- <a href="admin.php?page=pmpro-orders&order=-1" class="add-new-h2">+ <?php _e('Add New Order', 'pmpro');?></a>
572
-
573
- <?php
574
- //build the export URL
575
- $export_url = admin_url('admin-ajax.php') . "?action=orders_csv";
576
- $url_params = array(
577
- "filter"=>$filter,
578
- "s"=>$s,
579
- "l"=>$l,
580
- "start-month"=>$start_month,
581
- "start-day"=>$start_day,
582
- "start-year"=>$start_year,
583
- "end-month"=>$end_month,
584
- "end-day"=>$end_day,
585
- "end-year"=>$end_year,
586
- "predefined-date"=>$predefined_date,
587
- "status"=>$status
588
- );
589
- $export_url = add_query_arg($url_params, $export_url);
590
- ?>
591
- <a target="_blank" href="<?php echo $export_url;?>" class="add-new-h2"><?php _e('Export to CSV', 'pmpro');?></a>
592
- </h2>
593
-
594
-
595
 
596
  <?php if(!empty($pmpro_msg)) { ?>
597
  <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
598
  <?php } ?>
599
 
600
-
601
  <ul class="subsubsub">
602
  <li>
603
- <?php _ex('Show', 'Dropdown label, e.g. Show Daily Orders for January', 'pmpro')?>
604
- <select id="filter" name="filter">
605
- <option value="all" <?php selected($filter, "all");?>><?php _e('All', 'pmpro');?></option>
606
- <option value="within-a-date-range" <?php selected($filter, "within-a-date-range");?>><?php _e('Within a Date Range', 'pmpro');?></option>
607
- <option value="predefined-date-range" <?php selected($filter, "predefined-date-range");?>><?php _e('Predefined Date Range', 'pmpro');?></option>
608
- <option value="within-a-level" <?php selected($filter, "within-a-level");?>><?php _e('Within a Level', 'pmpro');?></option>
609
- <option value="within-a-status" <?php selected($filter, "within-a-status");?>><?php _e('Within a Status', 'pmpro');?></option>
610
- </select>
611
-
612
- <span id="from"><?php _ex('From', 'Dropdown label', 'pmpro')?></span>
613
-
614
- <select id="start-month" name="start-month">
615
- <?php for($i = 1; $i < 13; $i++) { ?>
616
- <option value="<?php echo $i;?>" <?php selected($start_month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
617
- <?php } ?>
618
- </select>
619
-
620
- <input id='start-day' name="start-day" type="text" size="2" value="<?php echo $start_day?>" />
621
- <input id='start-year' name="start-year" type="text" size="4" value="<?php echo $start_year?>" />
622
-
623
-
624
- <span id="to"><?php _ex('To', 'Dropdown label', 'pmpro')?></span>
625
-
626
- <select id="end-month" name="end-month">
627
- <?php for($i = 1; $i < 13; $i++) { ?>
628
- <option value="<?php echo $i;?>" <?php selected($end_month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
629
- <?php } ?>
630
- </select>
631
-
632
-
633
- <input id='end-day' name="end-day" type="text" size="2" value="<?php echo $end_day?>" />
634
- <input id='end-year' name="end-year" type="text" size="4" value="<?php echo $end_year?>" />
635
-
636
- <span id="filterby"><?php _ex('filter by ', 'Dropdown label', 'pmpro')?></span>
637
-
638
- <select id="predefined-date" name="predefined-date">
639
-
640
- <option value="<?php echo "This Month";?>" <?php selected($predefined_date, "This Month");?>><?php echo "This Month";?></option>
641
- <option value="<?php echo "Last Month";?>" <?php selected($predefined_date, "Last Month");?>><?php echo "Last Month";?></option>
642
- <option value="<?php echo "This Year";?>" <?php selected($predefined_date, "This Year");?>><?php echo "This Year";?></option>
643
- <option value="<?php echo "Last Year";?>" <?php selected($predefined_date, "Last Year");?>><?php echo "Last Year";?></option>
644
 
645
- </select>
646
-
647
- <?php
648
- //Note: only orders belonging to current levels can be filtered. There is no option for orders belonging to deleted levels
649
- $levels = pmpro_getAllLevels();
650
-
651
- ?>
652
- <select id="l" name="l">
653
- <?php foreach($levels as $level) { ?>
654
- <option value="<?php echo $level->id;?>" <?php selected($l, $level->id);?>><?php echo $level->name;?></option>
655
- <?php } ?>
656
-
657
- </select>
658
-
659
- <?php
660
- $statuses = array();
661
- $default_statuses = array("", "success", "cancelled", "review", "token", "refunded");
662
- $used_statuses = $wpdb->get_col("SELECT DISTINCT(status) FROM $wpdb->pmpro_membership_orders");
663
- $statuses = array_unique(array_merge($default_statuses, $used_statuses));
664
- asort($statuses);
665
- $statuses = apply_filters("pmpro_order_statuses", $statuses);
666
- ?>
667
- <select id="status" name="status">
668
- <?php foreach($statuses as $the_status) { ?>
669
- <option value="<?php echo esc_attr($the_status);?>" <?php selected($the_status, $status);?>><?php echo $the_status;?></option>
670
- <?php } ?>
671
- </select>
672
-
673
-
674
- <input id="submit" type="submit" value="<?php _ex('Filter', 'Submit button value.', 'pmpro');?>" />
675
  </li>
676
  </ul>
677
-
678
- <script>
679
- //update month/year when period dropdown is changed
680
- jQuery(document).ready(function() {
681
- jQuery('#filter').change(function() {
682
- pmpro_ShowMonthOrYear();
683
- });
684
- });
685
-
686
- function pmpro_ShowMonthOrYear()
687
- {
688
- var filter = jQuery('#filter').val();
689
- if(filter == 'all')
690
- {
691
- jQuery('#start-month').hide();
692
- jQuery('#start-day').hide();
693
- jQuery('#start-year').hide();
694
- jQuery('#end-month').hide();
695
- jQuery('#end-day').hide();
696
- jQuery('#end-year').hide();
697
- jQuery('#predefined-date').hide();
698
- jQuery('#status').hide();
699
- jQuery('#l').hide();
700
- jQuery('#from').hide();
701
- jQuery('#to').hide();
702
- jQuery('#submit').show();
703
- jQuery('#filterby').hide();
704
- }
705
- else if(filter == 'within-a-date-range')
706
- {
707
- jQuery('#start-month').show();
708
- jQuery('#start-day').show();
709
- jQuery('#start-year').show();
710
- jQuery('#end-month').show();
711
- jQuery('#end-day').show();
712
- jQuery('#end-year').show();
713
- jQuery('#predefined-date').hide();
714
- jQuery('#status').hide();
715
- jQuery('#l').hide();
716
- jQuery('#submit').show();
717
- jQuery('#from').show();
718
- jQuery('#to').show();
719
- jQuery('#filterby').hide();
720
- }
721
- else if(filter == 'predefined-date-range')
722
- {
723
- jQuery('#start-month').hide();
724
- jQuery('#start-day').hide();
725
- jQuery('#start-year').hide();
726
- jQuery('#end-month').hide();
727
- jQuery('#end-day').hide();
728
- jQuery('#end-year').hide();
729
- jQuery('#predefined-date').show();
730
- jQuery('#status').hide();
731
- jQuery('#l').hide();
732
- jQuery('#submit').show();
733
- jQuery('#from').hide();
734
- jQuery('#to').hide();
735
- jQuery('#filterby').show();
736
- }
737
- else if(filter == 'within-a-level')
738
- {
739
- jQuery('#start-month').hide();
740
- jQuery('#start-day').hide();
741
- jQuery('#start-year').hide();
742
- jQuery('#end-month').hide();
743
- jQuery('#end-day').hide();
744
- jQuery('#end-year').hide();
745
- jQuery('#predefined-date').hide();
746
- jQuery('#status').hide();
747
- jQuery('#l').show();
748
- jQuery('#submit').show();
749
- jQuery('#from').hide();
750
- jQuery('#to').hide();
751
- jQuery('#filterby').show();
752
- }
753
- else if(filter == 'within-a-status')
754
- {
755
- jQuery('#start-month').hide();
756
- jQuery('#start-day').hide();
757
- jQuery('#start-year').hide();
758
- jQuery('#end-month').hide();
759
- jQuery('#end-day').hide();
760
- jQuery('#end-year').hide();
761
- jQuery('#predefined-date').hide();
762
- jQuery('#status').show();
763
- jQuery('#l').hide();
764
- jQuery('#submit').show();
765
- jQuery('#from').hide();
766
- jQuery('#to').hide();
767
- jQuery('#filterby').show();
768
- }
769
- }
770
-
771
- pmpro_ShowMonthOrYear();
772
-
773
-
774
- </script>
775
-
776
  <p class="search-box">
777
- <label class="hidden" for="post-search-input"><?php _e('Search Orders', 'pmpro');?>:</label>
778
  <input type="hidden" name="page" value="pmpro-orders" />
779
  <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
780
- <input class="button" type="submit" value="<?php _e('Search Orders', 'pmpro');?>"/>
781
  </p>
782
-
783
  <?php
784
  //some vars for the search
785
  if(isset($_REQUEST['pn']))
@@ -795,62 +559,6 @@
795
  $end = $pn * $limit;
796
  $start = $end - $limit;
797
 
798
- //filters
799
- if($filter == "all" || !$filter)
800
- $condition = "1=1";
801
- elseif($filter == "within-a-date-range")
802
- {
803
- $start_date = $start_year."-".$start_month."-".$start_day;
804
- $end_date = $end_year."-".$end_month."-".$end_day;
805
-
806
- //add times to dates
807
- $start_date = $start_date . " 00:00:00";
808
- $end_date = $end_date . " 23:59:59";
809
-
810
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
811
- }
812
- elseif($filter == "predefined-date-range")
813
- {
814
- if($predefined_date == "Last Month")
815
- {
816
- $start_date = date("Y-m-d", strtotime("first day of last month", current_time("timestamp")));
817
- $end_date = date("Y-m-d", strtotime("last day of last month", current_time("timestamp")));
818
- }
819
- elseif($predefined_date == "This Month")
820
- {
821
- $start_date = date("Y-m-d", strtotime("first day of this month", current_time("timestamp")));
822
- $end_date = date("Y-m-d", strtotime("last day of this month", current_time("timestamp")));
823
- }
824
- elseif($predefined_date == "This Year")
825
- {
826
- $year = date('Y');
827
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
828
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
829
- }
830
-
831
- elseif($predefined_date == "Last Year")
832
- {
833
- $year = date('Y') - 1;
834
- $start_date = date("Y-m-d", strtotime("first day of January $year", current_time("timestamp")));
835
- $end_date = date("Y-m-d", strtotime("last day of December $year", current_time("timestamp")));
836
- }
837
-
838
- //add times to dates
839
- $start_date = $start_date . " 00:00:00";
840
- $end_date = $end_date . " 23:59:59";
841
-
842
- $condition = "timestamp BETWEEN '".$start_date."' AND '".$end_date."'";
843
- }
844
- elseif($filter == "within-a-level")
845
- {
846
- $condition = "membership_id = $l";
847
- }
848
- elseif($filter == "within-a-status")
849
- {
850
- $condition = "status = '$status' ";
851
- }
852
-
853
- //string search
854
  if($s)
855
  {
856
  $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 ";
@@ -869,45 +577,41 @@
869
  $fields = apply_filters("pmpro_orders_search_fields", $fields);
870
 
871
  foreach($fields as $field)
872
- $sqlQuery .= " OR " . $field . " LIKE '%" . esc_sql($s) . "%' ";
873
  $sqlQuery .= ") ";
874
-
875
- $sqlQuery .= "AND " . $condition . " ";
876
-
877
  $sqlQuery .= "GROUP BY o.id ORDER BY o.id DESC, o.timestamp DESC ";
878
  }
879
  else
880
  {
881
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders WHERE ".$condition." ORDER BY id DESC, timestamp DESC ";
882
  }
883
 
884
  $sqlQuery .= "LIMIT $start, $limit";
885
 
886
  $order_ids = $wpdb->get_col($sqlQuery);
887
-
888
  $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
889
 
890
  if($order_ids)
891
  {
892
  ?>
893
- <p class="clear"><?php printf(__("%d orders found.", "pmpro"), $totalrows);?></span></p>
894
  <?php
895
  }
896
  ?>
897
  <table class="widefat">
898
  <thead>
899
  <tr class="thead">
900
- <th><?php _e('ID', 'pmpro');?></th>
901
- <th><?php _e('Code', 'pmpro');?></th>
902
- <th><?php _e('User', 'pmpro');?></th>
903
  <?php do_action("pmpro_orders_extra_cols_header", $order_ids);?>
904
- <th><?php _e('Membership Level', 'pmpro');?></th>
905
- <th><?php _e('Total', 'pmpro');?></th>
906
- <th><?php _e('Payment', 'pmpro');?></th>
907
- <th><?php _e('Gateway', 'pmpro');?></th>
908
- <th><?php _e('Transaction IDs', 'pmpro');?></th>
909
- <th><?php _e('Status', 'pmpro');?></th>
910
- <th><?php _e('Date', 'pmpro');?></th>
911
  <th></th>
912
  <th></th>
913
  <th></th>
@@ -930,7 +634,7 @@
930
  <?php if(!empty($order->user)) { ?>
931
  <a href="user-edit.php?user_id=<?php echo $order->user->ID?>"><?php echo $order->user->user_login?></a>
932
  <?php } else { ?>
933
- [<?php _e('deleted', 'pmpro');?>]
934
  <?php } ?>
935
  </td>
936
  <?php do_action("pmpro_orders_extra_cols_body", $order);?>
@@ -951,20 +655,20 @@
951
  </td>
952
  <td><?php echo $order->gateway;?><?php if($order->gateway_environment == "test") echo "(test)";?></td>
953
  <td>
954
- <?php _e('Payment', 'pmpro');?>: <?php if(!empty($order->payment_transaction_id)) echo $order->payment_transaction_id; else echo "N/A";?>
955
  <br />
956
- <?php _e('Subscription', 'pmpro');?>: <?php if(!empty($order->subscription_transaction_id)) echo $order->subscription_transaction_id; else echo "N/A";?>
957
  </td>
958
  <td><?php echo $order->status;?></td>
959
  <td><?php echo date(get_option('date_format'), $order->timestamp);?></td>
960
  <td align="center">
961
- <a href="admin.php?page=pmpro-orders&order=<?php echo $order->id;?>"><?php _e('edit', 'pmpro');?></a>
962
  </td>
963
  <td align="center">
964
- <a href="admin.php?page=pmpro-orders&order=-1&copy=<?php echo $order->id;?>"><?php _e('copy', 'pmpro');?></a>
965
  </td>
966
  <td align="center">
967
- <a href="javascript:askfirst('<?php printf(__("Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?", "pmpro"), str_replace("'", "", $order->code));?>', 'admin.php?page=pmpro-orders&delete=<?php echo $order->id;?>'); void(0);"><?php _e('delete', 'pmpro');?></a>
968
  </td>
969
  </tr>
970
  <?php
@@ -974,7 +678,7 @@
974
  {
975
  ?>
976
  <tr>
977
- <td colspan="9"><p><?php _e('No orders found.', 'pmpro');?></p></td>
978
  </tr>
979
  <?php
980
  }
@@ -984,13 +688,9 @@
984
  </form>
985
 
986
  <?php
987
- //add normal args
988
- $pagination_url = add_query_arg($url_params, get_admin_url(NULL, "/admin.php?page=pmpro-orders"));
989
- echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, $pagination_url, "&limit=$limit&pn=");
990
  ?>
991
 
992
  <?php } ?>
993
 
994
- <?php
995
- require_once(dirname(__FILE__) . "/admin_footer.php");
996
- ?>
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_orders")))
4
  {
5
+ die("You do not have permissions to perform this action.");
6
  }
7
 
8
  //vars
16
  $l = $_REQUEST['l'];
17
  else
18
  $l = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
  //deleting?
21
  if(!empty($_REQUEST['delete']))
23
  $dorder = new MemberOrder(intval($_REQUEST['delete']));
24
  if($dorder->deleteMe())
25
  {
26
+ $pmpro_msg = "Order deleted successfully.";
27
  $pmpro_msgt = "success";
28
  }
29
  else
30
  {
31
+ $pmpro_msg = "Error deleting order.";
32
  $pmpro_msgt = "error";
33
  }
34
  }
35
 
 
 
 
 
 
 
 
 
 
36
  //this array stores fields that should be read only
37
  $read_only_fields = apply_filters("pmpro_orders_read_only_fields", array("code", "payment_transaction_id", "subscription_transaction_id"));
38
 
116
  //handle timestamp
117
  if($order->updateTimestamp($_POST['ts_year'], $_POST['ts_month'], $_POST['ts_day']) !== false)
118
  {
119
+ $pmpro_msg = "Order saved successfully.";
120
  $pmpro_msgt = "success";
121
  }
122
  else
123
  {
124
+ $pmpro_msg = "Error updating order timestamp.";
125
  $pmpro_msgt = "error";
126
  }
127
  }
128
  else
129
  {
130
+ $pmpro_msg = "Error saving order.";
131
  $pmpro_msgt = "error";
132
  }
133
  }
185
  }
186
  }
187
 
 
188
  ?>
189
+ <div class="wrap pmpro_admin">
190
+ <div class="pmpro_banner">
191
+ <a class="pmpro_logo" title="Paid Memberships Pro - Membership Plugin for WordPress" target="_blank" href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>"><img src="<?php echo PMPRO_URL?>/images/PaidMembershipsPro.gif" width="350" height="45" border="0" alt="Paid Memberships Pro(c) - All Rights Reserved" /></a>
192
+ <div class="pmpro_tagline">Membership Plugin for WordPress</div>
193
+
194
+ <div class="pmpro_meta"><a href="<?php echo pmpro_https_filter("http://www.paidmembershipspro.com")?>">Plugin Support</a> | <a href="http://www.paidmembershipspro.com/forums/">User Forum</a> | <strong>Version <?php echo PMPRO_VERSION?></strong></div>
195
+ </div>
196
+ <br style="clear:both;" />
197
 
198
  <?php if(!empty($order)) { ?>
199
 
200
  <h2>
201
  <?php if(!empty($order->id)) { ?>
202
+ Order #<?php echo $order->id?>: <?php echo $order->code?>
203
  <?php } else { ?>
204
+ New Order
205
  <?php } ?>
206
  </h2>
207
 
215
  <tbody>
216
  <tr>
217
  <th scope="row" valign="top"><label>ID:</label></th>
218
+ <td><?php if(!empty($order->id)) echo $order->id; else echo "This will be generated when you save.";?></td>
219
  </tr>
220
 
221
  <tr>
222
+ <th scope="row" valign="top"><label for="code">Code:</label></th>
223
  <td>
224
  <?php if(in_array("code", $read_only_fields)) { echo $order->code; } else { ?>
225
  <input id="code" name="code" type="text" size="50" value="<?php echo esc_attr($order->code);?>" />
226
  <?php } ?>
227
+ <?php if($order_id < 0) { ?><small class="pmpro_lite">Randomly generated for you.</small><?php } ?>
228
  </td>
229
  </tr>
230
 
231
  <tr>
232
+ <th scope="row" valign="top"><label for="user_id">User ID:</label></th>
233
  <td>
234
  <?php if(in_array("user_id", $read_only_fields) && $order_id > 0) { echo $order->user_id; } else { ?>
235
  <input id="user_id" name="user_id" type="text" size="50" value="<?php echo esc_attr($order->user_id);?>" />
238
  </tr>
239
 
240
  <tr>
241
+ <th scope="row" valign="top"><label for="membership_id">Membership Level ID:</label></th>
242
  <td>
243
  <?php if(in_array("membership_id", $read_only_fields) && $order_id > 0) { echo $order->membership_id; } else { ?>
244
  <input id="membership_id" name="membership_id" type="text" size="50" value="<?php echo esc_attr($order->membership_id);?>" />
247
  </tr>
248
 
249
  <tr>
250
+ <th scope="row" valign="top"><label for="billing_name">Billing Name:</label></th>
251
  <td>
252
  <?php if(in_array("billing_name", $read_only_fields) && $order_id > 0) { echo $order->billing_name; } else { ?>
253
  <input id="billing_name" name="billing_name" type="text" size="50" value="<?php echo esc_attr($order->billing->name);?>" />
255
  </td>
256
  </tr>
257
  <tr>
258
+ <th scope="row" valign="top"><label for="billing_street">Billing Street:</label></th>
259
  <td>
260
  <?php if(in_array("billing_street", $read_only_fields) && $order_id > 0) { echo $order->billing_street; } else { ?>
261
  <input id="billing_street" name="billing_street" type="text" size="50" value="<?php echo esc_attr($order->billing->street);?>" /></td>
262
  <?php } ?>
263
  </tr>
264
  <tr>
265
+ <th scope="row" valign="top"><label for="billing_city">Billing City:</label></th>
266
  <td>
267
  <?php if(in_array("billing_city", $read_only_fields) && $order_id > 0) { echo $order->billing_city; } else { ?>
268
  <input id="billing_city" name="billing_city" type="text" size="50" value="<?php echo esc_attr($order->billing->city);?>" /></td>
269
  <?php } ?>
270
  </tr>
271
  <tr>
272
+ <th scope="row" valign="top"><label for="billing_state">Billing State:</label></th>
273
  <td>
274
  <?php if(in_array("billing_state", $read_only_fields) && $order_id > 0) { echo $order->billing_state; } else { ?>
275
  <input id="billing_state" name="billing_state" type="text" size="50" value="<?php echo esc_attr($order->billing->state);?>" /></td>
276
  <?php } ?>
277
  </tr>
278
  <tr>
279
+ <th scope="row" valign="top"><label for="billing_zip">Billing Postal Code:</label></th>
280
  <td>
281
  <?php if(in_array("billing_zip", $read_only_fields) && $order_id > 0) { echo $order->billing_zip; } else { ?>
282
  <input id="billing_zip" name="billing_zip" type="text" size="50" value="<?php echo esc_attr($order->billing->zip);?>" /></td>
283
  <?php } ?>
284
  </tr>
285
  <tr>
286
+ <th scope="row" valign="top"><label for="billing_country">Billing Country:</label></th>
287
  <td>
288
  <?php if(in_array("billing_country", $read_only_fields) && $order_id > 0) { echo $order->billing_country; } else { ?>
289
  <input id="billing_country" name="billing_country" type="text" size="50" value="<?php echo esc_attr($order->billing->country);?>" />
291
  </td>
292
  </tr>
293
  <tr>
294
+ <th scope="row" valign="top"><label for="billing_phone">Billing Phone:</label></th>
295
  <td>
296
  <?php if(in_array("billing_phone", $read_only_fields) && $order_id > 0) { echo $order->billing_phone; } else { ?>
297
  <input id="billing_phone" name="billing_phone" type="text" size="50" value="<?php echo esc_attr($order->billing->phone);?>" />
300
  </tr>
301
 
302
  <tr>
303
+ <th scope="row" valign="top"><label for="subtotal">Sub Total:</label></th>
304
  <td>
305
  <?php if(in_array("subtotal", $read_only_fields) && $order_id > 0) { echo $order->subtotal; } else { ?>
306
  <input id="subtotal" name="subtotal" type="text" size="10" value="<?php echo esc_attr($order->subtotal);?>" />
308
  </td>
309
  </tr>
310
  <tr>
311
+ <th scope="row" valign="top"><label for="tax">Tax:</label></th>
312
  <td>
313
  <?php if(in_array("tax", $read_only_fields) && $order_id > 0) { echo $order->tax; } else { ?>
314
  <input id="tax" name="tax" type="text" size="10" value="<?php echo esc_attr($order->tax);?>" />
316
  </td>
317
  </tr>
318
  <tr>
319
+ <th scope="row" valign="top"><label for="couponamount">Coupon Amount:</label></th>
320
  <td>
321
  <?php if(in_array("couponamount", $read_only_fields) && $order_id > 0) { echo $order->couponamount; } else { ?>
322
  <input id="couponamount" name="couponamount" type="text" size="10" value="<?php echo esc_attr($order->couponamount);?>" />
324
  </td>
325
  </tr>
326
  <tr>
327
+ <th scope="row" valign="top"><label for="total">Total:</label></th>
328
  <td>
329
  <?php if(in_array("total", $read_only_fields) && $order_id > 0) { echo $order->total; } else { ?>
330
  <input id="total" name="total" type="text" size="10" value="<?php echo esc_attr($order->total);?>" />
331
  <?php } ?>
332
+ <small class="pmpro_lite">Should be subtotal + tax - couponamount.</small>
333
  </td>
334
  </tr>
335
 
336
  <tr>
337
+ <th scope="row" valign="top"><label for="payment_type">Payment Type:</label></th>
338
  <td>
339
  <?php if(in_array("payment_type", $read_only_fields) && $order_id > 0) { echo $order->payment_type; } else { ?>
340
  <input id="payment_type" name="payment_type" type="text" size="50" value="<?php echo esc_attr($order->payment_type);?>" />
341
  <?php } ?>
342
+ <small class="pmpro_lite">e.g. PayPal Express, PayPal Standard, Credit Card.</small>
343
  </td>
344
  </tr>
345
  <tr>
346
+ <th scope="row" valign="top"><label for="cardtype">Card Type:</label></th>
347
  <td>
348
  <?php if(in_array("cardtype", $read_only_fields) && $order_id > 0) { echo $order->cardtype; } else { ?>
349
  <input id="cardtype" name="cardtype" type="text" size="50" value="<?php echo esc_attr($order->cardtype);?>" />
350
  <?php } ?>
351
+ <small class="pmpro_lite">e.g. Visa, MasterCard, AMEX, etc</small>
352
  </td>
353
  </tr>
354
  <tr>
355
+ <th scope="row" valign="top"><label for="accountnumber">Account Number:</label></th>
356
  <td>
357
  <?php if(in_array("accountnumber", $read_only_fields) && $order_id > 0) { echo $order->accountnumber; } else { ?>
358
  <input id="accountnumber" name="accountnumber" type="text" size="50" value="<?php echo esc_attr($order->accountnumber);?>" />
359
  <?php } ?>
360
+ <small class="pmpro_lite">Obscure all but last 4 digits.</small>
361
  </td>
362
  </tr>
363
  <?php if(in_array("ExpirationDate", $read_only_fields) && $order_id > 0) { echo $order->ExpirationDate; } else { ?>
364
  <tr>
365
+ <th scope="row" valign="top"><label for="expirationmonth">Expiration Month:</label></th>
366
  <td>
367
  <input id="expirationmonth" name="expirationmonth" type="text" size="10" value="<?php echo esc_attr($order->expirationmonth);?>" />
368
  <small class="pmpro_lite">MM</small>
369
  </td>
370
  </tr>
371
  <tr>
372
+ <th scope="row" valign="top"><label for="expirationyear">Expiration Year:</label></th>
373
  <td>
374
  <input id="expirationyear" name="expirationyear" type="text" size="10" value="<?php echo esc_attr($order->expirationyear);?>" />
375
  <small class="pmpro_lite">YYYY</small>
377
  </tr>
378
  <?php } ?>
379
  <tr>
380
+ <th scope="row" valign="top"><label for="status">Status:</label></th>
381
  <td>
382
  <?php if(in_array("status", $read_only_fields) && $order_id > 0) { echo $order->status; } else { ?>
383
  <?php
398
  </tr>
399
 
400
  <tr>
401
+ <th scope="row" valign="top"><label for="gateway">Gateway:</label></th>
402
  <td>
403
  <?php if(in_array("gateway", $read_only_fields) && $order_id > 0) { echo $order->gateway; } else { ?>
404
  <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
405
+ <option value="" <?php if(empty($order->gateway)) { ?>selected="selected"<?php } ?>>Testing Only</option>
406
+ <option value="check" <?php if($order->gateway == "check") { ?>selected="selected"<?php } ?>>Pay by Check</option>
407
  <option value="stripe" <?php if($order->gateway == "stripe") { ?>selected="selected"<?php } ?>>Stripe</option>
408
  <option value="paypalstandard" <?php if($order->gateway == "paypalstandard") { ?>selected="selected"<?php } ?>>PayPal Standard</option>
409
  <option value="paypalexpress" <?php if($order->gateway == "paypalexpress") { ?>selected="selected"<?php } ?>>PayPal Express</option>
415
  </td>
416
  </tr>
417
  <tr>
418
+ <th scope="row" valign="top"><label for="gateway_environment">Gateway Environment:</label></th>
419
  <td>
420
  <?php if(in_array("gateway_environment", $read_only_fields) && $order_id > 0) { echo $order->gateway_environment; } else { ?>
421
  <select name="gateway_environment">
422
+ <option value="sandbox" <?php if($order->gateway_environment == "sandbox") { ?>selected="selected"<?php } ?>>Sandbox/Testing</option>
423
+ <option value="live" <?php if($order->gateway_environment == "live") { ?>selected="selected"<?php } ?>>Live/Production</option>
424
  </select>
425
  <?php } ?>
426
  </td>
427
  </tr>
428
 
429
  <tr>
430
+ <th scope="row" valign="top"><label for="payment_transaction_id">Payment Transaction ID:</label></th>
431
  <td>
432
  <?php if(in_array("payment_transaction_id", $read_only_fields) && $order_id > 0) { echo $order->payment_transaction_id; } else { ?>
433
  <input id="payment_transaction_id" name="payment_transaction_id" type="text" size="50" value="<?php echo esc_attr($order->payment_transaction_id);?>" />
434
  <?php } ?>
435
+ <small class="pmpro_lite">Generated by the gateway. Useful to cross reference orders.</small>
436
  </td>
437
  </tr>
438
  <tr>
439
+ <th scope="row" valign="top"><label for="subscription_transaction_id">Subscription Transaction ID:</label></th>
440
  <td>
441
+ <?php if(in_array("code", $read_only_fields) && $order_id > 0) { echo $order->code; } else { ?>
442
  <input id="subscription_transaction_id" name="subscription_transaction_id" type="text" size="50" value="<?php echo esc_attr($order->subscription_transaction_id);?>" />
443
  <?php } ?>
444
+ <small class="pmpro_lite">Generated by the gateway. Useful to cross reference subscriptions.</small>
445
  </td>
446
  </tr>
447
 
448
  <tr>
449
+ <th scope="row" valign="top"><label for="ts_month">Date:</label></th>
450
  <td>
451
  <?php if(in_array("timestamp", $read_only_fields) && $order_id > 0) { echo date(option("date_format"), $order->timestamp); } else { ?>
452
  <?php
454
  if(!empty($order->timestamp))
455
  $timestamp = $order->timestamp;
456
  else
457
+ $timestamp = time();
458
 
459
  $year = date("Y", $timestamp);
460
  $month = date("n", $timestamp);
465
  for($i = 1; $i < 13; $i++)
466
  {
467
  ?>
468
+ <option value="<?php echo $i?>" <?php if($i == $month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $year))?></option>
469
  <?php
470
  }
471
  ?>
481
  if(!empty($affiliates)) {
482
  ?>
483
  <tr>
484
+ <th scope="row" valign="top"><label for="affiliate_id">Affiliate ID:</label></th>
485
  <td>
486
  <?php if(in_array("affiliate_id", $read_only_fields) && $order_id > 0) { echo $order->affiliate_id; } else { ?>
487
  <input id="affiliate_id" name="affiliate_id" type="text" size="50" value="<?php echo esc_attr($order->affiliate_id);?>" />
489
  </td>
490
  </tr>
491
  <tr>
492
+ <th scope="row" valign="top"><label for="affiliate_subid">Affiliate SubID:</label></th>
493
  <td>
494
  <?php if(in_array("affiliate_subid", $read_only_fields) && $order_id > 0) { echo $order->affiliate_subid; } else { ?>
495
  <input id="affiliate_subid" name="affiliate_subid" type="text" size="50" value="<?php echo esc_attr($order->affiliate_subid);?>" />
499
  <?php } ?>
500
 
501
  <tr>
502
+ <th scope="row" valign="top"><label for="notes">Notes:</label></th>
503
  <td>
504
  <?php if(in_array("notes", $read_only_fields) && $order_id > 0) { echo $order->notes; } else { ?>
505
  <textarea id="notes" name="notes" rows="5" cols="80"><?php echo esc_textarea($order->notes);?></textarea>
514
 
515
  <p class="submit topborder">
516
  <input name="order" type="hidden" value="<?php if(!empty($order->id)) echo $order->id; else echo $order_id;?>" />
517
+ <input name="save" type="submit" class="button-primary" value="Save Order" />
518
+ <input name="cancel" type="button" value="Cancel" onclick="location.href='<?php echo get_admin_url(NULL, '/admin.php?page=pmpro-orders')?>';" />
519
  </p>
520
 
521
  </form>
524
 
525
  <form id="posts-filter" method="get" action="">
526
  <h2>
527
+ Orders
528
+ <a href="admin.php?page=pmpro-orders&order=-1" class="button add-new-h2">+ Add New Order</a>
529
+ <a target="_blank" href="<?php echo admin_url('admin-ajax.php');?>?action=orders_csv&s=<?php echo $s?>&l=<?php echo $l?>" class="button add-new-h2">Export to CSV</a>
530
+ </h2>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
531
 
532
  <?php if(!empty($pmpro_msg)) { ?>
533
  <div id="message" class="<?php if($pmpro_msgt == "success") echo "updated fade"; else echo "error"; ?>"><p><?php echo $pmpro_msg?></p></div>
534
  <?php } ?>
535
 
 
536
  <ul class="subsubsub">
537
  <li>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
538
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
539
  </li>
540
  </ul>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
541
  <p class="search-box">
542
+ <label class="hidden" for="post-search-input">Search Orders:</label>
543
  <input type="hidden" name="page" value="pmpro-orders" />
544
  <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
545
+ <input class="button" type="submit" value="Search Orders"/>
546
  </p>
 
547
  <?php
548
  //some vars for the search
549
  if(isset($_REQUEST['pn']))
559
  $end = $pn * $limit;
560
  $start = $end - $limit;
561
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
562
  if($s)
563
  {
564
  $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 ";
577
  $fields = apply_filters("pmpro_orders_search_fields", $fields);
578
 
579
  foreach($fields as $field)
580
+ $sqlQuery .= " OR " . $field . " LIKE '%" . $wpdb->escape($s) . "%' ";
581
  $sqlQuery .= ") ";
 
 
 
582
  $sqlQuery .= "GROUP BY o.id ORDER BY o.id DESC, o.timestamp DESC ";
583
  }
584
  else
585
  {
586
+ $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders ORDER BY id DESC, timestamp DESC ";
587
  }
588
 
589
  $sqlQuery .= "LIMIT $start, $limit";
590
 
591
  $order_ids = $wpdb->get_col($sqlQuery);
 
592
  $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
593
 
594
  if($order_ids)
595
  {
596
  ?>
597
+ <p class="clear"><?php echo strval($totalrows)?> orders found.</span></p>
598
  <?php
599
  }
600
  ?>
601
  <table class="widefat">
602
  <thead>
603
  <tr class="thead">
604
+ <th>ID</th>
605
+ <th>Code</th>
606
+ <th>User</th>
607
  <?php do_action("pmpro_orders_extra_cols_header", $order_ids);?>
608
+ <th>Membership Level</th>
609
+ <th>Total</th>
610
+ <th>Payment</th>
611
+ <th>Gateway</th>
612
+ <th>Transaction IDs</th>
613
+ <th>Status</th>
614
+ <th>Date</th>
615
  <th></th>
616
  <th></th>
617
  <th></th>
634
  <?php if(!empty($order->user)) { ?>
635
  <a href="user-edit.php?user_id=<?php echo $order->user->ID?>"><?php echo $order->user->user_login?></a>
636
  <?php } else { ?>
637
+ [deleted]
638
  <?php } ?>
639
  </td>
640
  <?php do_action("pmpro_orders_extra_cols_body", $order);?>
655
  </td>
656
  <td><?php echo $order->gateway;?><?php if($order->gateway_environment == "test") echo "(test)";?></td>
657
  <td>
658
+ Payment: <?php if(!empty($order->payment_transaction_id)) echo $order->payment_transaction_id; else echo "N/A";?>
659
  <br />
660
+ Subscription: <?php if(!empty($order->subscription_transaction_id)) echo $order->subscription_transaction_id; else echo "N/A";?>
661
  </td>
662
  <td><?php echo $order->status;?></td>
663
  <td><?php echo date(get_option('date_format'), $order->timestamp);?></td>
664
  <td align="center">
665
+ <a href="admin.php?page=pmpro-orders&order=<?php echo $order->id;?>">edit</a>
666
  </td>
667
  <td align="center">
668
+ <a href="admin.php?page=pmpro-orders&order=-1&copy=<?php echo $order->id;?>">copy</a>
669
  </td>
670
  <td align="center">
671
+ <a href="javascript:askfirst('Deleting orders is permanent and can affect active users. Are you sure you want to delete order <?php echo str_replace("'", "", $order->code);?>?', 'admin.php?page=pmpro-orders&delete=<?php echo $order->id;?>'); void(0);">delete</a>
672
  </td>
673
  </tr>
674
  <?php
678
  {
679
  ?>
680
  <tr>
681
+ <td colspan="9"><p>No orders found.</p></td>
682
  </tr>
683
  <?php
684
  }
688
  </form>
689
 
690
  <?php
691
+ echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-orders&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
 
 
692
  ?>
693
 
694
  <?php } ?>
695
 
696
+ </div>
 
 
adminpages/pagesettings.php CHANGED
@@ -2,7 +2,7 @@
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_pagesettings")))
4
  {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
  }
7
 
8
  global $wpdb, $msg, $msgt;
@@ -46,37 +46,9 @@
46
  {
47
  if(!$pmpro_page_id)
48
  {
49
- switch ($pmpro_page_name) {
50
- case 'account':
51
- $pmpro_page_title = __( 'Membership Account', 'pmpro' );
52
- break;
53
- case 'billing':
54
- $pmpro_page_title = __( 'Membership Billing', 'pmpro' );
55
- break;
56
- case 'cancel':
57
- $pmpro_page_title = __( 'Membership Cancel', 'pmpro' );
58
- break;
59
- case 'checkout':
60
- $pmpro_page_title = __( 'Membership Checkout', 'pmpro' );
61
- break;
62
- case 'confirmation':
63
- $pmpro_page_title = __( 'Membership Confirmation', 'pmpro' );
64
- break;
65
- case 'invoice':
66
- $pmpro_page_title = __( 'Membership Invoice', 'pmpro' );
67
- break;
68
- case 'levels':
69
- $pmpro_page_title = __( 'Membership Levels', 'pmpro' );
70
- break;
71
-
72
- default:
73
- $pmpro_page_title = sprintf( __( 'Membership %s', 'Page title template', 'pmpro' ), ucwords($pmpro_page_name) );
74
- break;
75
- }
76
-
77
  //no id set. create an array to store the page info
78
  $insert = array(
79
- 'post_title' => $pmpro_page_title,
80
  'post_status' => 'publish',
81
  'post_type' => 'page',
82
  'post_content' => '[pmpro_' . $pmpro_page_name . ']',
@@ -108,7 +80,7 @@
108
  if(!empty($pages_created))
109
  {
110
  $msg = true;
111
- $msgt = __("The following pages have been created for you", "pmpro") . ": " . implode(", ", $pages_created) . ".";
112
  }
113
  }
114
 
@@ -117,19 +89,19 @@
117
 
118
 
119
  <form action="" method="post" enctype="multipart/form-data">
120
- <h2><?php _e('Pages', 'pmpro');?></h2>
121
  <?php
122
  global $pmpro_pages_ready;
123
  if($pmpro_pages_ready)
124
  {
125
  ?>
126
- <p><?php _e('Manage the WordPress pages assigned to each required Paid Memberships Pro page.', 'pmpro');?></p>
127
  <?php
128
  }
129
  else
130
  {
131
  ?>
132
- <p><?php _e('Assign the WordPress pages for each required Paid Memberships Pro page or', 'pmpro');?> <a href="?page=pmpro-pagesettings&createpages=1"><?php _e('click here to let us generate them for you', 'pmpro');?></a>.</p>
133
  <?php
134
  }
135
  ?>
@@ -137,118 +109,104 @@
137
  <tbody>
138
  <tr>
139
  <th scope="row" valign="top">
140
- <label for="account_page_id"><?php _e('Account Page', 'pmpro');?>:</label>
141
  </th>
142
  <td>
143
  <?php
144
  wp_dropdown_pages(array("name"=>"account_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['account']));
145
  ?>
146
  <?php if(!empty($pmpro_pages['account'])) { ?>
147
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['account'];?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
148
- &nbsp;
149
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['account']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
150
  <?php } ?>
151
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_account].</small>
152
  </td>
153
  <tr>
154
  <th scope="row" valign="top">
155
- <label for="billing_page_id"><?php _e('Billing Information Page', 'pmpro');?>:</label>
156
  </th>
157
  <td>
158
  <?php
159
  wp_dropdown_pages(array("name"=>"billing_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['billing']));
160
  ?>
161
  <?php if(!empty($pmpro_pages['billing'])) { ?>
162
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['billing']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
163
- &nbsp;
164
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['billing']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
165
  <?php } ?>
166
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_billing].</small>
167
  </td>
168
  <tr>
169
  <th scope="row" valign="top">
170
- <label for="cancel_page_id"><?php _e('Cancel Page', 'pmpro');?>:</label>
171
  </th>
172
  <td>
173
  <?php
174
  wp_dropdown_pages(array("name"=>"cancel_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['cancel']));
175
  ?>
176
  <?php if(!empty($pmpro_pages['cancel'])) { ?>
177
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['cancel']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
178
- &nbsp;
179
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['cancel']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
180
  <?php } ?>
181
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_cancel].</small>
182
  </td>
183
  </tr>
184
  <tr>
185
  <th scope="row" valign="top">
186
- <label for="checkout_page_id"><?php _e('Checkout Page', 'pmpro');?>:</label>
187
  </th>
188
  <td>
189
  <?php
190
  wp_dropdown_pages(array("name"=>"checkout_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['checkout']));
191
  ?>
192
  <?php if(!empty($pmpro_pages['checkout'])) { ?>
193
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['checkout']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
194
- &nbsp;
195
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['checkout']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
196
  <?php } ?>
197
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_checkout].</small>
198
  </td>
199
  </tr>
200
  <tr>
201
  <th scope="row" valign="top">
202
- <label for="confirmation_page_id"><?php _e('Confirmation Page', 'pmpro');?>:</label>
203
  </th>
204
  <td>
205
  <?php
206
  wp_dropdown_pages(array("name"=>"confirmation_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['confirmation']));
207
  ?>
208
  <?php if(!empty($pmpro_pages['confirmation'])) { ?>
209
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['confirmation']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
210
- &nbsp;
211
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['confirmation']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
212
  <?php } ?>
213
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_confirmation].</small>
214
  </td>
215
  </tr>
216
  <tr>
217
  <th scope="row" valign="top">
218
- <label for="invoice_page_id"><?php _e('Invoice Page', 'pmpro');?>:</label>
219
  </th>
220
  <td>
221
  <?php
222
  wp_dropdown_pages(array("name"=>"invoice_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['invoice']));
223
  ?>
224
  <?php if(!empty($pmpro_pages['invoice'])) { ?>
225
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['invoice']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
226
- &nbsp;
227
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['invoice']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
228
  <?php } ?>
229
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_invoice].</small>
230
  </td>
231
  </tr>
232
  <tr>
233
  <th scope="row" valign="top">
234
- <label for="levels_page_id"><?php _e('Levels Page', 'pmpro');?>:</label>
235
  </th>
236
  <td>
237
  <?php
238
  wp_dropdown_pages(array("name"=>"levels_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['levels']));
239
  ?>
240
  <?php if(!empty($pmpro_pages['levels'])) { ?>
241
- <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['levels']?>&action=edit" class="button button-secondary pmpro_page_edit"><?php _e('edit page', 'pmpro');?></a>
242
- &nbsp;
243
- <a target="_blank" href="<?php echo get_permalink($pmpro_pages['levels']);?>" class="button button-secondary pmpro_page_view"><?php _e('view page', 'pmpro');?></a>
244
  <?php } ?>
245
- <br /><small class="pmpro_lite"><?php _e('Include the shortcode', 'pmpro');?> [pmpro_levels].</small>
246
  </td>
247
  </tr>
248
  </tbody>
249
  </table>
250
  <p class="submit">
251
- <input name="savesettings" type="submit" class="button button-primary" value="<?php _e('Save Settings', 'pmpro');?>" />
252
  </p>
253
  </form>
254
 
2
  //only admins can get this
3
  if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_pagesettings")))
4
  {
5
+ die("You do not have permissions to perform this action.");
6
  }
7
 
8
  global $wpdb, $msg, $msgt;
46
  {
47
  if(!$pmpro_page_id)
48
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  //no id set. create an array to store the page info
50
  $insert = array(
51
+ 'post_title' => 'Membership ' . ucwords($pmpro_page_name),
52
  'post_status' => 'publish',
53
  'post_type' => 'page',
54
  'post_content' => '[pmpro_' . $pmpro_page_name . ']',
80
  if(!empty($pages_created))
81
  {
82
  $msg = true;
83
+ $msgt = "The following pages have been created for you: " . implode(", ", $pages_created) . ".";
84
  }
85
  }
86
 
89
 
90
 
91
  <form action="" method="post" enctype="multipart/form-data">
92
+ <h2>Pages</h2>
93
  <?php
94
  global $pmpro_pages_ready;
95
  if($pmpro_pages_ready)
96
  {
97
  ?>
98
+ <p>Manage the WordPress pages assigned to each required Paid Memberships Pro page.</p>
99
  <?php
100
  }
101
  else
102
  {
103
  ?>
104
+ <p>Assign the WordPress pages for each required Paid Memberships Pro page or <a href="?page=pmpro-pagesettings&createpages=1">click here to let us generate them for you</a>.</p>
105
  <?php
106
  }
107
  ?>
109
  <tbody>
110
  <tr>
111
  <th scope="row" valign="top">
112
+ <label for="account_page_id">Account Page:</label>
113
  </th>
114
  <td>
115
  <?php
116
  wp_dropdown_pages(array("name"=>"account_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['account']));
117
  ?>
118
  <?php if(!empty($pmpro_pages['account'])) { ?>
119
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['account']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
120
  <?php } ?>
121
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_account].</small>
122
  </td>
123
  <tr>
124
  <th scope="row" valign="top">
125
+ <label for="billing_page_id">Billing Information Page:</label>
126
  </th>
127
  <td>
128
  <?php
129
  wp_dropdown_pages(array("name"=>"billing_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['billing']));
130
  ?>
131
  <?php if(!empty($pmpro_pages['billing'])) { ?>
132
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['billing']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
133
  <?php } ?>
134
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_billing].</small>
135
  </td>
136
  <tr>
137
  <th scope="row" valign="top">
138
+ <label for="cancel_page_id">Cancel Page:</label>
139
  </th>
140
  <td>
141
  <?php
142
  wp_dropdown_pages(array("name"=>"cancel_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['cancel']));
143
  ?>
144
  <?php if(!empty($pmpro_pages['cancel'])) { ?>
145
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['cancel']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
146
  <?php } ?>
147
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_cancel].</small>
148
  </td>
149
  </tr>
150
  <tr>
151
  <th scope="row" valign="top">
152
+ <label for="checkout_page_id">Checkout Page:</label>
153
  </th>
154
  <td>
155
  <?php
156
  wp_dropdown_pages(array("name"=>"checkout_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['checkout']));
157
  ?>
158
  <?php if(!empty($pmpro_pages['checkout'])) { ?>
159
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['checkout']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
160
  <?php } ?>
161
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_checkout].</small>
162
  </td>
163
  </tr>
164
  <tr>
165
  <th scope="row" valign="top">
166
+ <label for="confirmation_page_id">Confirmation Page:</label>
167
  </th>
168
  <td>
169
  <?php
170
  wp_dropdown_pages(array("name"=>"confirmation_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['confirmation']));
171
  ?>
172
  <?php if(!empty($pmpro_pages['confirmation'])) { ?>
173
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['confirmation']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
174
  <?php } ?>
175
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_confirmation].</small>
176
  </td>
177
  </tr>
178
  <tr>
179
  <th scope="row" valign="top">
180
+ <label for="invoice_page_id">Invoice Page:</label>
181
  </th>
182
  <td>
183
  <?php
184
  wp_dropdown_pages(array("name"=>"invoice_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['invoice']));
185
  ?>
186
  <?php if(!empty($pmpro_pages['invoice'])) { ?>
187
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['invoice']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
188
  <?php } ?>
189
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_invoice].</small>
190
  </td>
191
  </tr>
192
  <tr>
193
  <th scope="row" valign="top">
194
+ <label for="levels_page_id">Levels Page:</label>
195
  </th>
196
  <td>
197
  <?php
198
  wp_dropdown_pages(array("name"=>"levels_page_id", "show_option_none"=>"-- Choose One --", "selected"=>$pmpro_pages['levels']));
199
  ?>
200
  <?php if(!empty($pmpro_pages['levels'])) { ?>
201
+ <a target="_blank" href="post.php?post=<?php echo $pmpro_pages['levels']?>&action=edit" class="pmpro_page_edit">edit page</a>
 
 
202
  <?php } ?>
203
+ <br /><small class="pmpro_lite">Include the shortcode [pmpro_levels].</small>
204
  </td>
205
  </tr>
206
  </tbody>
207
  </table>
208
  <p class="submit">
209
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
210
  </p>
211
  </form>
212
 
adminpages/paymentsettings.php CHANGED
@@ -1,538 +1,484 @@
1
- <?php
2
- //only admins can get this
3
- if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_paymentsettings")))
4
- {
5
- die(__("You do not have permissions to perform this action.", "pmpro"));
6
- }
7
-
8
- global $wpdb, $pmpro_currency_symbol, $msg, $msgt;
9
-
10
- //get/set settings
11
- if(!empty($_REQUEST['savesettings']))
12
- {
13
- pmpro_setOption("sslseal");
14
- pmpro_setOption("nuclear_HTTPS");
15
-
16
- //gateway options
17
- pmpro_setOption("gateway");
18
- pmpro_setOption("gateway_environment");
19
- pmpro_setOption("gateway_email");
20
- pmpro_setOption("payflow_partner");
21
- pmpro_setOption("payflow_vendor");
22
- pmpro_setOption("payflow_user");
23
- pmpro_setOption("payflow_pwd");
24
- pmpro_setOption("apiusername");
25
- pmpro_setOption("apipassword");
26
- pmpro_setOption("apisignature");
27
- pmpro_setOption("loginname");
28
- pmpro_setOption("transactionkey");
29
- pmpro_setOption("stripe_secretkey");
30
- pmpro_setOption("stripe_publishablekey");
31
- pmpro_setOption("stripe_billingaddress");
32
- pmpro_setOption("braintree_merchantid");
33
- pmpro_setOption("braintree_publickey");
34
- pmpro_setOption("braintree_privatekey");
35
- pmpro_setOption("braintree_encryptionkey");
36
- pmpro_setOption("twocheckout_apiusername");
37
- pmpro_setOption("twocheckout_apipassword");
38
- pmpro_setOption("twocheckout_accountnumber");
39
- pmpro_setOption("twocheckout_secretword");
40
- pmpro_setOption("cybersource_merchantid");
41
- pmpro_setOption("cybersource_securitykey");
42
-
43
- //currency
44
- pmpro_setOption("currency");
45
-
46
- //credit cards
47
- $pmpro_accepted_credit_cards = array();
48
- if(!empty($_REQUEST['creditcards_visa']))
49
- $pmpro_accepted_credit_cards[] = "Visa";
50
- if(!empty($_REQUEST['creditcards_mastercard']))
51
- $pmpro_accepted_credit_cards[] = "Mastercard";
52
- if(!empty($_REQUEST['creditcards_amex']))
53
- $pmpro_accepted_credit_cards[] = "American Express";
54
- if(!empty($_REQUEST['creditcards_discover']))
55
- $pmpro_accepted_credit_cards[] = "Discover";
56
- if(!empty($_REQUEST['creditcards_dinersclub']))
57
- $pmpro_accepted_credit_cards[] = "Diners Club";
58
- if(!empty($_REQUEST['creditcards_enroute']))
59
- $pmpro_accepted_credit_cards[] = "EnRoute";
60
- if(!empty($_REQUEST['creditcards_jcb']))
61
- $pmpro_accepted_credit_cards[] = "JCB";
62
-
63
- //check instructions
64
- pmpro_setOption("instructions");
65
-
66
- //use_ssl
67
- pmpro_setOption("use_ssl");
68
-
69
- //tax
70
- pmpro_setOption("tax_state");
71
- pmpro_setOption("tax_rate");
72
-
73
- pmpro_setOption("accepted_credit_cards", implode(",", $pmpro_accepted_credit_cards));
74
-
75
- //assume success
76
- $msg = true;
77
- $msgt = __("Your payment settings have been updated.", "pmpro");
78
- }
79
-
80
- $sslseal = pmpro_getOption("sslseal");
81
- $nuclear_HTTPS = pmpro_getOption("nuclear_HTTPS");
82
-
83
- $gateway = pmpro_getOption("gateway");
84
- $gateway_environment = pmpro_getOption("gateway_environment");
85
- $gateway_email = pmpro_getOption("gateway_email");
86
- $payflow_partner = pmpro_getOption("payflow_partner");
87
- $payflow_vendor = pmpro_getOption("payflow_vendor");
88
- $payflow_user = pmpro_getOption("payflow_user");
89
- $payflow_pwd = pmpro_getOption("payflow_pwd");
90
- $apiusername = pmpro_getOption("apiusername");
91
- $apipassword = pmpro_getOption("apipassword");
92
- $apisignature = pmpro_getOption("apisignature");
93
- $loginname = pmpro_getOption("loginname");
94
- $transactionkey = pmpro_getOption("transactionkey");
95
- $stripe_secretkey = pmpro_getOption("stripe_secretkey");
96
- $stripe_publishablekey = pmpro_getOption("stripe_publishablekey");
97
- $stripe_billingaddress = pmpro_getOption("stripe_billingaddress");
98
- $braintree_merchantid = pmpro_getOption("braintree_merchantid");
99
- $braintree_publickey = pmpro_getOption("braintree_publickey");
100
- $braintree_privatekey = pmpro_getOption("braintree_privatekey");
101
- $braintree_encryptionkey = pmpro_getOption("braintree_encryptionkey");
102
- $twocheckout_apiusername = pmpro_getOption("twocheckout_apiusername");
103
- $twocheckout_apipassword = pmpro_getOption("twocheckout_apipassword");
104
- $twocheckout_accountnumber = pmpro_getOption("twocheckout_accountnumber");
105
- $twocheckout_secretword = pmpro_getOption("twocheckout_secretword");
106
- $cybersource_merchantid = pmpro_getOption("cybersource_merchantid");
107
- $cybersource_securitykey = pmpro_getOption("cybersource_securitykey");
108
-
109
- $currency = pmpro_getOption("currency");
110
-
111
- $pmpro_accepted_credit_cards = pmpro_getOption("accepted_credit_cards");
112
-
113
- $instructions = pmpro_getOption("instructions");
114
-
115
- $tax_state = pmpro_getOption("tax_state");
116
- $tax_rate = pmpro_getOption("tax_rate");
117
-
118
- //make sure the tax rate is not > 1
119
- if((double)$tax_rate > 1)
120
- {
121
- //assume the entered X%
122
- $tax_rate = $tax_rate / 100;
123
- pmpro_setOption("tax_rate", $tax_rate);
124
- }
125
-
126
- $use_ssl = pmpro_getOption("use_ssl");
127
-
128
- //default settings
129
- if(empty($gateway_environment))
130
- {
131
- $gateway_environment = "sandbox";
132
- pmpro_setOption("gateway_environment", $gateway_environment);
133
- }
134
- if(empty($pmpro_accepted_credit_cards))
135
- {
136
- $pmpro_accepted_credit_cards = "Visa,Mastercard,American Express,Discover";
137
- pmpro_setOption("accepted_credit_cards", $pmpro_accepted_credit_cards);
138
- }
139
-
140
- $pmpro_accepted_credit_cards = explode(",", $pmpro_accepted_credit_cards);
141
-
142
- require_once(dirname(__FILE__) . "/admin_header.php");
143
- ?>
144
-
145
- <form action="" method="post" enctype="multipart/form-data">
146
- <h2><?php _e('Payment Gateway', 'pmpro');?> &amp; <?php _e('SSL Settings', 'pmpro');?></h2>
147
-
148
- <p><?php _e('Learn more about <a title="Paid Memberships Pro - SSL Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/ssl/">SSL</a> or <a title="Paid Memberships Pro - Payment Gateway Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/payment-gateway/">Payment Gateway Settings</a>.', 'pmpro'); ?></p>
149
-
150
- <table class="form-table">
151
- <tbody>
152
- <tr>
153
- <th scope="row" valign="top">
154
- <label for="gateway"><?php _e('Payment Gateway', 'pmpro');?>:</label>
155
- </th>
156
- <td>
157
- <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
158
- <option value="">Testing Only</option>
159
- <option value="check" <?php selected( $gateway, "check" ); ?>><?php _e('Pay by Check', 'pmpro');?></option>
160
- <option value="stripe" <?php selected( $gateway, "stripe" ); ?>>Stripe</option>
161
- <option value="paypalexpress" <?php selected( $gateway, "paypalexpress" ); ?>>PayPal Express</option>
162
- <option value="paypal" <?php selected( $gateway, "paypal" ); ?>>PayPal Website Payments Pro</option>
163
- <option value="payflowpro" <?php selected( $gateway, "payflowpro" ); ?>>PayPal Payflow Pro/PayPal Pro</option>
164
- <option value="paypalstandard" <?php selected( $gateway, "paypalstandard" ); ?>>PayPal Standard</option>
165
- <option value="authorizenet" <?php selected( $gateway, "authorizenet" ); ?>>Authorize.net</option>
166
- <option value="braintree" <?php selected( $gateway, "braintree" ); ?>>Braintree Payments</option>
167
- <option value="twocheckout" <?php selected( $gateway, "twocheckout" ); ?>>2Checkout</option>
168
- <option value="cybersource" <?php selected( $gateway, "cybersource" ); ?>>CyberSource</option>
169
- </select>
170
- </td>
171
- </tr>
172
- <tr class="gateway gateway_cybersource gateway_twocheckout" <?php if($gateway != "cybersource" && $gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
173
- <td colspan="2">
174
- <strong><?php _e('Note', 'pmpro');?>:</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>', 'pmpro');?>
175
- </td>
176
- </tr>
177
- <tr class="gateway gateway_paypalstandard" <?php if($gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
178
- <td colspan="2">
179
- <strong><?php _e('Note', 'pmpro');?>:</strong> <?php _e('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="http://www.paidmembershipspro.com/2013/09/read-using-paypal-standard-paid-memberships-pro/">More information on why can be found here.</a>', 'pmpro');?>
180
- </td>
181
- </tr>
182
- <tr>
183
- <th scope="row" valign="top">
184
- <label for="gateway_environment"><?php _e('Gateway Environment', 'pmpro');?>:</label>
185
- </th>
186
- <td>
187
- <select name="gateway_environment">
188
- <option value="sandbox" <?php selected( $gateway_environment, "sandbox" ); ?>><?php _e('Sandbox/Testing', 'pmpro');?></option>
189
- <option value="live" <?php selected( $gateway_environment, "live" ); ?>><?php _e('Live/Production', 'pmpro');?></option>
190
- </select>
191
- <script>
192
- function pmpro_changeGateway(gateway)
193
- {
194
- //hide all gateway options
195
- jQuery('tr.gateway').hide();
196
- jQuery('tr.gateway_'+gateway).show();
197
- }
198
- pmpro_changeGateway(jQuery('#gateway').val());
199
- </script>
200
- </td>
201
- </tr>
202
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
203
- <th scope="row" valign="top">
204
- <label for="payflow_partner"><?php _e('Partner', 'pmpro');?>:</label>
205
- </th>
206
- <td>
207
- <input type="text" id="payflow_partner" name="payflow_partner" size="60" value="<?php echo esc_attr($payflow_partner)?>" />
208
- </td>
209
- </tr>
210
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
211
- <th scope="row" valign="top">
212
- <label for="payflow_vendor"><?php _e('Vendor', 'pmpro');?>:</label>
213
- </th>
214
- <td>
215
- <input type="text" id="payflow_vendor" name="payflow_vendor" size="60" value="<?php echo esc_attr($payflow_vendor)?>" />
216
- </td>
217
- </tr>
218
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
219
- <th scope="row" valign="top">
220
- <label for="payflow_user"><?php _e('User', 'pmpro');?>:</label>
221
- </th>
222
- <td>
223
- <input type="text" id="payflow_user" name="payflow_user" size="60" value="<?php echo esc_attr($payflow_user)?>" />
224
- </td>
225
- </tr>
226
- <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
227
- <th scope="row" valign="top">
228
- <label for="payflow_pwd"><?php _e('Password', 'pmpro');?>:</label>
229
- </th>
230
- <td>
231
- <input type="password" id="payflow_pwd" name="payflow_pwd" size="60" value="<?php echo esc_attr($payflow_pwd)?>" />
232
- </td>
233
- </tr>
234
- <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
235
- <th scope="row" valign="top">
236
- <label for="gateway_email"><?php _e('Gateway Account Email', 'pmpro');?>:</label>
237
- </th>
238
- <td>
239
- <input type="text" id="gateway_email" name="gateway_email" size="60" value="<?php echo esc_attr($gateway_email)?>" />
240
- </td>
241
- </tr>
242
- <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
243
- <th scope="row" valign="top">
244
- <label for="apiusername"><?php _e('API Username', 'pmpro');?>:</label>
245
- </th>
246
- <td>
247
- <input type="text" id="apiusername" name="apiusername" size="60" value="<?php echo esc_attr($apiusername)?>" />
248
- </td>
249
- </tr>
250
- <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
251
- <th scope="row" valign="top">
252
- <label for="apipassword"><?php _e('API Password', 'pmpro');?>:</label>
253
- </th>
254
- <td>
255
- <input type="text" id="apipassword" name="apipassword" size="60" value="<?php echo esc_attr($apipassword)?>" />
256
- </td>
257
- </tr>
258
- <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
259
- <th scope="row" valign="top">
260
- <label for="apisignature"><?php _e('API Signature', 'pmpro');?>:</label>
261
- </th>
262
- <td>
263
- <input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($apisignature)?>" />
264
- </td>
265
- </tr>
266
-
267
- <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
268
- <th scope="row" valign="top">
269
- <label for="loginname"><?php _e('Login Name', 'pmpro');?>:</label>
270
- </th>
271
- <td>
272
- <input type="text" id="loginname" name="loginname" size="60" value="<?php echo esc_attr($loginname)?>" />
273
- </td>
274
- </tr>
275
- <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
276
- <th scope="row" valign="top">
277
- <label for="transactionkey"><?php _e('Transaction Key', 'pmpro');?>:</label>
278
- </th>
279
- <td>
280
- <input type="text" id="transactionkey" name="transactionkey" size="60" value="<?php echo esc_attr($transactionkey)?>" />
281
- </td>
282
- </tr>
283
-
284
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
285
- <th scope="row" valign="top">
286
- <label for="stripe_secretkey"><?php _e('Secret Key', 'pmpro');?>:</label>
287
- </th>
288
- <td>
289
- <input type="text" id="stripe_secretkey" name="stripe_secretkey" size="60" value="<?php echo esc_attr($stripe_secretkey)?>" />
290
- </td>
291
- </tr>
292
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
293
- <th scope="row" valign="top">
294
- <label for="stripe_publishablekey"><?php _e('Publishable Key', 'pmpro');?>:</label>
295
- </th>
296
- <td>
297
- <input type="text" id="stripe_publishablekey" name="stripe_publishablekey" size="60" value="<?php echo esc_attr($stripe_publishablekey)?>" />
298
- </td>
299
- </tr>
300
-
301
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
302
- <th scope="row" valign="top">
303
- <label for="braintree_merchantid"><?php _e('Merchant ID', 'pmpro');?>:</label>
304
- </th>
305
- <td>
306
- <input type="text" id="braintree_merchantid" name="braintree_merchantid" size="60" value="<?php echo esc_attr($braintree_merchantid)?>" />
307
- </td>
308
- </tr>
309
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
310
- <th scope="row" valign="top">
311
- <label for="braintree_publickey"><?php _e('Public Key', 'pmpro');?>:</label>
312
- </th>
313
- <td>
314
- <input type="text" id="braintree_publickey" name="braintree_publickey" size="60" value="<?php echo esc_attr($braintree_publickey)?>" />
315
- </td>
316
- </tr>
317
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
318
- <th scope="row" valign="top">
319
- <label for="braintree_privatekey"><?php _e('Private Key', 'pmpro');?>:</label>
320
- </th>
321
- <td>
322
- <input type="text" id="braintree_privatekey" name="braintree_privatekey" size="60" value="<?php echo esc_attr($braintree_privatekey)?>" />
323
- </td>
324
- </tr>
325
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
326
- <th scope="row" valign="top">
327
- <label for="braintree_encryptionkey"><?php _e('Client-Side Encryption Key', 'pmpro');?>:</label>
328
- </th>
329
- <td>
330
- <textarea id="braintree_encryptionkey" name="braintree_encryptionkey" rows="3" cols="80"><?php echo esc_textarea($braintree_encryptionkey)?></textarea>
331
- </td>
332
- </tr>
333
-
334
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
335
- <th scope="row" valign="top">
336
- <label for="twocheckout_apiusername"><?php _e('API Username', 'pmpro');?>:</label>
337
- </th>
338
- <td>
339
- <input type="text" id="twocheckout_apiusername" name="twocheckout_apiusername" size="60" value="<?php echo esc_attr($twocheckout_apiusername)?>" />
340
- </td>
341
- </tr>
342
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
343
- <th scope="row" valign="top">
344
- <label for="twocheckout_apipassword"><?php _e('API Password', 'pmpro');?>:</label>
345
- </th>
346
- <td>
347
- <input type="text" id="twocheckout_apipassword" name="twocheckout_apipassword" size="60" value="<?php echo esc_attr($twocheckout_apipassword)?>" />
348
- </td>
349
- </tr>
350
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
351
- <th scope="row" valign="top">
352
- <label for="twocheckout_accountnumber"><?php _e('Account Number', 'pmpro');?>:</label>
353
- </th>
354
- <td>
355
- <input type="text" name="twocheckout_accountnumber" size="60" value="<?php echo $twocheckout_accountnumber?>" />
356
- </td>
357
- </tr>
358
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
359
- <th scope="row" valign="top">
360
- <label for="twocheckout_secretword"><?php _e('Secret Word', 'pmpro');?>:</label>
361
- </th>
362
- <td>
363
- <input type="text" name="twocheckout_secretword" size="60" value="<?php echo $twocheckout_secretword?>" />
364
- </td>
365
- </tr>
366
-
367
- <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
368
- <th scope="row" valign="top">
369
- <label for="cybersource_merchantid"><?php _e('Merchant ID', 'pmpro');?>:</label>
370
- </th>
371
- <td>
372
- <input type="text" id="cybersource_merchantid" name="cybersource_merchantid" size="60" value="<?php echo esc_attr($cybersource_merchantid)?>" />
373
- </td>
374
- </tr>
375
- <tr class="gateway gateway_cybersource" <?php if($gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
376
- <th scope="row" valign="top">
377
- <label for="cybersource_securitykey"><?php _e('Transaction Security Key', 'pmpro');?>:</label>
378
- </th>
379
- <td>
380
- <textarea id="cybersource_securitykey" name="cybersource_securitykey" rows="3" cols="80"><?php echo esc_textarea($cybersource_securitykey);?></textarea>
381
- </td>
382
- </tr>
383
-
384
- <tr class="gateway gateway_ gateway_paypal gateway_paypalexpress gateway_paypalstandard gateway_braintree gateway_twocheckout gateway_cybersource gateway_stripe gateway_authorizenet gateway_payflowpro gateway_check" <?php if(!empty($gateway) && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource" && $gateway != "payflowpro" && $gateway != "stripe" && $gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
385
- <th scope="row" valign="top">
386
- <label for="currency"><?php _e('Currency', 'pmpro');?>:</label>
387
- </th>
388
- <td>
389
- <select name="currency">
390
- <?php
391
- global $pmpro_currencies;
392
- foreach($pmpro_currencies as $ccode => $cdescription)
393
- {
394
- ?>
395
- <option value="<?php echo $ccode?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo $cdescription?></option>
396
- <?php
397
- }
398
- ?>
399
- </select>
400
- <small><?php _e( 'Not all currencies will be supported by every gateway. Please check with your gateway.', 'pmpro' ); ?></small>
401
- </td>
402
- </tr>
403
-
404
- <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_payflowpro gateway_braintree gateway_twocheckout gateway_cybersource" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "stripe" && $gateway != "payflowpro" && $gateway != "braintree" && $gateway != "twocheckout" && $gateway != "cybersource") { ?>style="display: none;"<?php } ?>>
405
- <th scope="row" valign="top">
406
- <label for="creditcards"><?php _e('Accepted Credit Card Types', 'pmpro');?></label>
407
- </th>
408
- <td>
409
- <input type="checkbox" name="creditcards_visa" value="1" <?php if(in_array("Visa", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Visa<br />
410
- <input type="checkbox" name="creditcards_mastercard" value="1" <?php if(in_array("Mastercard", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Mastercard<br />
411
- <input type="checkbox" name="creditcards_amex" value="1" <?php if(in_array("American Express", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> American Express<br />
412
- <input type="checkbox" name="creditcards_discover" value="1" <?php if(in_array("Discover", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Discover<br />
413
- <input type="checkbox" name="creditcards_dinersclub" value="1" <?php if(in_array("Diners Club", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> Diner's Club<br />
414
- <input type="checkbox" name="creditcards_enroute" value="1" <?php if(in_array("EnRoute", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> EnRoute<br />
415
- <input type="checkbox" name="creditcards_jcb" value="1" <?php if(in_array("JCB", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> JCB<br />
416
- </td>
417
- </tr>
418
- <tr class="gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
419
- <th scope="row" valign="top">
420
- <label for="instructions"><?php _e('Instructions', 'pmpro');?></label>
421
- </th>
422
- <td>
423
- <textarea id="instructions" name="instructions" rows="3" cols="80"><?php echo esc_textarea($instructions)?></textarea>
424
- <p><small><?php _e('Who to write the check out to. Where to mail it. Shown on checkout, confirmation, and invoice pages.', 'pmpro');?></small></p>
425
- </td>
426
- </tr>
427
-
428
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
429
- <th scope="row" valign="top">
430
- <label for="stripe_billingaddress"><?php _e('Show Billing Address Fields', 'pmpro');?>:</label>
431
- </th>
432
- <td>
433
- <select id="stripe_billingaddress" name="stripe_billingaddress">
434
- <option value="0" <?php if(empty($stripe_billingaddress)) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
435
- <option value="1" <?php if(!empty($stripe_billingaddress)) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'pmpro');?></option>
436
- </select>
437
- <small><?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>", 'pmpro');?></small>
438
- </td>
439
- </tr>
440
-
441
- <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_paypalexpress gateway_check gateway_paypalstandard gateway_payflowpro gateway_braintree gateway_twocheckout gateway_cybersource" <?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 } ?>>
442
- <th scope="row" valign="top">
443
- <label for="tax"><?php _e('Sales Tax', 'pmpro');?> <small>(<?php _e('optional', 'pmpro');?>)</small></label>
444
- </th>
445
- <td>
446
- <?php _e('Tax State', 'pmpro');?>:
447
- <input type="text" id="tax_state" name="tax_state" size="4" value="<?php echo esc_attr($tax_state)?>" /> <small>(<?php _e('abbreviation, e.g. "PA"', 'pmpro');?>)</small>
448
- &nbsp; Tax Rate:
449
- <input type="text" id="tax_rate" name="tax_rate" size="10" value="<?php echo esc_attr($tax_rate)?>" /> <small>(<?php _e('decimal, e.g. "0.06"', 'pmpro');?>)</small>
450
- <p><small><?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="http://www.paidmembershipspro.com/2013/10/non-us-taxes-paid-memberships-pro/">pmpro_tax filter</a>.', 'pmpro');?></small></p>
451
- </td>
452
- </tr>
453
- <tr class="gateway gateway_ gateway_stripe gateway_paypalexpress gateway_check gateway_paypalstandard gateway_braintree gateway_twocheckout gateway_cybersource gateway_payflowpro gateway_authorizenet gateway_paypal">
454
- <th scope="row" valign="top">
455
- <label for="use_ssl"><?php _e('Force SSL', 'pmpro');?>:</label>
456
- </th>
457
- <td>
458
- <select id="use_ssl" name="use_ssl">
459
- <option value="0" <?php if(empty($use_ssl)) { ?>selected="selected"<?php } ?>><?php _e('No', 'pmpro');?></option>
460
- <option value="1" <?php if(!empty($use_ssl) && $use_ssl == 1) { ?>selected="selected"<?php } ?>><?php _e('Yes', 'pmpro');?></option>
461
- <option value="2" <?php if(!empty($use_ssl) && $use_ssl == 2) { ?>selected="selected"<?php } ?>><?php _e('Yes (with JavaScript redirects)', 'pmpro');?></option>
462
- </select>
463
- <small>Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops.</small>
464
- </td>
465
- </tr>
466
- <tr>
467
- <th scope="row" valign="top">
468
- <label for="sslseal"><?php _e('SSL Seal Code', 'pmpro');?>:</label>
469
- </th>
470
- <td>
471
- <textarea id="sslseal" name="sslseal" rows="3" cols="80"><?php echo stripslashes(esc_textarea($sslseal))?></textarea>
472
- <br /><small>Your <strong><a target="_blank" href="http://www.paidmembershipspro.com/documentation/initial-plugin-setup/ssl/">SSL Certificate</a></strong> must be installed by your web host. Your <strong>SSL Seal</strong> will be a short HTML or JavaScript snippet that can be pasted here.</small>
473
- </td>
474
- </tr>
475
- <tr>
476
- <th scope="row" valign="top">
477
- <label for="nuclear_HTTPS"><?php _e('HTTPS Nuclear Option', 'pmpro');?>:</label>
478
- </th>
479
- <td>
480
- <input type="checkbox" id="nuclear_HTTPS" name="nuclear_HTTPS" value="1" <?php if(!empty($nuclear_HTTPS)) { ?>checked="checked"<?php } ?> /> <?php _e('Use the "Nuclear Option" to use secure (HTTPS) URLs on your secure pages. Check this if you are using SSL and have warnings on your checkout pages.', 'pmpro');?>
481
- </td>
482
- </tr>
483
- <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard gateway_payflowpro" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard" && $gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
484
- <th scope="row" valign="top">
485
- <label><?php _e('IPN Handler URL', 'pmpro');?>:</label>
486
- </th>
487
- <td>
488
- <p><?php _e('To fully integrate with PayPal, be sure to set your IPN Handler URL to ', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=ipnhandler";?></pre></p>
489
- </td>
490
- </tr>
491
- <tr class="gateway gateway_twocheckout" <?php if($gateway != "twocheckout") { ?>style="display: none;"<?php } ?>>
492
- <th scope="row" valign="top">
493
- <label><?php _e('TwoCheckout INS URL', 'pmpro');?>:</label>
494
- </th>
495
- <td>
496
- <p><?php _e('To fully integrate with 2Checkout, be sure to set your 2Checkout INS URL ', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=twocheckout-ins";?></pre></p>
497
- </td>
498
- </tr>
499
- <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
500
- <th scope="row" valign="top">
501
- <label><?php _e('Silent Post URL', 'pmpro');?>:</label>
502
- </th>
503
- <td>
504
- <p><?php _e('To fully integrate with Authorize.net, be sure to set your Silent Post URL to', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=authnet_silent_post";?></pre></p>
505
- </td>
506
- </tr>
507
- <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
508
- <th scope="row" valign="top">
509
- <label><?php _e('Web Hook URL', 'pmpro');?>:</label>
510
- </th>
511
- <td>
512
- <p><?php _e('To fully integrate with Stripe, be sure to set your Web Hook URL to', 'pmpro');?> <pre><?php echo admin_url("admin-ajax.php") . "?action=stripe_webhook";?></pre></p>
513
- </td>
514
- </tr>
515
- <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
516
- <th scope="row" valign="top">
517
- <label><?php _e('Web Hook URL', 'pmpro');?>:</label>
518
- </th>
519
- <td>
520
- <p>
521
- <?php _e('To fully integrate with Braintree, be sure to set your Web Hook URL to', 'pmpro');?>
522
- <pre><?php
523
- //echo admin_url("admin-ajax.php") . "?action=braintree_webhook";
524
- echo PMPRO_URL . "/services/braintree-webhook.php";
525
- ?></pre>.
526
- </p>
527
- </td>
528
- </tr>
529
- </tbody>
530
- </table>
531
- <p class="submit">
532
- <input name="savesettings" type="submit" class="button-primary" value="<?php _e('Save Settings', 'pmpro');?>" />
533
- </p>
534
- </form>
535
-
536
- <?php
537
- require_once(dirname(__FILE__) . "/admin_footer.php");
538
- ?>
1
+ <?php
2
+ //only admins can get this
3
+ if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_paymentsettings")))
4
+ {
5
+ die("You do not have permissions to perform this action.");
6
+ }
7
+
8
+ global $wpdb, $pmpro_currency_symbol, $msg, $msgt;
9
+
10
+ //get/set settings
11
+ if(!empty($_REQUEST['savesettings']))
12
+ {
13
+ pmpro_setOption("sslseal");
14
+ pmpro_setOption("nuclear_HTTPS");
15
+
16
+ //gateway options
17
+ pmpro_setOption("gateway");
18
+ pmpro_setOption("gateway_environment");
19
+ pmpro_setOption("gateway_email");
20
+ pmpro_setOption("payflow_partner");
21
+ pmpro_setOption("payflow_vendor");
22
+ pmpro_setOption("payflow_user");
23
+ pmpro_setOption("payflow_pwd");
24
+ pmpro_setOption("apiusername");
25
+ pmpro_setOption("apipassword");
26
+ pmpro_setOption("apisignature");
27
+ pmpro_setOption("loginname");
28
+ pmpro_setOption("transactionkey");
29
+ pmpro_setOption("stripe_secretkey");
30
+ pmpro_setOption("stripe_publishablekey");
31
+ pmpro_setOption("braintree_merchantid");
32
+ pmpro_setOption("braintree_publickey");
33
+ pmpro_setOption("braintree_privatekey");
34
+ pmpro_setOption("braintree_encryptionkey");
35
+
36
+ //currency
37
+ $currency_paypal = $_POST['currency_paypal'];
38
+ $currency_stripe = $_POST['currency_stripe'];
39
+ $currency_fixed = $_POST['currency_fixed'];
40
+
41
+ if($_POST['gateway'] == "authorizenet" || $_POST['gateway'] == "payflowpro")
42
+ pmpro_setOption("currency", $currency_fixed);
43
+ elseif($_POST['gateway'] == "stripe")
44
+ pmpro_setOption("currency", $currency_stripe);
45
+ else
46
+ pmpro_setOption("currency", $currency_paypal);
47
+
48
+ //credit cards
49
+ $pmpro_accepted_credit_cards = array();
50
+ if(!empty($_REQUEST['creditcards_visa']))
51
+ $pmpro_accepted_credit_cards[] = "Visa";
52
+ if(!empty($_REQUEST['creditcards_mastercard']))
53
+ $pmpro_accepted_credit_cards[] = "Mastercard";
54
+ if(!empty($_REQUEST['creditcards_amex']))
55
+ $pmpro_accepted_credit_cards[] = "American Express";
56
+ if(!empty($_REQUEST['creditcards_discover']))
57
+ $pmpro_accepted_credit_cards[] = "Discover";
58
+ if(!empty($_REQUEST['creditcards_dinersclub']))
59
+ $pmpro_accepted_credit_cards[] = "Diners Club";
60
+ if(!empty($_REQUEST['creditcards_enroute']))
61
+ $pmpro_accepted_credit_cards[] = "EnRoute";
62
+ if(!empty($_REQUEST['creditcards_jcb']))
63
+ $pmpro_accepted_credit_cards[] = "JCB";
64
+
65
+ //check instructions
66
+ pmpro_setOption("instructions");
67
+
68
+ //use_ssl is based on gateway
69
+ if($_REQUEST['gateway'] == "paypal" || $_REQUEST['gateway'] == "authorizenet" || $_REQUEST['gateway'] == "payflowpro")
70
+ pmpro_setOption("use_ssl", 1);
71
+ else
72
+ pmpro_setOption("use_ssl");
73
+
74
+ //tax
75
+ pmpro_setOption("tax_state");
76
+ pmpro_setOption("tax_rate");
77
+
78
+ pmpro_setOption("accepted_credit_cards", implode(",", $pmpro_accepted_credit_cards));
79
+
80
+ //assume success
81
+ $msg = true;
82
+ $msgt = "Your payment settings have been updated.";
83
+ }
84
+
85
+ $sslseal = pmpro_getOption("sslseal");
86
+ $nuclear_HTTPS = pmpro_getOption("nuclear_HTTPS");
87
+
88
+ $gateway = pmpro_getOption("gateway");
89
+ $gateway_environment = pmpro_getOption("gateway_environment");
90
+ $gateway_email = pmpro_getOption("gateway_email");
91
+ $payflow_partner = pmpro_getOption("payflow_partner");
92
+ $payflow_vendor = pmpro_getOption("payflow_vendor");
93
+ $payflow_user = pmpro_getOption("payflow_user");
94
+ $payflow_pwd = pmpro_getOption("payflow_pwd");
95
+ $apiusername = pmpro_getOption("apiusername");
96
+ $apipassword = pmpro_getOption("apipassword");
97
+ $apisignature = pmpro_getOption("apisignature");
98
+ $loginname = pmpro_getOption("loginname");
99
+ $transactionkey = pmpro_getOption("transactionkey");
100
+ $stripe_secretkey = pmpro_getOption("stripe_secretkey");
101
+ $stripe_publishablekey = pmpro_getOption("stripe_publishablekey");
102
+ $braintree_merchantid = pmpro_getOption("braintree_merchantid");
103
+ $braintree_publickey = pmpro_getOption("braintree_publickey");
104
+ $braintree_privatekey = pmpro_getOption("braintree_privatekey");
105
+ $braintree_encryptionkey = pmpro_getOption("braintree_encryptionkey");
106
+
107
+ $currency = pmpro_getOption("currency");
108
+
109
+ $pmpro_accepted_credit_cards = pmpro_getOption("accepted_credit_cards");
110
+
111
+ $instructions = pmpro_getOption("instructions");
112
+
113
+ $tax_state = pmpro_getOption("tax_state");
114
+ $tax_rate = pmpro_getOption("tax_rate");
115
+
116
+ //make sure the tax rate is not > 1
117
+ if((double)$tax_rate > 1)
118
+ {
119
+ //assume the entered X%
120
+ $tax_rate = $tax_rate / 100;
121
+ pmpro_setOption("tax_rate", $tax_rate);
122
+ }
123
+
124
+ $use_ssl = pmpro_getOption("use_ssl");
125
+
126
+ //default settings
127
+ if(empty($gateway_environment))
128
+ {
129
+ $gateway_environment = "sandbox";
130
+ pmpro_setOption("gateway_environment", $gateway_environment);
131
+ }
132
+ if(empty($pmpro_accepted_credit_cards))
133
+ {
134
+ $pmpro_accepted_credit_cards = "Visa,Mastercard,American Express,Discover";
135
+ pmpro_setOption("accepted_credit_cards", $pmpro_accepted_credit_cards);
136
+ }
137
+
138
+ $pmpro_accepted_credit_cards = explode(",", $pmpro_accepted_credit_cards);
139
+
140
+ require_once(dirname(__FILE__) . "/admin_header.php");
141
+ ?>
142
+
143
+ <form action="" method="post" enctype="multipart/form-data">
144
+ <h2>Payment Gateway &amp; SSL Settings</h2>
145
+
146
+ <p>Learn more about <a title="Paid Memberships Pro - SSL Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/ssl/">SSL</a> or <a title="Paid Memberships Pro - Payment Gateway Settings" target="_blank" href="http://www.paidmembershipspro.com/support/initial-plugin-setup/payment-gateway/">Payment Gateway Settings</a>.</p>
147
+
148
+ <table class="form-table">
149
+ <tbody>
150
+ <tr>
151
+ <th scope="row" valign="top">
152
+ <label for="gateway">Payment Gateway:</label>
153
+ </th>
154
+ <td>
155
+ <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());">
156
+ <option value="">Testing Only</option>
157
+ <option value="check" <?php if($gateway == "check") { ?>selected="selected"<?php } ?>>Pay by Check</option>
158
+ <option value="stripe" <?php if($gateway == "stripe") { ?>selected="selected"<?php } ?>>Stripe</option>
159
+ <option value="paypalstandard" <?php if($gateway == "paypalstandard") { ?>selected="selected"<?php } ?>>PayPal Standard</option>
160
+ <option value="paypalexpress" <?php if($gateway == "paypalexpress") { ?>selected="selected"<?php } ?>>PayPal Express</option>
161
+ <option value="paypal" <?php if($gateway == "paypal") { ?>selected="selected"<?php } ?>>PayPal Website Payments Pro</option>
162
+ <option value="payflowpro" <?php if($gateway == "payflowpro") { ?>selected="selected"<?php } ?>>PayPal Payflow Pro</option>
163
+ <option value="authorizenet" <?php if($gateway == "authorizenet") { ?>selected="selected"<?php } ?>>Authorize.net</option>
164
+ <option value="braintree" <?php if($gateway == "braintree") { ?>selected="selected"<?php } ?>>Braintree Payments</option>
165
+ </select>
166
+ </td>
167
+ </tr>
168
+ <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
169
+ <td colspan="2">
170
+ <strong>Note:</strong> Payflow Pro currently only supports one-time payments. Users will not be able to checkout for levels with recurring payments.
171
+ </td>
172
+ </tr>
173
+ <tr>
174
+ <th scope="row" valign="top">
175
+ <label for="gateway_environment">Gateway Environment:</label>
176
+ </th>
177
+ <td>
178
+ <select name="gateway_environment">
179
+ <option value="sandbox" <?php if($gateway_environment == "sandbox") { ?>selected="selected"<?php } ?>>Sandbox/Testing</option>
180
+ <option value="live" <?php if($gateway_environment == "live") { ?>selected="selected"<?php } ?>>Live/Production</option>
181
+ </select>
182
+ <script>
183
+ function pmpro_changeGateway(gateway)
184
+ {
185
+ //hide all gateway options
186
+ jQuery('tr.gateway').hide();
187
+ jQuery('tr.gateway_'+gateway).show();
188
+ }
189
+ pmpro_changeGateway(jQuery('#gateway').val());
190
+ </script>
191
+ </td>
192
+ </tr>
193
+ <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
194
+ <th scope="row" valign="top">
195
+ <label for="payflow_partner">Partner:</label>
196
+ </th>
197
+ <td>
198
+ <input type="text" name="payflow_partner" size="60" value="<?php echo $payflow_partner?>" />
199
+ </td>
200
+ </tr>
201
+ <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
202
+ <th scope="row" valign="top">
203
+ <label for="payflow_vendor">Vendor:</label>
204
+ </th>
205
+ <td>
206
+ <input type="text" name="payflow_vendor" size="60" value="<?php echo $payflow_vendor?>" />
207
+ </td>
208
+ </tr>
209
+ <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
210
+ <th scope="row" valign="top">
211
+ <label for="payflow_user">User:</label>
212
+ </th>
213
+ <td>
214
+ <input type="text" name="payflow_user" size="60" value="<?php echo $payflow_user?>" />
215
+ </td>
216
+ </tr>
217
+ <tr class="gateway gateway_payflowpro" <?php if($gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
218
+ <th scope="row" valign="top">
219
+ <label for="payflow_pwd">Password:</label>
220
+ </th>
221
+ <td>
222
+ <input type="password" name="payflow_pwd" size="60" value="<?php echo $payflow_pwd?>" />
223
+ </td>
224
+ </tr>
225
+ <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
226
+ <th scope="row" valign="top">
227
+ <label for="gateway_email">Gateway Account Email:</label>
228
+ </th>
229
+ <td>
230
+ <input type="text" name="gateway_email" size="60" value="<?php echo $gateway_email?>" />
231
+ </td>
232
+ </tr>
233
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
234
+ <th scope="row" valign="top">
235
+ <label for="apiusername">API Username:</label>
236
+ </th>
237
+ <td>
238
+ <input type="text" name="apiusername" size="60" value="<?php echo $apiusername?>" />
239
+ </td>
240
+ </tr>
241
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
242
+ <th scope="row" valign="top">
243
+ <label for="apipassword">API Password:</label>
244
+ </th>
245
+ <td>
246
+ <input type="text" name="apipassword" size="60" value="<?php echo $apipassword?>" />
247
+ </td>
248
+ </tr>
249
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
250
+ <th scope="row" valign="top">
251
+ <label for="apisignature">API Signature:</label>
252
+ </th>
253
+ <td>
254
+ <input type="text" name="apisignature" size="60" value="<?php echo $apisignature?>" />
255
+ </td>
256
+ </tr>
257
+
258
+ <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
259
+ <th scope="row" valign="top">
260
+ <label for="loginname">Login Name:</label>
261
+ </th>
262
+ <td>
263
+ <input type="text" name="loginname" size="60" value="<?php echo $loginname?>" />
264
+ </td>
265
+ </tr>
266
+ <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
267
+ <th scope="row" valign="top">
268
+ <label for="transactionkey">Transaction Key:</label>
269
+ </th>
270
+ <td>
271
+ <input type="text" name="transactionkey" size="60" value="<?php echo $transactionkey?>" />
272
+ </td>
273
+ </tr>
274
+
275
+ <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
276
+ <th scope="row" valign="top">
277
+ <label for="stripe_secretkey">Secret Key:</label>
278
+ </th>
279
+ <td>
280
+ <input type="text" name="stripe_secretkey" size="60" value="<?php echo $stripe_secretkey?>" />
281
+ </td>
282
+ </tr>
283
+ <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
284
+ <th scope="row" valign="top">
285
+ <label for="stripe_publishablekey">Publishable Key:</label>
286
+ </th>
287
+ <td>
288
+ <input type="text" name="stripe_publishablekey" size="60" value="<?php echo $stripe_publishablekey?>" />
289
+ </td>
290
+ </tr>
291
+
292
+ <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
293
+ <th scope="row" valign="top">
294
+ <label for="braintree_merchantid">Merchant ID:</label>
295
+ </th>
296
+ <td>
297
+ <input type="text" name="braintree_merchantid" size="60" value="<?php echo $braintree_merchantid?>" />
298
+ </td>
299
+ </tr>
300
+ <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
301
+ <th scope="row" valign="top">
302
+ <label for="braintree_publickey">Public Key:</label>
303
+ </th>
304
+ <td>
305
+ <input type="text" name="braintree_publickey" size="60" value="<?php echo $braintree_publickey?>" />
306
+ </td>
307
+ </tr>
308
+ <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
309
+ <th scope="row" valign="top">
310
+ <label for="braintree_privatekey">Private Key:</label>
311
+ </th>
312
+ <td>
313
+ <input type="text" name="braintree_privatekey" size="60" value="<?php echo $braintree_privatekey?>" />
314
+ </td>
315
+ </tr>
316
+ <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
317
+ <th scope="row" valign="top">
318
+ <label for="braintree_encryptionkey">Client-Side Encryption Key:</label>
319
+ </th>
320
+ <td>
321
+ <textarea id="braintree_encryptionkey" name="braintree_encryptionkey" rows="3" cols="80"><?php echo esc_textarea($braintree_encryptionkey)?></textarea>
322
+ </td>
323
+ </tr>
324
+
325
+ <tr class="gateway gateway_authorizenet gateway_payflowpro" <?php if($gateway != "authorizenet" && $gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
326
+ <th scope="row" valign="top">
327
+ <label for="transactionkey">Currency:</label>
328
+ </th>
329
+ <td>
330
+ <input type="hidden" name="currency_fixed" size="60" value="USD" />
331
+ USD
332
+ </td>
333
+ </tr>
334
+
335
+ <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
336
+ <th scope="row" valign="top">
337
+ <label for="transactionkey">Currency:</label>
338
+ </th>
339
+ <td>
340
+ <select name="currency_stripe">
341
+ <?php
342
+ global $pmpro_stripe_currencies;
343
+ foreach($pmpro_stripe_currencies as $ccode => $cdescription)
344
+ {
345
+ ?>
346
+ <option value="<?php echo $ccode?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo $cdescription?></option>
347
+ <?php
348
+ }
349
+ ?>
350
+ </select>
351
+ </td>
352
+ </tr>
353
+
354
+ <tr class="gateway gateway_ gateway_paypal gateway_paypalexpress gateway_paypalstandard gateway_braintree" <?php if(!empty($gateway) && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard" && $gateway != "braintree") { ?>style="display: none;"<?php } ?>>
355
+ <th scope="row" valign="top">
356
+ <label for="transactionkey">Currency:</label>
357
+ </th>
358
+ <td>
359
+ <select name="currency_paypal">
360
+ <?php
361
+ global $pmpro_currencies;
362
+ foreach($pmpro_currencies as $ccode => $cdescription)
363
+ {
364
+ ?>
365
+ <option value="<?php echo $ccode?>" <?php if($currency == $ccode) { ?>selected="selected"<?php } ?>><?php echo $cdescription?></option>
366
+ <?php
367
+ }
368
+ ?>
369
+ </select>
370
+ </td>
371
+ </tr>
372
+
373
+ <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_payflowpro gateway_braintree" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "stripe" && $gateway != "payflowpro" && $gateway != "braintree") { ?>style="display: none;"<?php } ?>>
374
+ <th scope="row" valign="top">
375
+ <label for="creditcards">Accepted Credit Card Types</label>
376
+ </th>
377
+ <td>
378
+ <input type="checkbox" name="creditcards_visa" value="1" <?php if(in_array("Visa", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Visa<br />
379
+ <input type="checkbox" name="creditcards_mastercard" value="1" <?php if(in_array("Mastercard", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Mastercard<br />
380
+ <input type="checkbox" name="creditcards_amex" value="1" <?php if(in_array("American Express", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> American Express<br />
381
+ <input type="checkbox" name="creditcards_discover" value="1" <?php if(in_array("Discover", $pmpro_accepted_credit_cards)) { ?>checked="checked"<?php } ?> /> Discover<br />
382
+ <input type="checkbox" name="creditcards_dinersclub" value="1" <?php if(in_array("Diners Club", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> Diner's Club<br />
383
+ <input type="checkbox" name="creditcards_enroute" value="1" <?php if(in_array("EnRoute", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> EnRoute<br />
384
+ <input type="checkbox" name="creditcards_jcb" value="1" <?php if(in_array("JCB", $pmpro_accepted_credit_cards)) {?>checked="checked"<?php } ?> /> JCB<br />
385
+ </td>
386
+ </tr>
387
+ <tr class="gateway gateway_check" <?php if($gateway != "check") { ?>style="display: none;"<?php } ?>>
388
+ <th scope="row" valign="top">
389
+ <label for="instructions">Instructions</label>
390
+ </th>
391
+ <td>
392
+ <textarea id="instructions" name="instructions" rows="3" cols="80"><?php echo esc_textarea($instructions)?></textarea>
393
+ <p><small>Who to write the check out to. Where to mail it. Shown on checkout, confirmation, and invoice pages.</small></p>
394
+ </td>
395
+ </tr>
396
+ <tr class="gateway gateway_ gateway_stripe gateway_authorizenet gateway_paypal gateway_paypalexpress gateway_check gateway_paypalstandard gateway_payflowpro gateway_braintree" <?php if(!empty($gateway) && $gateway != "authorizenet" && $gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "payflowpro" && $gateway != "braintree") { ?>style="display: none;"<?php } ?>>
397
+ <th scope="row" valign="top">
398
+ <label for="tax">Sales Tax <small>(optional)</small></label>
399
+ </th>
400
+ <td>
401
+ Tax State:
402
+ <input type="text" name="tax_state" size="4" value="<?php echo $tax_state?>" /> <small>(abbreviation, e.g. "PA")</small>
403
+ &nbsp; Tax Rate:
404
+ <input type="text" name="tax_rate" size="10" value="<?php echo $tax_rate?>" /> <small>(decimal, e.g. "0.06")</small>
405
+ <p><small>If values are given, tax will be applied for any members ordering from the selected state. For more complex tax rules, use the "pmpro_tax" filter.</small></p>
406
+ </td>
407
+ </tr>
408
+ <tr class="gateway gateway_ gateway_stripe gateway_paypalexpress gateway_check gateway_paypalstandard gateway_braintree" <?php if(!empty($gateway) && $gateway != "stripe" && $gateway != "paypalexpress" && $gateway != "check" && $gateway != "paypalstandard" && $gateway != "braintree") { ?>style="display: none;"<?php } ?>>
409
+ <th scope="row" valign="top">
410
+ <label for="use_ssl">Use SSL:</label>
411
+ </th>
412
+ <td>
413
+ <select id="use_ssl" name="use_ssl">
414
+ <option value="0" <?php if(empty($use_ssl)) { ?>selected="selected"<?php } ?>>No</option>
415
+ <option value="1" <?php if(!empty($use_ssl)) { ?>selected="selected"<?php } ?>>Yes</option>
416
+ </select>
417
+ </td>
418
+ </tr>
419
+ <tr class="gateway gateway_paypal gateway_authorizenet gateway_payflowpro" <?php if($gateway != "paypal" && $gateway != "authorizenet" && $gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
420
+ <th scope="row" valign="top">
421
+ <label for="use_ssl">Use SSL:</label>
422
+ </th>
423
+ <td>
424
+ Yes. (Required by this Gateway Option)
425
+ </td>
426
+ </tr>
427
+ <tr>
428
+ <th scope="row" valign="top">
429
+ <label for="sslseal">SSL Seal Code:</label>
430
+ </th>
431
+ <td>
432
+ <textarea id="sslseal" name="sslseal" rows="3" cols="80"><?php echo stripslashes($sslseal)?></textarea>
433
+ </td>
434
+ </tr>
435
+ <tr>
436
+ <th scope="row" valign="top">
437
+ <label for="nuclear_HTTPS">HTTPS Nuclear Option:</label>
438
+ </th>
439
+ <td>
440
+ <input type="checkbox" id="nuclear_HTTPS" name="nuclear_HTTPS" value="1" <?php if(!empty($nuclear_HTTPS)) { ?>checked="checked"<?php } ?> /> Use the "Nuclear Option" to use secure (HTTPS) URLs on your secure pages. Check this if you are using SSL and have warnings on your checkout pages.
441
+ </td>
442
+ </tr>
443
+ <tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard gateway_payflowpro" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard" && $gateway != "payflowpro") { ?>style="display: none;"<?php } ?>>
444
+ <th scope="row" valign="top">
445
+ <label>IPN Handler URL:</label>
446
+ </th>
447
+ <td>
448
+ <p>To fully integrate with PayPal, be sure to set your IPN Handler URL to <pre><?php echo admin_url("admin-ajax.php") . "?action=ipnhandler";?></pre>.</p>
449
+ </td>
450
+ </tr>
451
+ <tr class="gateway gateway_authorizenet" <?php if($gateway != "authorizenet") { ?>style="display: none;"<?php } ?>>
452
+ <th scope="row" valign="top">
453
+ <label>Silent Post URL:</label>
454
+ </th>
455
+ <td>
456
+ <p>To fully integrate with Authorize.net, be sure to set your Silent Post URL to <pre><?php echo admin_url("admin-ajax.php") . "?action=authnet_silent_post";?></pre>.</p>
457
+ </td>
458
+ </tr>
459
+ <tr class="gateway gateway_stripe" <?php if($gateway != "stripe") { ?>style="display: none;"<?php } ?>>
460
+ <th scope="row" valign="top">
461
+ <label>Web Hook URL:</label>
462
+ </th>
463
+ <td>
464
+ <p>To fully integrate with Stripe, be sure to set your Web Hook URL to <pre><?php echo admin_url("admin-ajax.php") . "?action=stripe_webhook";?></pre>.</p>
465
+ </td>
466
+ </tr>
467
+ <tr class="gateway gateway_braintree" <?php if($gateway != "braintree") { ?>style="display: none;"<?php } ?>>
468
+ <th scope="row" valign="top">
469
+ <label>Web Hook URL:</label>
470
+ </th>
471
+ <td>
472
+ <p>To fully integrate with Braintree, be sure to set your Web Hook URL to <pre><?php echo admin_url("admin-ajax.php") . "?action=braintree_webhook";?></pre>.</p>
473
+ </td>
474
+ </tr>
475
+ </tbody>
476
+ </table>
477
+ <p class="submit">
478
+ <input name="savesettings" type="submit" class="button-primary" value="Save Settings" />
479
+ </p>
480
+ </form>
481
+
482
+ <?php
483
+ require_once(dirname(__FILE__) . "/admin_footer.php");
484
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports.php DELETED
@@ -1,62 +0,0 @@
1
- <?php
2
- global $pmpro_reports;
3
-
4
- require_once(dirname(__FILE__) . "/admin_header.php");
5
-
6
- //default view, report widgets
7
- if(empty($_REQUEST['report']))
8
- {
9
- //wrapper
10
- ?>
11
- <div id="dashboard-widgets-wrap">
12
- <div id="dashboard-widgets" class="metabox-holder pmpro_reports-holder columns-2">
13
- <div id="postbox-container-1" class="postbox-container">
14
- <div id="normal-sortables" class="meta-box-sortables ui-sortable">
15
- <?php
16
-
17
- //report widgets
18
- $count = 0;
19
- $nreports = count($pmpro_reports);
20
- $split = false;
21
- foreach($pmpro_reports as $report => $title)
22
- {
23
- //make sure title is translated (since these are set before translations happen)
24
- $title = __($title, "pmpro");
25
-
26
- //put half of the report widgets in postbox-container-2
27
- if(!$split && $count++ > $nreports/2)
28
- {
29
- $split = true;
30
- ?>
31
- </div></div><div id="postbox-container-2" class="postbox-container"><div id="side-sortables" class="meta-box-sortables ui-sortable">
32
- <?php
33
- }
34
- ?>
35
- <div id="pmpro_report_<?php echo $report; ?>" class="postbox pmpro_clickable" onclick="location.href='<?php echo admin_url("admin.php?page=pmpro-reports&report=" . $report);?>';">
36
- <h3 class="hndle"><span><?php echo $title; ?></span></h3>
37
- <div class="inside">
38
- <?php call_user_func("pmpro_report_" . $report . "_widget"); ?>
39
- <div style="margin-top:10px;border-top: 1px solid #ddd; padding-top: 10px; text-align:center;">
40
- <a class="button button-primary" href="<?php echo admin_url("admin.php?page=pmpro-reports&report=" . $report);?>"><?php _e('Details', 'pmpro');?></a>
41
- </div>
42
- </div>
43
- </div>
44
- <?php
45
- }
46
-
47
- //end wrapper
48
- ?>
49
- </div>
50
- </div>
51
- </div>
52
- <?php
53
- }
54
- else
55
- {
56
- //view a single report
57
- $report = $_REQUEST['report'];
58
- call_user_func("pmpro_report_" . $report . "_page");
59
- }
60
-
61
- require_once(dirname(__FILE__) . "/admin_footer.php");
62
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports/login.php DELETED
@@ -1,412 +0,0 @@
1
- <?php
2
- /*
3
- PMPro Report
4
- Title: Logins
5
- Slug: login
6
-
7
- For each report, add a line like:
8
- global $pmpro_reports;
9
- $pmpro_reports['slug'] = 'Title';
10
-
11
- For each report, also write two functions:
12
- * pmpro_report_{slug}_widget() to show up on the report homepage.
13
- * pmpro_report_{slug}_page() to show up when users click on the report page widget.
14
- */
15
- global $pmpro_reports;
16
- $pmpro_reports['login'] = __('Visits, Views, and Logins', 'pmpro');
17
-
18
- function pmpro_report_login_widget()
19
- {
20
- global $wpdb;
21
- $visits = get_option("pmpro_visits", array("today"=>0, "thisday"=>date("Y-m-d"), "alltime"=>0, "month"=>0, "thismonth"=>date("n")));
22
- $views = get_option("pmpro_views", array("today"=>0, "thisday"=>date("Y-m-d"), "alltime"=>0, "month"=>0, "thismonth"=>date("n")));
23
- $logins = get_option("pmpro_logins", array("today"=>0, "thisday"=>date("Y-m-d"), "alltime"=>0, "month"=>0, "thismonth"=>date("n")));
24
- ?>
25
- <div style="width: 33%; float: left;">
26
- <p><?php _e('Visits Today', 'pmpro')?>: <?php echo $visits['today'];?></p>
27
- <p><?php _e('Visits This Month', 'pmpro')?>: <?php echo $visits['month'];?></p>
28
- <p><?php _e('Visits All Time', 'pmpro')?>: <?php echo $visits['alltime'];?></p>
29
- </div>
30
- <div style="width: 33%; float: left;">
31
- <p><?php _e('Views Today', 'pmpro')?>: <?php echo $views['today'];?></p>
32
- <p><?php _e('Views This Month', 'pmpro')?>: <?php echo $views['month'];?></p>
33
- <p><?php _e('Views All Time', 'pmpro')?>: <?php echo $views['alltime'];?></p>
34
- </div>
35
- <div style="width: 33%; float: left;">
36
- <p><?php _e('Logins Today', 'pmpro')?>: <?php echo $logins['today'];?></p>
37
- <p><?php _e('Logins This Month', 'pmpro')?>: <?php echo $logins['month'];?></p>
38
- <p><?php _e('Logins All Time', 'pmpro')?>: <?php echo $logins['alltime'];?></p>
39
- </div>
40
- <div class="clear"></div>
41
- <?php
42
- }
43
-
44
- function pmpro_report_login_page()
45
- {
46
- global $wpdb;
47
-
48
- //vars
49
- if(!empty($_REQUEST['s']))
50
- $s = $_REQUEST['s'];
51
- else
52
- $s = "";
53
-
54
- if(!empty($_REQUEST['l']))
55
- $l = $_REQUEST['l'];
56
- else
57
- $l = "";
58
- ?>
59
- <form id="posts-filter" method="get" action="">
60
- <h2>
61
- <?php _e('Visits, Views, and Logins Report', 'pmpro');?>
62
- </h2>
63
- <ul class="subsubsub">
64
- <li>
65
- <?php _ex('Show', 'Dropdown label, e.g. Show All Users', 'pmpro')?> <select name="l" onchange="jQuery('#posts-filter').submit();">
66
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Users', 'pmpro')?></option>
67
- <option value="all" <?php if($l == "all") { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro')?></option>
68
- <?php
69
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
70
- foreach($levels as $level)
71
- {
72
- ?>
73
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
74
- <?php
75
- }
76
- ?>
77
- </select>
78
- </li>
79
- </ul>
80
- <p class="search-box">
81
- <label class="hidden" for="post-search-input"><?php _ex('Search', 'Search form label', 'pmpro')?> <?php if(empty($l)) echo "Users"; else echo "Members";?>:</label>
82
- <input type="hidden" name="page" value="pmpro-reports" />
83
- <input type="hidden" name="report" value="login" />
84
- <input id="post-search-input" type="text" value="<?php echo $s?>" name="s"/>
85
- <input class="button" type="submit" value="Search Members"/>
86
- </p>
87
- <?php
88
- //some vars for the search
89
- if(isset($_REQUEST['pn']))
90
- $pn = $_REQUEST['pn'];
91
- else
92
- $pn = 1;
93
-
94
- if(isset($_REQUEST['limit']))
95
- $limit = $_REQUEST['limit'];
96
- else
97
- $limit = 15;
98
-
99
- $end = $pn * $limit;
100
- $start = $end - $limit;
101
-
102
- if($s)
103
- {
104
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) 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(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) 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 '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
105
-
106
- if($l == "all")
107
- $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id > 0 ";
108
- elseif($l)
109
- $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
110
-
111
- $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
112
- }
113
- else
114
- {
115
- $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) 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(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) 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";
116
- $sqlQuery .= " WHERE 1=1 ";
117
-
118
- if($l == "all")
119
- $sqlQuery .= " AND mu.membership_id > 0 AND mu.status = 'active' ";
120
- elseif($l)
121
- $sqlQuery .= " AND mu.membership_id = '" . $l . "' ";
122
- $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit";
123
- }
124
-
125
- $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
126
-
127
- $theusers = $wpdb->get_results($sqlQuery);
128
- $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
129
-
130
- if($theusers)
131
- {
132
- ?>
133
- <p class="clear"><?php echo strval($totalrows)?> <?php if(empty($l)) echo "users"; else echo "members";?> found.
134
- <?php
135
- }
136
- ?>
137
- <table class="widefat">
138
- <thead>
139
- <tr class="thead">
140
- <th><?php _e('ID', 'pmpro')?></th>
141
- <th><?php _e('User', 'pmpro')?></th>
142
- <th><?php _e('Name', 'pmpro')?></th>
143
- <th><?php _e('Membership', 'pmpro')?></th>
144
- <th><?php _e('Joined', 'pmpro')?></th>
145
- <th><?php _e('Expires', 'pmpro')?></th>
146
- <th><?php _e('Last Visit', 'pmpro')?></th>
147
- <th><?php _e('Visits This Month', 'pmpro')?></th>
148
- <th><?php _e('Total Visits', 'pmpro')?></th>
149
- <th><?php _e('Views This Month', 'pmpro')?></th>
150
- <th><?php _e('Total Views', 'pmpro')?></th>
151
- <th><?php _e('Last Login', 'pmpro')?></th>
152
- <th><?php _e('Logins This Month', 'pmpro')?></th>
153
- <th><?php _e('Total Logins', 'pmpro')?></th>
154
- </tr>
155
- </thead>
156
- <tbody id="users" class="list:user user-list">
157
- <?php
158
- $count = 0;
159
- foreach($theusers as $auser)
160
- {
161
- //get meta
162
- $theuser = get_userdata($auser->ID);
163
- $visits = get_user_meta($auser->ID, "pmpro_visits", true);
164
- $views = get_user_meta($auser->ID, "pmpro_views", true);
165
- $logins = get_user_meta($auser->ID, "pmpro_logins", true);
166
- if(empty($logins))
167
- $logins = array("last"=>"N/A", "month"=>"N/A", "alltime"=>"N/A");
168
- ?>
169
- <tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
170
- <td><?php echo $theuser->ID?></td>
171
- <td>
172
- <?php echo get_avatar($theuser->ID, 32)?>
173
- <strong>
174
- <?php
175
- $userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
176
- $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
177
- echo $userlink;
178
- ?>
179
- </strong>
180
- </td>
181
- <td>
182
- <?php echo $theuser->display_name;?>
183
- </td>
184
- <td><?php echo $auser->membership?></td>
185
- <td><?php echo date("m/d/Y", strtotime($theuser->user_registered, current_time("timestamp")))?></td>
186
- <td>
187
- <?php
188
- if($auser->enddate)
189
- echo date(get_option('date_format'), $auser->enddate);
190
- else
191
- echo "Never";
192
- ?>
193
- </td>
194
- <td><?php if(!empty($visits['last'])) echo $visits['last'];?></td>
195
- <td><?php if(!empty($visits['month'])) echo $visits['month'];?></td>
196
- <td><?php if(!empty($visits['alltime'])) echo $visits['alltime'];?></td>
197
- <td><?php if(!empty($visits['month'])) echo $views['month'];?></td>
198
- <td><?php if(!empty($visits['alltime'])) echo $views['alltime'];?></td>
199
- <td><?php if(!empty($visits['last'])) echo $logins['last'];?></td>
200
- <td><?php if(!empty($visits['month'])) echo $logins['month'];?></td>
201
- <td><?php if(!empty($visits['alltime'])) echo $logins['alltime'];?></td>
202
- </tr>
203
- <?php
204
- }
205
-
206
- if(!$theusers)
207
- {
208
- ?>
209
- <tr>
210
- <td colspan="9"><p><?php _e('No members found.', 'pmpro')?> <?php if($l) { ?><a href="?page=pmpro-memberslist&s=<?php echo $s?>"><?php _e('Search all levels', 'pmpro')?></a>.<?php } ?></p></td>
211
- </tr>
212
- <?php
213
- }
214
- ?>
215
- </tbody>
216
- </table>
217
- </form>
218
-
219
- <?php
220
- echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, get_admin_url(NULL, "/admin.php?page=pmpro-reports&report=login&s=" . urlencode($s)), "&l=$l&limit=$limit&pn=");
221
- ?>
222
- <?php
223
- }
224
-
225
- /*
226
- Other code required for your reports. This file is loaded every time WP loads with PMPro enabled.
227
- */
228
-
229
- //track visits
230
- function pmpro_report_login_wp_visits()
231
- {
232
- //don't track admin
233
- if(is_admin())
234
- return;
235
-
236
- //only track logged in users
237
- if(!is_user_logged_in())
238
- return;
239
-
240
- //check for cookie
241
- if(!empty($_COOKIE['pmpro_visit']))
242
- return;
243
-
244
- //set cookie, then track
245
- setcookie("pmpro_visit", "1", NULL, COOKIEPATH, COOKIE_DOMAIN, false);
246
-
247
- global $current_user;
248
- //track for user
249
- if(!empty($current_user->ID))
250
- {
251
- $visits = $current_user->pmpro_visits;
252
- if(empty($visits))
253
- $visits = array("last"=>"N/A", "thisdate"=>NULL, "month"=>0, "thismonth"=>NULL, "alltime"=>0);
254
-
255
- //track logins for user
256
- $visits['last'] = date(get_option("date_format"));
257
- $visits['alltime']++;
258
- $thismonth = date("n");
259
- if($thismonth == $visits['thismonth'])
260
- $visits['month']++;
261
- else
262
- {
263
- $visits['month'] = 1;
264
- $visits['thismonth'] = $thismonth;
265
- }
266
-
267
- //update user data
268
- update_user_meta($current_user->ID, "pmpro_visits", $visits);
269
- }
270
-
271
- //track for all
272
- $visits = get_option("pmpro_visits");
273
- if(empty($visits))
274
- $visits = array("today"=>0, "thisdate"=>NULL, "month"=>0, "thismonth"=> NULL, "alltime"=>0);
275
-
276
- $visits['alltime']++;
277
- $thisdate = date("Y-d-m");
278
- if($thisdate == $visits['thisdate'])
279
- $visits['today']++;
280
- else
281
- {
282
- $visits['today'] = 1;
283
- $visits['thisdate'] = $thisdate;
284
- }
285
- if($thismonth == $visits['thismonth'])
286
- $visits['month']++;
287
- else
288
- {
289
- $visits['month'] = 1;
290
- $visits['thismonth'] = $thismonth;
291
- }
292
-
293
- update_option("pmpro_visits", $visits);
294
- }
295
- add_action("wp", "pmpro_report_login_wp_visits");
296
-
297
- //we want to clear the pmpro_visit cookie on login/logout
298
- function pmpro_report_login_clear_visit_cookie()
299
- {
300
- if(isset($_COOKIE['pmpro_visit']))
301
- unset($_COOKIE['pmpro_visit']);
302
- }
303
- add_action("wp_login", "pmpro_report_login_clear_visit_cookie");
304
- add_action("wp_logout", "pmpro_report_login_clear_visit_cookie");
305
-
306
- //track views
307
- function pmpro_report_login_wp_views()
308
- {
309
- //don't track admin
310
- if(is_admin())
311
- return;
312
-
313
- global $current_user;
314
- //track for user
315
- if(!empty($current_user->ID))
316
- {
317
- $views = $current_user->pmpro_views;
318
- if(empty($views))
319
- $views = array("last"=>"N/A", "month"=>0, "alltime"=>0);
320
-
321
- //track logins for user
322
- $views['last'] = date(get_option("date_format"));
323
- $views['alltime']++;
324
- $thismonth = date("n");
325
- if(isset($views['thismonth']) && $thismonth == $views['thismonth'])
326
- $views['month']++;
327
- else
328
- {
329
- $views['month'] = 1;
330
- $views['thismonth'] = $thismonth;
331
- }
332
-
333
- //update user data
334
- update_user_meta($current_user->ID, "pmpro_views", $views);
335
- }
336
-
337
- //track for all
338
- $views = get_option("pmpro_views");
339
- if(empty($views))
340
- $views = array("today"=>0, "thisdate"=> NULL, "month"=>0, "thismonth"=> NULL, "alltime"=>0);
341
-
342
- $views['alltime']++;
343
- $thisdate = date("Y-d-m");
344
- if($thisdate == $views['thisdate'])
345
- $views['today']++;
346
- else
347
- {
348
- $views['today'] = 1;
349
- $views['thisdate'] = $thisdate;
350
- }
351
- $thismonth = date("n");
352
- if(isset($views['thismonth']) && $thismonth == $views['thismonth'])
353
- $views['month']++;
354
- else
355
- {
356
- $views['month'] = 1;
357
- $views['thismonth'] = $thismonth;
358
- }
359
-
360
- update_option("pmpro_views", $views);
361
- }
362
- add_action("wp", "pmpro_report_login_wp_views");
363
-
364
- //track logins
365
- function pmpro_report_login_wp_login($user_login)
366
- {
367
- //get user data
368
- $user = get_user_by("login", $user_login);
369
- $logins = $user->pmpro_logins;
370
- if(empty($logins))
371
- $logins = array("last"=>"N/A", "thisdate"=>NULL, "month"=>0, "thismonth"=> NULL, "alltime"=>0);
372
-
373
- //track logins for user
374
- $logins['last'] = date(get_option("date_format"));
375
- $logins['alltime']++;
376
- $thismonth = date("n");
377
- if($thismonth == $logins['thismonth'])
378
- $logins['month']++;
379
- else
380
- {
381
- $logins['month'] = 1;
382
- $logins['thismonth'] = $thismonth;
383
- }
384
-
385
- //update user data
386
- update_user_meta($user->ID, "pmpro_logins", $logins);
387
-
388
- //track logins overall
389
- $logins = get_option("pmpro_logins");
390
- if(empty($logins))
391
- $logins = array("today"=>0, "thisdate"=>NULL, "month"=>0, "thismonth"=>NULL, "alltime"=>0);
392
-
393
- $logins['alltime']++;
394
- $thisdate = date("Y-d-m");
395
- if($thisdate == $logins['thisdate'])
396
- $logins['today']++;
397
- else
398
- {
399
- $logins['today'] = 1;
400
- $logins['thisdate'] = $thisdate;
401
- }
402
- if($thismonth == $logins['thismonth'])
403
- $logins['month']++;
404
- else
405
- {
406
- $logins['month'] = 1;
407
- $logins['thismonth'] = $thismonth;
408
- }
409
-
410
- update_option("pmpro_logins", $logins);
411
- }
412
- add_action("wp_login", "pmpro_report_login_wp_login");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports/memberships.php DELETED
@@ -1,651 +0,0 @@
1
- <?php
2
- /*
3
- PMPro Report
4
- Title: Membership Stats
5
- Slug: memberships
6
-
7
- For each report, add a line like:
8
- global $pmpro_reports;
9
- $pmpro_reports['slug'] = 'Title';
10
-
11
- For each report, also write two functions:
12
- * pmpro_report_{slug}_widget() to show up on the report homepage.
13
- * pmpro_report_{slug}_page() to show up when users click on the report page widget.
14
- */
15
-
16
- global $pmpro_reports;
17
-
18
- $pmpro_reports['memberships'] = __('Membership Stats', 'pmpro');
19
-
20
- //queue Google Visualization JS on report page
21
- function pmpro_report_memberships_init() {
22
- if(is_admin() && isset($_REQUEST['report']) && $_REQUEST['report'] == "memberships" && isset($_REQUEST['page']) && $_REQUEST['page'] == "pmpro-reports")
23
- wp_enqueue_script("jsapi", "https://www.google.com/jsapi");
24
- }
25
- add_action( 'init', 'pmpro_report_memberships_init' );
26
-
27
-
28
- //widget
29
- function pmpro_report_memberships_widget() {
30
- global $wpdb, $pmpro_currency_symbol;
31
- ?>
32
- <style type="text/css">
33
- #pmpro_report_memberships .section-label {
34
- margin: 15px 0;
35
- font-size: 18px;
36
- text-align: left;
37
- display: block;
38
- }
39
-
40
- #pmpro_report_memberships .section-label:first-child {
41
- margin-top: 0;
42
- }
43
-
44
- #pmpro_report_memberships div {text-align: center;}
45
- #pmpro_report_memberships em {display: block; font-style: normal; font-size: 2em; margin: 5px; line-height: 26px;}
46
- </style>
47
- <span id="pmpro_report_memberships">
48
- <label class="section-label"><?php _e('Signups', 'pmpro');?>:</label>
49
- <div style="width: 25%; float: left;">
50
- <label><?php _e('All Time', 'pmpro');?></label>
51
- <em><?php echo pmpro_getSignups( 'all time' ); ?></em>
52
- </div>
53
- <div style="width: 25%; float: left;">
54
- <label><?php _e('This Year', 'pmpro');?></label>
55
- <em><?php echo pmpro_getSignups( 'this year' ); ?></em>
56
- </div>
57
- <div style="width: 25%; float: left;">
58
- <label><?php _e('This Month', 'pmpro');?></label>
59
- <em><?php echo pmpro_getSignups( 'this month' ); ?></em>
60
- </div>
61
- <div style="width: 25%; float: left;">
62
- <label><?php _e('Today', 'pmpro');?></label>
63
- <em><?php echo pmpro_getSignups( 'today' ); ?></em>
64
- </div>
65
- <div class="clear"></div>
66
-
67
- <label class="section-label"><?php _e('Cancellations', 'pmpro');?>:</label>
68
- <div style="width: 25%; float: left;">
69
- <label><?php _e('All Time', 'pmpro');?></label>
70
- <em><?php echo pmpro_getCancellations( 'all time' ); ?></em>
71
- </div>
72
- <div style="width: 25%; float: left;">
73
- <label><?php _e('This Year', 'pmpro');?></label>
74
- <em><?php echo pmpro_getCancellations( 'this year' ); ?></em>
75
- </div>
76
- <div style="width: 25%; float: left;">
77
- <label><?php _e('This Month', 'pmpro');?></label>
78
- <em><?php echo pmpro_getCancellations( 'this month' ); ?></em>
79
- </div>
80
- <div style="width: 25%; float: left;">
81
- <label><?php _e('Today', 'pmpro');?></label>
82
- <em><?php echo pmpro_getCancellations( 'today' ); ?></em>
83
- </div>
84
- <div class="clear"></div>
85
-
86
- <label class="section-label"><?php _e('Other Stats', 'pmpro');?>:</label>
87
- <div style="width: 33%; float: left;">
88
- <label><?php _e('Monthly Recurring Revenue (MRR)', 'pmpro');?></label>
89
- <em><?php echo $pmpro_currency_symbol . $pmpro_mrr = number_format(pmpro_getMRR( 'all time' ), 2); ?></em>
90
- </div>
91
- <div style="width: 33%; float: left;">
92
- <label><?php _e('Cancellation Rate', 'pmpro');?></label>
93
- <em><?php echo pmpro_getCancellationRate('all time' ); ?>%</em>
94
- </div>
95
- <div style="width: 33%; float: left;">
96
- <label><?php _e('Lifetime Value (LTV)', 'pmpro');?></label>
97
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getLTV('all time' ), 2); ?></em>
98
- </div>
99
- <div class="clear"></div>
100
- </span>
101
- <?php
102
- }
103
-
104
- function pmpro_report_memberships_page()
105
- {
106
- global $wpdb, $pmpro_currency_symbol;
107
-
108
- //get values from form
109
- if(isset($_REQUEST['type']))
110
- $type = sanitize_text_field($_REQUEST['type']);
111
- else
112
- $type = "signup_v_cancel";
113
-
114
- if(isset($_REQUEST['period']))
115
- $period = sanitize_text_field($_REQUEST['period']);
116
- else
117
- $period = "monthly";
118
-
119
- if(isset($_REQUEST['month']))
120
- $month = intval($_REQUEST['month']);
121
- else
122
- $month = date("n");
123
-
124
- $thisyear = date("Y");
125
- if(isset($_REQUEST['year']))
126
- $year = intval($_REQUEST['year']);
127
- else
128
- $year = date("Y");
129
-
130
- if(isset($_REQUEST['level']))
131
- $l = intval($_REQUEST['level']);
132
- else
133
- $l = "";
134
-
135
- //calculate start date and how to group dates returned from DB
136
- if($period == "daily")
137
- {
138
- $startdate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-01';
139
- $enddate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-31';
140
- $date_function = 'DAY';
141
- }
142
- elseif($period == "monthly")
143
- {
144
- $startdate = $year . '-01-01';
145
- $enddate = strval(intval($year)+1) . '-01-01';
146
- $date_function = 'MONTH';
147
- }
148
- elseif($period == "annual")
149
- {
150
- $startdate = '1960-01-01'; //all time
151
- $date_function = 'YEAR';
152
- }
153
-
154
- //testing or live data
155
- $gateway_environment = pmpro_getOption("gateway_environment");
156
-
157
- //get data
158
- if ( $type === "signup_v_cancel" ) {
159
- $sqlQuery = "SELECT $date_function(startdate) as date, COUNT(DISTINCT user_id) as signups
160
- FROM $wpdb->pmpro_memberships_users WHERE startdate >= '" . $startdate . "' ";
161
-
162
- if(!empty($enddate))
163
- $sqlQuery .= "AND startdate < '" . $enddate . "' ";
164
- }
165
- if ( $type === "mrr_ltv" ) {
166
- // Get total revenue, number of months in system, and date
167
- if ( $period == 'annual' )
168
- $sqlQuery = "SELECT SUM(total) as total, COUNT(DISTINCT MONTH(timestamp)) as months, $date_function(timestamp) as date
169
- FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token')
170
- AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
171
-
172
- if ( $period == 'monthly' )
173
- $sqlQuery = "SELECT SUM(total) as total, $date_function(timestamp) as date
174
- FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token')
175
- AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
176
-
177
- if(!empty($enddate))
178
- $sqlQuery .= "AND timestamp < '" . $enddate . "' ";
179
- }
180
-
181
- if(!empty($l))
182
- $sqlQuery .= "AND membership_id IN(" . $l . ") ";
183
-
184
- $sqlQuery .= " GROUP BY date ORDER BY date ";
185
-
186
- $dates = $wpdb->get_results($sqlQuery);
187
-
188
- //fill in blanks in dates
189
- $cols = array();
190
- if($period == "daily")
191
- {
192
- $lastday = date("t", $startdate);
193
-
194
- for($i = 1; $i <= $lastday; $i++)
195
- {
196
- // Signups vs. Cancellations
197
- if ( $type === "signup_v_cancel" ) {
198
- $cols[$i] = new stdClass();
199
- $cols[$i]->signups = 0;
200
- foreach($dates as $date)
201
- {
202
- if( $date->date == $i ) {
203
- $cols[$i]->signups = $date->signups;
204
- }
205
- }
206
- }
207
- }
208
- }
209
- elseif($period == "monthly")
210
- {
211
- for($i = 1; $i < 13; $i++)
212
- {
213
- // Signups vs. Cancellations
214
- if ( $type === "signup_v_cancel" ) {
215
- $cols[$i] = new stdClass();
216
- $cols[$i]->date = $i;
217
- $cols[$i]->signups = 0;
218
- foreach($dates as $date)
219
- {
220
- if( $date->date == $i ) {
221
- $cols[$i]->date = $date->date;
222
- $cols[$i]->signups = $date->signups;
223
- }
224
- }
225
- }
226
-
227
- // MRR & LTV
228
- if ( $type === "mrr_ltv" ) {
229
- $cols[$i] = new stdClass();
230
- $cols[$i]->date = $i;
231
- $cols[$i]->months = 1;
232
- foreach($dates as $date)
233
- {
234
- if( $date->date == $i ) {
235
- $cols[$i]->total = $date->total;
236
- }
237
- }
238
- }
239
- }
240
- }
241
- elseif($period == "annual") //annual
242
- {
243
- }
244
-
245
- $dates = ( ! empty( $cols ) ) ? $cols : $dates;
246
-
247
- // Signups vs. cancellations
248
- if ( $type === "signup_v_cancel" )
249
- {
250
- $sqlQuery = "SELECT $date_function(mu1.modified) as date, COUNT(DISTINCT mu1.user_id) as cancellations
251
- FROM $wpdb->pmpro_memberships_users mu1
252
- LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON mu1.user_id = mu2.user_id AND
253
- mu2.modified > mu1.enddate AND
254
- DATE_ADD(mu1.modified, INTERVAL 1 DAY) > mu2.startdate
255
- WHERE mu1.status = 'inactive'
256
- AND mu2.id IS NULL
257
- AND mu1.startdate >= '" . $startdate . "'
258
- AND mu1.startdate < '" . $enddate . "' ";
259
-
260
- //restrict by level
261
- if(!empty($l))
262
- $sqlQuery .= "AND membership_id IN(" . $l . ") ";
263
-
264
- $sqlQuery .= " GROUP BY date ORDER BY date ";
265
-
266
- $cdates = $wpdb->get_results($sqlQuery, OBJECT_K);
267
-
268
- foreach( $dates as &$date )
269
- {
270
- if(!empty($cdates[$date->date]))
271
- $date->cancellations = $cdates[$date->date]->cancellations;
272
- else
273
- $date->cancellations = 0;
274
- }
275
- }
276
-
277
- // MRR & LTV
278
- if ( $type === "mrr_ltv" && count( $dates ) === 1 ) {
279
- $dummy_date = new stdClass();
280
- $dummy_date->total = 0;
281
- $dummy_date->months = 0;
282
- $dummy_date->date = $dates[0]->date - 1;
283
- array_unshift( $dates, $dummy_date ); // Add to beginning
284
- }
285
- ?>
286
- <form id="posts-filter" method="get" action="">
287
- <h2>
288
- <?php _e('Membership Stats', 'pmpro');?>
289
- </h2>
290
- <ul class="subsubsub">
291
- <li>
292
- <?php _ex('Show', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?>
293
- <select id="period" name="period">
294
- <option value="daily" <?php selected($period, "daily");?>><?php _e('Daily', 'pmpro');?></option>
295
- <option value="monthly" <?php selected($period, "monthly");?>><?php _e('Monthly', 'pmpro');?></option>
296
- <option value="annual" <?php selected($period, "annual");?>><?php _e('Annual', 'pmpro');?></option>
297
- </select>
298
- <select id="type" name="type">
299
- <option value="signup_v_cancel" <?php selected($type, "signup_v_cancel");?>><?php _e('Signups vs. Cancellations', 'pmpro');?></option>
300
- <?php /*
301
- <option value="mrr_ltv" <?php selected($type, "mrr_ltv");?>><?php _e('MRR & LTV', 'pmpro');?></option>
302
- */ ?>
303
- </select>
304
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
305
- <select id="month" name="month">
306
- <?php for($i = 1; $i < 13; $i++) { ?>
307
- <option value="<?php echo $i;?>" <?php selected($month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
308
- <?php } ?>
309
- </select>
310
- <select id="year" name="year">
311
- <?php for($i = $thisyear; $i > 2007; $i--) { ?>
312
- <option value="<?php echo $i;?>" <?php selected($year, $i);?>><?php echo $i;?></option>
313
- <?php } ?>
314
- </select>
315
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
316
- <select name="level">
317
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro');?></option>
318
- <?php
319
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
320
- foreach($levels as $level)
321
- {
322
- ?>
323
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
324
- <?php
325
- }
326
- ?>
327
- </select>
328
-
329
- <input type="hidden" name="page" value="pmpro-reports" />
330
- <input type="hidden" name="report" value="memberships" />
331
- <input type="submit" value="<?php _ex('Generate Report', 'Submit button value.', 'pmpro');?>" />
332
- </li>
333
- </ul>
334
-
335
- <div id="chart_div" style="clear: both; width: 100%; height: 500px;"></div>
336
-
337
- <script>
338
- //update month/year when period dropdown is changed
339
- jQuery(document).ready(function() {
340
- jQuery('#period').change(function() {
341
- pmpro_ShowMonthOrYear();
342
- });
343
- });
344
-
345
- function pmpro_ShowMonthOrYear()
346
- {
347
- var period = jQuery('#period').val();
348
- if(period == 'daily')
349
- {
350
- jQuery('#for').show();
351
- jQuery('#month').show();
352
- jQuery('#year').show();
353
- }
354
- else if(period == 'monthly')
355
- {
356
- jQuery('#for').show();
357
- jQuery('#month').hide();
358
- jQuery('#year').show();
359
- }
360
- else
361
- {
362
- jQuery('#for').hide();
363
- jQuery('#month').hide();
364
- jQuery('#year').hide();
365
- }
366
- }
367
-
368
- pmpro_ShowMonthOrYear();
369
-
370
- //draw the chart
371
- google.load("visualization", "1", {packages:["corechart"]});
372
- google.setOnLoadCallback(drawChart);
373
- function drawChart() {
374
-
375
- var data = google.visualization.arrayToDataTable([
376
- <?php if ( $type === "signup_v_cancel" ) : // Signups vs. cancellations ?>
377
- ['<?php echo $date_function;?>', 'Signups', 'Cancellations'],
378
- <?php foreach($dates as $key => $value) { ?>
379
- ['<?php if($period == "monthly") echo date("M", mktime(0,0,0,$value->date)); else if($period == "daily") echo $key; else echo $value->date;?>', <?php echo $value->signups; ?>, <?php echo $value->cancellations; ?>],
380
- <?php } ?>
381
- <?php endif; ?>
382
-
383
- <?php if ( $type === "mrr_ltv" ) : // Signups vs. cancellations ?>
384
- ['<?php echo $date_function;?>', 'MRR', 'LTV'],
385
- <?php foreach($dates as $key => $value) { ?>
386
- ['<?php if($period == "monthly") echo date("M", mktime(0,0,0,$value->date)); else if($period == "daily") echo $key; else echo $value->date;?>', <?php echo (($mrr = $value->total / $value->months) && $mrr != 0) ? $mrr : 0; ?>, <?php echo pmpro_getLTV($period, NULL, $mrr ); ?>],
387
- <?php } ?>
388
- <?php endif; ?>
389
- ]);
390
-
391
- var options = {
392
- colors: ['#0099c6', '#dc3912'],
393
- hAxis: {title: '<?php echo $date_function;?>', titleTextStyle: {color: 'black'}, maxAlternation: 1},
394
- vAxis: {color: 'green', titleTextStyle: {color: '#51a351'}},
395
- };
396
-
397
- <?php if ( $type === "signup_v_cancel" ) : // Signups vs. cancellations ?>
398
- var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
399
- <?php elseif ( $type === "mrr_ltv" ) : // MRR & LTV ?>
400
- var formatter = new google.visualization.NumberFormat({prefix: '<?php echo html_entity_decode($pmpro_currency_symbol);?>'});
401
- formatter.format(data, 2);
402
- var formatter = new google.visualization.NumberFormat({prefix: '<?php echo html_entity_decode($pmpro_currency_symbol);?>'});
403
- formatter.format(data, 1);
404
-
405
- var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
406
- <?php endif; ?>
407
- chart.draw(data, options);
408
- }
409
- </script>
410
-
411
- </form>
412
- <?php
413
- }
414
-
415
-
416
-
417
- /*
418
- Other code required for your reports. This file is loaded every time WP loads with PMPro enabled.
419
- */
420
-
421
- //get signups
422
- function pmpro_getSignups($period = false, $levels = 'all')
423
- {
424
- //check for a transient
425
- $cache = get_transient( 'pmpro_report_memberships_signups' );
426
- if( ! empty( $cache ) && ! empty( $cache[$period] ) && ! empty( $cache[$period][$levels] ) )
427
- return $cache[$period][$levels];
428
-
429
- //a sale is an order with status = success
430
- if( $period == 'today' )
431
- $startdate = date(' Y-m-d' );
432
- elseif( $period == 'this month')
433
- $startdate = date( 'Y-m' ) . '-01';
434
- elseif( $period == 'this year')
435
- $startdate = date( 'Y' ) . '-01-01';
436
- else
437
- $startdate = '';
438
-
439
-
440
- //build query
441
- global $wpdb;
442
-
443
- $sqlQuery = "SELECT COUNT(DISTINCT user_id) FROM $wpdb->pmpro_memberships_users WHERE startdate >= '" . $startdate . "' ";
444
-
445
- //restrict by level
446
- if(!empty($levels) && $levels != 'all')
447
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
448
-
449
- $signups = $wpdb->get_var($sqlQuery);
450
-
451
- //save in cache
452
- if(!empty($cache) && !empty($cache[$period]))
453
- $cache[$period][$levels] = $signups;
454
- elseif(!empty($cache))
455
- $cache[$period] = array($levels => $signups);
456
- else
457
- $cache = array($period => array($levels => $signups));
458
-
459
- set_transient("pmpro_report_memberships_signups", $cache, 3600*24);
460
-
461
- return $signups;
462
- }
463
-
464
- //get cancellations
465
- function pmpro_getCancellations($period = false, $levels = 'all')
466
- {
467
- //check for a transient
468
- $cache = get_transient( 'pmpro_report_memberships_cancellations' );
469
- if( ! empty( $cache ) && ! empty( $cache[$period] ) && ! empty( $cache[$period][$levels] ) )
470
- return $cache[$period][$levels];
471
-
472
- //figure out start date
473
- if( $period == 'today' )
474
- $startdate = date(' Y-m-d' );
475
- elseif( $period == 'this month')
476
- $startdate = date( 'Y-m' ) . '-01';
477
- elseif( $period == 'this year')
478
- $startdate = date( 'Y' ) . '-01-01';
479
- else
480
- $startdate = '';
481
-
482
- $startdate_plus_one = strtotime( $startdate . + ' + 1 day', current_time("timestamp") );
483
-
484
- /*
485
- build query.
486
- cancellations are marked in the memberships users table with status = 'inactive'
487
- we try to ignore cancellations when the user gets a new level with 24 hours (probably an upgrade or downgrade)
488
- */
489
- global $wpdb;
490
-
491
- //$sqlQuery = "SELECT mu1.user_id, mu2.user_id FROM $wpdb->pmpro_memberships_users mu1 LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON mu1.user_id = mu2.user_id AND mu2.status = 'inactive' AND mu2.startdate > mu1.startdate";
492
- $sqlQuery = "SELECT COUNT(mu1.id)
493
- FROM $wpdb->pmpro_memberships_users mu1
494
- LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON mu1.user_id = mu2.user_id AND
495
- mu2.modified > mu1.enddate AND
496
- DATE_ADD(mu1.modified, INTERVAL 1 DAY) > mu2.startdate
497
- WHERE mu1.status = 'inactive'
498
- AND mu2.id IS NULL
499
- AND mu1.startdate >= '" . $startdate . "' ";
500
-
501
- //restrict by level
502
- if(!empty($levels) && $levels != 'all')
503
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
504
-
505
- $cancellations = $wpdb->get_var($sqlQuery);
506
-
507
- //save in cache
508
- if(!empty($cache) && !empty($cache[$period]) && is_array($cache[$period]))
509
- $cache[$period][$levels] = $cancellations;
510
- elseif(!empty($cache))
511
- $cache[$period] = array($levels => $cancellations);
512
- else
513
- $cache = array($period => array($levels => $cancellations));
514
-
515
- set_transient("pmpro_report_memberships_cancellations", $cache, 3600*24);
516
-
517
- return $cancellations;
518
- }
519
-
520
- //get MRR
521
- function pmpro_getMRR($period, $levels = 'all')
522
- {
523
- //check for a transient
524
- //$cache = get_transient("pmpro_report_mrr");
525
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
526
- return $cache[$period][$levels];
527
-
528
- //a sale is an order with status NOT IN refunded, review, token, error
529
- if($period == "this month")
530
- $startdate = date("Y-m") . "-01";
531
- elseif($period == "this year")
532
- $startdate = date("Y") . "-01-01";
533
- else
534
- $startdate = "";
535
-
536
- $gateway_environment = pmpro_getOption("gateway_environment");
537
-
538
- //build query
539
- global $wpdb;
540
- // Get total revenue
541
- $sqlQuery = "SELECT SUM(total) FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token', 'error') AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
542
-
543
- //restrict by level
544
- if(!empty($levels) && $levels != 'all') {
545
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
546
- }
547
-
548
- $revenue = $wpdb->get_var($sqlQuery);
549
-
550
- //when was the first order
551
- $first_order_timestamp = $wpdb->get_var("SELECT UNIX_TIMESTAMP(`timestamp`) FROM $wpdb->pmpro_membership_orders WHERE `timestamp` IS NOT NULL AND `timestamp` > '0000-00-00 00:00:00' ORDER BY `timestamp` LIMIT 1");
552
-
553
- //if we don't have a timestamp, we can't do this
554
- if(empty($first_order_timestamp))
555
- return false;
556
-
557
- //how many months ago was the first order
558
- $months = $wpdb->get_var("SELECT PERIOD_DIFF('" . date("Ym") . "', '" . date("Ym", $first_order_timestamp) . "')");
559
-
560
- /* this works in PHP 5.3+ without using MySQL to get the diff
561
- $date1 = new DateTime(date("Y-m-d", $first_order_timestamp));
562
- $date2 = new DateTime(date("Y-m-d"));
563
- $interval = $date1->diff($date2);
564
- $years = intval($interval->format('%y'));
565
- $months = $years*12 + intval($interval->format('%m'));
566
- */
567
-
568
- if($months > 0)
569
- $mrr = $revenue / $months;
570
- else
571
- $mrr = 0;
572
-
573
- //save in cache
574
- if(!empty($cache) && !empty($cache[$period]))
575
- $cache[$period][$levels] = $mrr;
576
- elseif(!empty($cache))
577
- $cache[$period] = array($levels => $mrr);
578
- else
579
- $cache = array($period => array($levels => $mrr));
580
-
581
- set_transient("pmpro_report_mrr", $cache, 3600*24);
582
-
583
- return $mrr;
584
- }
585
-
586
- //get Cancellation Rate
587
- function pmpro_getCancellationRate($period, $levels = 'all')
588
- {
589
- //check for a transient
590
- $cache = get_transient("pmpro_report_cancellation_rate");
591
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
592
- return $cache[$period][$levels];
593
-
594
- $signups = pmpro_getSignups($period, $levels);
595
- $cancellations = pmpro_getCancellations($period, $levels);
596
-
597
- if(empty($signups))
598
- return false;
599
-
600
- $rate = number_format(($cancellations / $signups)*100, 2);
601
-
602
- //save in cache
603
- if(!empty($cache) && !empty($cache[$period]))
604
- $cache[$period][$levels] = $rate;
605
- elseif(!empty($cache))
606
- $cache[$period] = array($levels => $rate);
607
- else
608
- $cache = array($period => array($levels => $rate));
609
-
610
- set_transient("pmpro_report_cancellation_rate", $cache, 3600*24);
611
-
612
- return $rate;
613
- }
614
-
615
- //get LTV
616
- function pmpro_getLTV($period, $levels = 'all', $mrr = NULL, $signups = NULL, $cancellation_rate = NULL)
617
- {
618
- if(empty($mrr))
619
- $mrr = pmpro_getMRR($period, $levels);
620
- if(empty($signups))
621
- $signups = pmpro_getSignups($period, $levels);
622
- if(empty($cancellation_rate))
623
- $cancellation_rate = pmpro_getCancellationRate($period, $levels);
624
-
625
- //average monthly spend
626
- if(empty($signups))
627
- return false;
628
-
629
- if($signups > 0)
630
- $ams = $mrr / $signups;
631
- else
632
- $ams = 0;
633
-
634
- if($cancellation_rate > 0)
635
- $ltv = $ams * (1/$cancellation_rate);
636
- else
637
- $ltv = $ams;
638
-
639
- return $ltv;
640
- }
641
-
642
- //delete transients when an order goes through
643
- function pmpro_report_memberships_delete_transients()
644
- {
645
- delete_transient("pmpro_report_mrr");
646
- delete_transient("pmpro_report_cancellation_rate");
647
- delete_transient("pmpro_report_memberships_cancellations");
648
- delete_transient("pmpro_report_memberships_signups");
649
- }
650
- add_action("pmpro_after_checkout", "pmpro_report_memberships_delete_transients");
651
- add_action("pmpro_updated_order", "pmpro_report_memberships_delete_transients");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
adminpages/reports/sales.php DELETED
@@ -1,397 +0,0 @@
1
- <?php
2
- /*
3
- PMPro Report
4
- Title: Sales
5
- Slug: sales
6
-
7
- For each report, add a line like:
8
- global $pmpro_reports;
9
- $pmpro_reports['slug'] = 'Title';
10
-
11
- For each report, also write two functions:
12
- * pmpro_report_{slug}_widget() to show up on the report homepage.
13
- * pmpro_report_{slug}_page() to show up when users click on the report page widget.
14
- */
15
- global $pmpro_reports;
16
- $gateway_environment = pmpro_getOption("gateway_environment");
17
- if($gateway_environment == "sandbox")
18
- $pmpro_reports['sales'] = __('Sales and Revenue (Testing/Sandbox)', 'pmpro');
19
- else
20
- $pmpro_reports['sales'] = __('Sales and Revenue', 'pmpro');
21
-
22
- //queue Google Visualization JS on report page
23
- function pmpro_report_sales_init()
24
- {
25
- if(is_admin() && isset($_REQUEST['report']) && $_REQUEST['report'] == "sales" && isset($_REQUEST['page']) && $_REQUEST['page'] == "pmpro-reports")
26
- {
27
- wp_enqueue_script("jsapi", "https://www.google.com/jsapi");
28
- }
29
- }
30
- add_action("init", "pmpro_report_sales_init");
31
-
32
- //widget
33
- function pmpro_report_sales_widget()
34
- {
35
- global $wpdb, $pmpro_currency_symbol;
36
- ?>
37
- <style>
38
- #pmpro_report_sales div {text-align: center;}
39
- #pmpro_report_sales em {display: block; font-style: normal; font-size: 2em; margin: 5px;}
40
- </style>
41
- <span id="#pmpro_report_sales">
42
- <div style="width: 25%; float: left;">
43
- <em><?php echo pmpro_getSales("all time");?></em>
44
- <label>All Time</label>
45
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("all time"), 2);?></em>
46
- </div>
47
- <div style="width: 25%; float: left;">
48
- <em><?php echo pmpro_getSales("this year");?></em>
49
- <label>This Year</label>
50
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("this year"), 2);?></em>
51
- </div>
52
- <div style="width: 25%; float: left;">
53
- <em><?php echo pmpro_getSales("this month");?></em>
54
- <label>This Month</label>
55
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("this month"), 2);?></em>
56
- </div>
57
- <div style="width: 25%; float: left;">
58
- <em><?php echo pmpro_getSales("today");?></em>
59
- <label>Today</label>
60
- <em><?php echo $pmpro_currency_symbol . number_format(pmpro_getRevenue("today"), 2);?></em>
61
- </div>
62
- <div class="clear"></div>
63
- </span>
64
- <?php
65
- }
66
-
67
- function pmpro_report_sales_page()
68
- {
69
- global $wpdb, $pmpro_currency_symbol;
70
-
71
- //get values from form
72
- if(isset($_REQUEST['type']))
73
- $type = sanitize_text_field($_REQUEST['type']);
74
- else
75
- $type = "revenue";
76
-
77
- if($type == "sales")
78
- $type_function = "COUNT";
79
- else
80
- $type_function = "SUM";
81
-
82
- if(isset($_REQUEST['period']))
83
- $period = sanitize_text_field($_REQUEST['period']);
84
- else
85
- $period = "daily";
86
-
87
- if(isset($_REQUEST['month']))
88
- $month = intval($_REQUEST['month']);
89
- else
90
- $month = date("n");
91
-
92
- $thisyear = date("Y");
93
- if(isset($_REQUEST['year']))
94
- $year = intval($_REQUEST['year']);
95
- else
96
- $year = $thisyear;
97
-
98
- if(isset($_REQUEST['level']))
99
- $l = intval($_REQUEST['level']);
100
- else
101
- $l = "";
102
-
103
- //calculate start date and how to group dates returned from DB
104
- if($period == "daily")
105
- {
106
- $startdate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-01';
107
- $enddate = $year . '-' . substr("0" . $month, strlen($month) - 1, 2) . '-31';
108
- $date_function = 'DAY';
109
- }
110
- elseif($period == "monthly")
111
- {
112
- $startdate = $year . '-01-01';
113
- $enddate = strval(intval($year)+1) . '-01-01';
114
- $date_function = 'MONTH';
115
- }
116
- else
117
- {
118
- $startdate = '1960-01-01'; //all time
119
- $date_function = 'YEAR';
120
- }
121
-
122
- //testing or live data
123
- $gateway_environment = pmpro_getOption("gateway_environment");
124
-
125
- //get data
126
- $sqlQuery = "SELECT $date_function(timestamp) as date, $type_function(total) as value FROM $wpdb->pmpro_membership_orders WHERE timestamp >= '" . $startdate . "' AND status NOT IN('refunded', 'review', 'token', 'error') AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
127
-
128
- if(!empty($enddate))
129
- $sqlQuery .= "AND timestamp < '" . $enddate . "' ";
130
-
131
- if(!empty($l))
132
- $sqlQuery .= "AND membership_id IN(" . $l . ") ";
133
-
134
- $sqlQuery .= " GROUP BY date ORDER BY date ";
135
-
136
- $dates = $wpdb->get_results($sqlQuery);
137
-
138
- //fill in blanks in dates
139
- $cols = array();
140
- if($period == "daily")
141
- {
142
- $lastday = date("t", $startdate);
143
-
144
- for($i = 1; $i <= $lastday; $i++)
145
- {
146
- $cols[$i] = 0;
147
- foreach($dates as $date)
148
- {
149
- if($date->date == $i)
150
- $cols[$i] = $date->value;
151
- }
152
- }
153
- }
154
- elseif($period == "monthly")
155
- {
156
- for($i = 1; $i < 13; $i++)
157
- {
158
- $cols[$i] = 0;
159
- foreach($dates as $date)
160
- {
161
- if($date->date == $i)
162
- $cols[$i] = $date->value;
163
- }
164
- }
165
- }
166
- else //annual
167
- {
168
- //get min and max years
169
- $min = 9999;
170
- $max = 0;
171
- foreach($dates as $date)
172
- {
173
- $min = min($min, $date->date);
174
- $max = max($max, $date->date);
175
- }
176
-
177
- for($i = $min; $i <= $max; $i++)
178
- {
179
- foreach($dates as $date)
180
- {
181
- if($date->date == $i)
182
- $cols[$i] = $date->value;
183
- }
184
- }
185
- }
186
- ?>
187
- <form id="posts-filter" method="get" action="">
188
- <h2>
189
- <?php _e('Sales and Revenue', 'pmpro');?>
190
- </h2>
191
-
192
- <div class="tablenav top">
193
- <?php _ex('Show', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?>
194
- <select id="period" name="period">
195
- <option value="daily" <?php selected($period, "daily");?>><?php _e('Daily', 'pmpro');?></option>
196
- <option value="monthly" <?php selected($period, "monthly");?>><?php _e('Monthly', 'pmpro');?></option>
197
- <option value="annual" <?php selected($period, "annual");?>><?php _e('Annual', 'pmpro');?></option>
198
- </select>
199
- <select name="type">
200
- <option value="revenue" <?php selected($type, "revenue");?>><?php _e('Revenue', 'pmpro');?></option>
201
- <option value="sales" <?php selected($type, "sales");?>><?php _e('Sales', 'pmpro');?></option>
202
- </select>
203
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
204
- <select id="month" name="month">
205
- <?php for($i = 1; $i < 13; $i++) { ?>
206
- <option value="<?php echo $i;?>" <?php selected($month, $i);?>><?php echo date("F", mktime(0, 0, 0, $i));?></option>
207
- <?php } ?>
208
- </select>
209
- <select id="year" name="year">
210
- <?php for($i = $thisyear; $i > 2007; $i--) { ?>
211
- <option value="<?php echo $i;?>" <?php selected($year, $i);?>><?php echo $i;?></option>
212
- <?php } ?>
213
- </select>
214
- <span id="for"><?php _ex('for', 'Dropdown label, e.g. Show Daily Revenue for January', 'pmpro')?></span>
215
- <select name="level">
216
- <option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'pmpro');?></option>
217
- <?php
218
- $levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
219
- foreach($levels as $level)
220
- {
221
- ?>
222
- <option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
223
- <?php
224
- }
225
- ?>
226
- </select>
227
-
228
- <input type="hidden" name="page" value="pmpro-reports" />
229
- <input type="hidden" name="report" value="sales" />
230
- <input type="submit" class="button action" value="<?php _ex('Generate Report', 'Submit button value.', 'pmpro');?>" />
231
- </div>
232
-
233
- <div id="chart_div" style="clear: both; width: 100%; height: 500px;"></div>
234
-
235
- <script>
236
- //update month/year when period dropdown is changed
237
- jQuery(document).ready(function() {
238
- jQuery('#period').change(function() {
239
- pmpro_ShowMonthOrYear();
240
- });
241
- });
242
-
243
- function pmpro_ShowMonthOrYear()
244
- {
245
- var period = jQuery('#period').val();
246
- if(period == 'daily')
247
- {
248
- jQuery('#for').show();
249
- jQuery('#month').show();
250
- jQuery('#year').show();
251
- }
252
- else if(period == 'monthly')
253
- {
254
- jQuery('#for').show();
255
- jQuery('#month').hide();
256
- jQuery('#year').show();
257
- }
258
- else
259
- {
260
- jQuery('#for').hide();
261
- jQuery('#month').hide();
262
- jQuery('#year').hide();
263
- }
264
- }
265
-
266
- pmpro_ShowMonthOrYear();
267
-
268
- //draw the chart
269
- google.load("visualization", "1", {packages:["corechart"]});
270
- google.setOnLoadCallback(drawChart);
271
- function drawChart() {
272
-
273
- var data = google.visualization.arrayToDataTable([
274
- ['<?php echo $date_function;?>', '<?php echo ucwords($type);?>'],
275
- <?php foreach($cols as $date => $value) { ?>
276
- ['<?php if($period == "monthly") echo date("M", mktime(0,0,0,$date)); else echo $date;?>', <?php echo $value;?>],
277
- <?php } ?>
278
- ]);
279
-
280
- var options = {
281
- colors: ['#51a351', '#387038'],
282
- hAxis: {title: '<?php echo $date_function;?>', titleTextStyle: {color: 'black'}, maxAlternation: 1},
283
- vAxis: {color: 'green', titleTextStyle: {color: '#51a351'}},
284
- };
285
-
286
- <?php if($type != "sales") { ?>
287
- var formatter = new google.visualization.NumberFormat({prefix: '<?php echo html_entity_decode($pmpro_currency_symbol);?>'});
288
- formatter.format(data, 1);
289
- <?php } ?>
290
-
291
- var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
292
- chart.draw(data, options);
293
- }
294
- </script>
295
-
296
- </form>
297
- <?php
298
- }
299
-
300
- /*
301
- Other code required for your reports. This file is loaded every time WP loads with PMPro enabled.
302
- */
303
-
304
- //get sales
305
- function pmpro_getSales($period, $levels = NULL)
306
- {
307
- //check for a transient
308
- $cache = get_transient("pmpro_report_sales");
309
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
310
- return $cache[$period][$levels];
311
-
312
- //a sale is an order with status NOT IN('refunded', 'review', 'token', 'error')
313
- if($period == "today")
314
- $startdate = date("Y-m-d");
315
- elseif($period == "this month")
316
- $startdate = date("Y-m") . "-01";
317
- elseif($period == "this year")
318
- $startdate = date("Y") . "-01-01";
319
- else
320
- $startdate = "";
321
-
322
- $gateway_environment = pmpro_getOption("gateway_environment");
323
-
324
- //build query
325
- global $wpdb;
326
- $sqlQuery = "SELECT COUNT(*) FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token', 'error') AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
327
-
328
- //restrict by level
329
- if(!empty($levels))
330
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
331
-
332
- $sales = $wpdb->get_var($sqlQuery);
333
-
334
- //save in cache
335
- if(!empty($cache) && !empty($cache[$period]))
336
- $cache[$period][$levels] = $sales;
337
- elseif(!empty($cache))
338
- $cache[$period] = array($levels => $sales);
339
- else
340
- $cache = array($period => array($levels => $sales));
341
-
342
- set_transient("pmpro_report_sales", $cache, 3600*24);
343
-
344
- return $sales;
345
- }
346
-
347
- //get revenue
348
- function pmpro_getRevenue($period, $levels = NULL)
349
- {
350
- //check for a transient
351
- $cache = get_transient("pmpro_report_revenue");
352
- if(!empty($cache) && !empty($cache[$period]) && !empty($cache[$period][$levels]))
353
- return $cache[$period][$levels];
354
-
355
- //a sale is an order with status NOT IN('refunded', 'review', 'token', 'error')
356
- if($period == "today")
357
- $startdate = date("Y-m-d");
358
- elseif($period == "this month")
359
- $startdate = date("Y-m") . "-01";
360
- elseif($period == "this year")
361
- $startdate = date("Y") . "-01-01";
362
- else
363
- $startdate = "";
364
-
365
- $gateway_environment = pmpro_getOption("gateway_environment");
366
-
367
- //build query
368
- global $wpdb;
369
- $sqlQuery = "SELECT SUM(total) FROM $wpdb->pmpro_membership_orders WHERE status NOT IN('refunded', 'review', 'token', 'error') AND timestamp >= '" . $startdate . "' AND gateway_environment = '" . esc_sql($gateway_environment) . "' ";
370
-
371
- //restrict by level
372
- if(!empty($levels))
373
- $sqlQuery .= "AND membership_id IN(" . $levels . ") ";
374
-
375
- $revenue = $wpdb->get_var($sqlQuery);
376
-
377
- //save in cache
378
- if(!empty($cache) && !empty($cache[$period]))
379
- $cache[$period][$levels] = $revenue;
380
- elseif(!empty($cache))
381
- $cache[$period] = array($levels => $revenue);
382
- else
383
- $cache = array($period => array($levels => $revenue));
384
-
385
- set_transient("pmpro_report_revenue", $cache, 3600*24);
386
-
387
- return $revenue;
388
- }
389
-
390
- //delete transients when an order goes through
391
- function pmpro_report_sales_delete_transients()
392
- {
393
- delete_transient("pmpro_report_sales");
394
- delete_transient("pmpro_report_revenue");
395
- }
396
- add_action("pmpro_after_checkout", "pmpro_report_sales_delete_transients");
397
- add_action("pmpro_updated_order", "pmpro_report_sales_delete_transients");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/class.memberorder.php CHANGED
@@ -109,7 +109,7 @@
109
 
110
  //which one to load?
111
  $classname = "PMProGateway"; //default test gateway
112
- if(!empty($this->gateway) && $this->gateway != "free")
113
  $classname .= "_" . $this->gateway; //adding the gateway suffix
114
 
115
  //try to load it
@@ -125,7 +125,7 @@
125
  return $this->Gateway;
126
  }
127
 
128
- function getLastMemberOrder($user_id = NULL, $status = 'success', $membership_id = NULL)
129
  {
130
  global $current_user, $wpdb;
131
  if(!$user_id)
@@ -139,10 +139,7 @@
139
  if(!empty($status) && is_array($status))
140
  $this->sqlQuery .= "AND status IN('" . implode("','", $status) . "') ";
141
  elseif(!empty($status))
142
- $this->sqlQuery .= "AND status = '" . esc_sql($status) . "' ";
143
-
144
- if(!empty($membership_id))
145
- $this->sqlQuery .= "AND membership_id = '" . $membership_id . "' ";
146
  $this->sqlQuery .= "ORDER BY timestamp DESC LIMIT 1";
147
 
148
  //get id
@@ -151,9 +148,6 @@
151
  return $this->getMemberOrderByID($id);
152
  }
153
 
154
- /*
155
- Returns the order using the given order code.
156
- */
157
  function getMemberOrderByCode($code)
158
  {
159
  global $wpdb;
@@ -164,17 +158,10 @@
164
  return false;
165
  }
166
 
167
- /*
168
- Returns the last order using the given payment_transaction_id.
169
- */
170
  function getMemberOrderByPaymentTransactionID($payment_transaction_id)
171
  {
172
- //did they pass a trans id?
173
- if(empty($payment_transaction_id))
174
- return false;
175
-
176
  global $wpdb;
177
- $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE payment_transaction_id = '" . esc_sql($payment_transaction_id) . "' LIMIT 1");
178
  if($id)
179
  return $this->getMemberOrderByID($id);
180
  else
@@ -186,13 +173,8 @@
186
  */
187
  function getLastMemberOrderBySubscriptionTransactionID($subscription_transaction_id)
188
  {
189
- //did they pass a sub id?
190
- if(empty($subscription_transaction_id))
191
- return false;
192
-
193
  global $wpdb;
194
- $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE subscription_transaction_id = '" . esc_sql($subscription_transaction_id) . "' ORDER BY id DESC LIMIT 1");
195
-
196
  if($id)
197
  return $this->getMemberOrderByID($id);
198
  else
@@ -217,9 +199,6 @@
217
  global $wpdb;
218
  $this->discount_code = $wpdb->get_row("SELECT dc.* FROM $wpdb->pmpro_discount_codes dc LEFT JOIN $wpdb->pmpro_discount_codes_uses dcu ON dc.id = dcu.code_id WHERE dcu.order_id = '" . $this->id . "' LIMIT 1");
219
 
220
- //filter @since v1.7.14
221
- $this->discount_code = apply_filters("pmpro_order_discount_code", $this->discount_code, $this);
222
-
223
  return $this->discount_code;
224
  }
225
 
@@ -255,13 +234,7 @@
255
  //okay, do I have a discount code to check? (if there is no membership_level->membership_id value, that means there was no entry in memberships_users)
256
  if(!empty($this->discount_code) && empty($this->membership_level->membership_id))
257
  {
258
- if(!empty($this->discount_code->code))
259
- $discount_code = $this->discount_code->code;
260
- else
261
- $discount_code = $this->discount_code;
262
-
263
- $sqlQuery = "SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id LEFT JOIN $wpdb->pmpro_discount_codes dc ON dc.id = cl.code_id WHERE dc.code = '" . $discount_code . "' AND cl.level_id = '" . $this->membership_id . "' LIMIT 1";
264
-
265
  $this->membership_level = $wpdb->get_row($sqlQuery);
266
  }
267
 
@@ -287,7 +260,7 @@
287
  if($tax_state && $tax_rate)
288
  {
289
  //we have values, is this order in the tax state?
290
- if(!empty($this->billing) && trim(strtoupper($this->billing->state)) == trim(strtoupper($tax_state)))
291
  {
292
  //return value, pass through filter
293
  $tax = round((float)$price * (float)$tax_rate, 2);
@@ -375,11 +348,10 @@
375
  //these fix some warnings/notices
376
  if(empty($this->billing))
377
  {
378
- $this->billing = new stdClass();
379
  $this->billing->name = $this->billing->street = $this->billing->city = $this->billing->state = $this->billing->zip = $this->billing->country = $this->billing->phone = "";
380
  }
381
  if(empty($this->user_id))
382
- $this->user_id = 0;
383
  if(empty($this->paypal_token))
384
  $this->paypal_token = "";
385
  if(empty($this->couponamount))
@@ -395,15 +367,7 @@
395
  if(empty($this->affiliate_subid))
396
  $this->affiliate_subid = "";
397
  if(empty($this->session_id))
398
- $this->session_id = "";
399
- if(empty($this->accountnumber))
400
- $this->accountnumber = "";
401
- if(empty($this->cardtype))
402
- $this->cardtype = "";
403
- if(empty($this->ExpirationDate))
404
- $this->ExpirationDate = "";
405
- if (empty($this->status))
406
- $this->status = "";
407
 
408
  if(empty($this->gateway))
409
  $this->gateway = pmpro_getOption("gateway");
@@ -423,20 +387,20 @@
423
  $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders
424
  SET `code` = '" . $this->code . "',
425
  `session_id` = '" . $this->session_id . "',
426
- `user_id` = " . intval($this->user_id) . ",
427
- `membership_id` = " . intval($this->membership_id) . ",
428
  `paypal_token` = '" . $this->paypal_token . "',
429
- `billing_name` = '" . esc_sql($this->billing->name) . "',
430
- `billing_street` = '" . esc_sql($this->billing->street) . "',
431
- `billing_city` = '" . esc_sql($this->billing->city) . "',
432
- `billing_state` = '" . esc_sql($this->billing->state) . "',
433
- `billing_zip` = '" . esc_sql($this->billing->zip) . "',
434
- `billing_country` = '" . esc_sql($this->billing->country) . "',
435
- `billing_phone` = '" . esc_sql($this->billing->phone) . "',
436
  `subtotal` = '" . $this->subtotal . "',
437
  `tax` = '" . $this->tax . "',
438
  `couponamount` = '" . $this->couponamount . "',
439
- `certificate_id` = " . intval($this->certificate_id) . ",
440
  `certificateamount` = '" . $this->certificateamount . "',
441
  `total` = '" . $this->total . "',
442
  `payment_type` = '" . $this->payment_type . "',
@@ -444,14 +408,14 @@
444
  `accountnumber` = '" . $this->accountnumber . "',
445
  `expirationmonth` = '" . $this->expirationmonth . "',
446
  `expirationyear` = '" . $this->expirationyear . "',
447
- `status` = '" . esc_sql($this->status) . "',
448
  `gateway` = '" . $this->gateway . "',
449
  `gateway_environment` = '" . $this->gateway_environment . "',
450
- `payment_transaction_id` = '" . esc_sql($this->payment_transaction_id) . "',
451
- `subscription_transaction_id` = '" . esc_sql($this->subscription_transaction_id) . "',
452
- `affiliate_id` = '" . esc_sql($this->affiliate_id) . "',
453
- `affiliate_subid` = '" . esc_sql($this->affiliate_subid) . "',
454
- `notes` = '" . esc_sql($this->notes) . "'
455
  WHERE id = '" . $this->id . "'
456
  LIMIT 1";
457
  }
@@ -465,20 +429,20 @@
465
  (`code`, `session_id`, `user_id`, `membership_id`, `paypal_token`, `billing_name`, `billing_street`, `billing_city`, `billing_state`, `billing_zip`, `billing_country`, `billing_phone`, `subtotal`, `tax`, `couponamount`, `certificate_id`, `certificateamount`, `total`, `payment_type`, `cardtype`, `accountnumber`, `expirationmonth`, `expirationyear`, `status`, `gateway`, `gateway_environment`, `payment_transaction_id`, `subscription_transaction_id`, `timestamp`, `affiliate_id`, `affiliate_subid`, `notes`)
466
  VALUES('" . $this->code . "',
467
  '" . session_id() . "',
468
- " . intval($this->user_id) . ",
469
- " . intval($this->membership_id) . ",
470
  '" . $this->paypal_token . "',
471
- '" . esc_sql(trim($this->billing->name)) . "',
472
- '" . esc_sql(trim($this->billing->street)) . "',
473
- '" . esc_sql($this->billing->city) . "',
474
- '" . esc_sql($this->billing->state) . "',
475
- '" . esc_sql($this->billing->zip) . "',
476
- '" . esc_sql($this->billing->country) . "',
477
  '" . cleanPhone($this->billing->phone) . "',
478
  '" . $amount . "',
479
  '" . $tax . "',
480
  '" . $this->couponamount. "',
481
- " . intval($this->certificate_id) . ",
482
  '" . $this->certificateamount . "',
483
  '" . $total . "',
484
  '" . $this->payment_type . "',
@@ -486,15 +450,15 @@
486
  '" . hideCardNumber($this->accountnumber, false) . "',
487
  '" . substr($this->ExpirationDate, 0, 2) . "',
488
  '" . substr($this->ExpirationDate, 2, 4) . "',
489
- '" . esc_sql($this->status) . "',
490
  '" . $this->gateway . "',
491
  '" . $this->gateway_environment . "',
492
- '" . esc_sql($this->payment_transaction_id) . "',
493
- '" . esc_sql($this->subscription_transaction_id) . "',
494
- '" . current_time('mysql') . "',
495
- '" . esc_sql($this->affiliate_id) . "',
496
- '" . esc_sql($this->affiliate_subid) . "',
497
- '" . esc_sql($this->notes) . "'
498
  )";
499
  }
500
 
@@ -518,9 +482,8 @@
518
 
519
  while(empty($code))
520
  {
521
- $scramble = md5(AUTH_KEY . current_time('timestamp') . SECURE_AUTH_KEY);
522
  $code = substr($scramble, 0, 10);
523
- $code = apply_filters("pmpro_random_code", $code, $this); //filter
524
  $check = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE code = '$code' LIMIT 1");
525
  if($check || is_numeric($code))
526
  $code = NULL;
@@ -537,7 +500,7 @@
537
  return false;
538
 
539
  $this->status = $newstatus;
540
- $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders SET status = '" . esc_sql($newstatus) . "' WHERE id = '" . $this->id . "' LIMIT 1";
541
  if($wpdb->query($this->sqlQuery) !== false)
542
  return true;
543
  else
@@ -550,7 +513,7 @@
550
  }
551
 
552
  function cancel()
553
- {
554
  //only need to cancel on the gateway if there is a subscription id
555
  if(empty($this->subscription_transaction_id))
556
  {
@@ -559,28 +522,9 @@
559
  return true;
560
  }
561
  else
562
- {
563
  //cancel the gateway subscription first
564
- $result = $this->Gateway->cancel($this);
565
- if($result == false)
566
- {
567
- //there was an error, but cancel the order no matter what
568
- $this->updateStatus("cancelled");
569
-
570
- //we should probably notify the admin
571
- $pmproemail = new PMProEmail();
572
- $pmproemail->template = "subscription_cancel_error";
573
- $pmproemail->data = array("body"=>"<p>" . sprintf(__("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.", "pmpro"), strval($this->user_id)) . "</p><p>Error: " . $this->error . "</p>");
574
- $pmproemail->data["body"] .= "<p>Associated Order:<br />" . nl2br(var_export($this, true)) . "</p>";
575
- $pmproemail->sendEmail(get_bloginfo("admin_email"));
576
-
577
- return false;
578
- }
579
- else
580
- {
581
- //would have been cancelled by the gateway class
582
- return $result;
583
- }
584
  }
585
  }
586
 
@@ -589,16 +533,6 @@
589
  return $this->Gateway->update($this);
590
  }
591
 
592
- function getGatewaySubscriptionStatus()
593
- {
594
- return $this->Gateway->getSubscriptionStatus($this);
595
- }
596
-
597
- function getGatewayTransactionStatus()
598
- {
599
- return $this->Gateway->getTransactionStatus($this);
600
- }
601
-
602
  function deleteMe()
603
  {
604
  if(empty($this->id))
109
 
110
  //which one to load?
111
  $classname = "PMProGateway"; //default test gateway
112
+ if(!empty($this->gateway))
113
  $classname .= "_" . $this->gateway; //adding the gateway suffix
114
 
115
  //try to load it
125
  return $this->Gateway;
126
  }
127
 
128
+ function getLastMemberOrder($user_id = NULL, $status = 'success')
129
  {
130
  global $current_user, $wpdb;
131
  if(!$user_id)
139
  if(!empty($status) && is_array($status))
140
  $this->sqlQuery .= "AND status IN('" . implode("','", $status) . "') ";
141
  elseif(!empty($status))
142
+ $this->sqlQuery .= "AND status = '" . $wpdb->escape($status) . "' ";
 
 
 
143
  $this->sqlQuery .= "ORDER BY timestamp DESC LIMIT 1";
144
 
145
  //get id
148
  return $this->getMemberOrderByID($id);
149
  }
150
 
 
 
 
151
  function getMemberOrderByCode($code)
152
  {
153
  global $wpdb;
158
  return false;
159
  }
160
 
 
 
 
161
  function getMemberOrderByPaymentTransactionID($payment_transaction_id)
162
  {
 
 
 
 
163
  global $wpdb;
164
+ $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE payment_transaction_id = '" . $wpdb->escape($payment_transaction_id) . "' LIMIT 1");
165
  if($id)
166
  return $this->getMemberOrderByID($id);
167
  else
173
  */
174
  function getLastMemberOrderBySubscriptionTransactionID($subscription_transaction_id)
175
  {
 
 
 
 
176
  global $wpdb;
177
+ $id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE subscription_transaction_id = '" . $wpdb->escape($subscription_transaction_id) . "' ORDER BY id DESC LIMIT 1");
 
178
  if($id)
179
  return $this->getMemberOrderByID($id);
180
  else
199
  global $wpdb;
200
  $this->discount_code = $wpdb->get_row("SELECT dc.* FROM $wpdb->pmpro_discount_codes dc LEFT JOIN $wpdb->pmpro_discount_codes_uses dcu ON dc.id = dcu.code_id WHERE dcu.order_id = '" . $this->id . "' LIMIT 1");
201
 
 
 
 
202
  return $this->discount_code;
203
  }
204
 
234
  //okay, do I have a discount code to check? (if there is no membership_level->membership_id value, that means there was no entry in memberships_users)
235
  if(!empty($this->discount_code) && empty($this->membership_level->membership_id))
236
  {
237
+ $sqlQuery = "SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id LEFT JOIN $wpdb->pmpro_discount_codes dc ON dc.id = cl.code_id WHERE dc.code = '" . $this->discount_code . "' AND cl.level_id = '" . $this->membership_id . "' LIMIT 1";
 
 
 
 
 
 
238
  $this->membership_level = $wpdb->get_row($sqlQuery);
239
  }
240
 
260
  if($tax_state && $tax_rate)
261
  {
262
  //we have values, is this order in the tax state?
263
+ if(trim(strtoupper($this->billing->state)) == trim(strtoupper($tax_state)))
264
  {
265
  //return value, pass through filter
266
  $tax = round((float)$price * (float)$tax_rate, 2);
348
  //these fix some warnings/notices
349
  if(empty($this->billing))
350
  {
 
351
  $this->billing->name = $this->billing->street = $this->billing->city = $this->billing->state = $this->billing->zip = $this->billing->country = $this->billing->phone = "";
352
  }
353
  if(empty($this->user_id))
354
+ $this->user_id = "";
355
  if(empty($this->paypal_token))
356
  $this->paypal_token = "";
357
  if(empty($this->couponamount))
367
  if(empty($this->affiliate_subid))
368
  $this->affiliate_subid = "";
369
  if(empty($this->session_id))
370
+ $this->session_id = "";
 
 
 
 
 
 
 
 
371
 
372
  if(empty($this->gateway))
373
  $this->gateway = pmpro_getOption("gateway");
387
  $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders
388
  SET `code` = '" . $this->code . "',
389
  `session_id` = '" . $this->session_id . "',
390
+ `user_id` = '" . $this->user_id . "',
391
+ `membership_id` = '" . $this->membership_id . "',
392
  `paypal_token` = '" . $this->paypal_token . "',
393
+ `billing_name` = '" . $wpdb->escape($this->billing->name) . "',
394
+ `billing_street` = '" . $wpdb->escape($this->billing->street) . "',
395
+ `billing_city` = '" . $wpdb->escape($this->billing->city) . "',
396
+ `billing_state` = '" . $wpdb->escape($this->billing->state) . "',
397
+ `billing_zip` = '" . $wpdb->escape($this->billing->zip) . "',
398
+ `billing_country` = '" . $wpdb->escape($this->billing->country) . "',
399
+ `billing_phone` = '" . $wpdb->escape($this->billing->phone) . "',
400
  `subtotal` = '" . $this->subtotal . "',
401
  `tax` = '" . $this->tax . "',
402
  `couponamount` = '" . $this->couponamount . "',
403
+ `certificate_id` = '" . $this->certificate_id . "',
404
  `certificateamount` = '" . $this->certificateamount . "',
405
  `total` = '" . $this->total . "',
406
  `payment_type` = '" . $this->payment_type . "',
408
  `accountnumber` = '" . $this->accountnumber . "',
409
  `expirationmonth` = '" . $this->expirationmonth . "',
410
  `expirationyear` = '" . $this->expirationyear . "',
411
+ `status` = '" . $wpdb->escape($this->status) . "',
412
  `gateway` = '" . $this->gateway . "',
413
  `gateway_environment` = '" . $this->gateway_environment . "',
414
+ `payment_transaction_id` = '" . $wpdb->escape($this->payment_transaction_id) . "',
415
+ `subscription_transaction_id` = '" . $wpdb->escape($this->subscription_transaction_id) . "',
416
+ `affiliate_id` = '" . $wpdb->escape($this->affiliate_id) . "',
417
+ `affiliate_subid` = '" . $wpdb->escape($this->affiliate_subid) . "',
418
+ `notes` = '" . $wpdb->escape($this->notes) . "'
419
  WHERE id = '" . $this->id . "'
420
  LIMIT 1";
421
  }
429
  (`code`, `session_id`, `user_id`, `membership_id`, `paypal_token`, `billing_name`, `billing_street`, `billing_city`, `billing_state`, `billing_zip`, `billing_country`, `billing_phone`, `subtotal`, `tax`, `couponamount`, `certificate_id`, `certificateamount`, `total`, `payment_type`, `cardtype`, `accountnumber`, `expirationmonth`, `expirationyear`, `status`, `gateway`, `gateway_environment`, `payment_transaction_id`, `subscription_transaction_id`, `timestamp`, `affiliate_id`, `affiliate_subid`, `notes`)
430
  VALUES('" . $this->code . "',
431
  '" . session_id() . "',
432
+ '" . $this->user_id . "',
433
+ '" . $this->membership_id . "',
434
  '" . $this->paypal_token . "',
435
+ '" . $wpdb->escape(trim($this->billing->name)) . "',
436
+ '" . $wpdb->escape(trim($this->billing->street)) . "',
437
+ '" . $wpdb->escape($this->billing->city) . "',
438
+ '" . $wpdb->escape($this->billing->state) . "',
439
+ '" . $wpdb->escape($this->billing->zip) . "',
440
+ '" . $wpdb->escape($this->billing->country) . "',
441
  '" . cleanPhone($this->billing->phone) . "',
442
  '" . $amount . "',
443
  '" . $tax . "',
444
  '" . $this->couponamount. "',
445
+ '" . intval($this->certificate_id) . "',
446
  '" . $this->certificateamount . "',
447
  '" . $total . "',
448
  '" . $this->payment_type . "',
450
  '" . hideCardNumber($this->accountnumber, false) . "',
451
  '" . substr($this->ExpirationDate, 0, 2) . "',
452
  '" . substr($this->ExpirationDate, 2, 4) . "',
453
+ '" . $wpdb->escape($this->status) . "',
454
  '" . $this->gateway . "',
455
  '" . $this->gateway_environment . "',
456
+ '" . $wpdb->escape($this->payment_transaction_id) . "',
457
+ '" . $wpdb->escape($this->subscription_transaction_id) . "',
458
+ now(),
459
+ '" . $wpdb->escape($this->affiliate_id) . "',
460
+ '" . $wpdb->escape($this->affiliate_subid) . "',
461
+ '" . $wpdb->escape($this->notes) . "'
462
  )";
463
  }
464
 
482
 
483
  while(empty($code))
484
  {
485
+ $scramble = md5(AUTH_KEY . time() . SECURE_AUTH_KEY);
486
  $code = substr($scramble, 0, 10);
 
487
  $check = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE code = '$code' LIMIT 1");
488
  if($check || is_numeric($code))
489
  $code = NULL;
500
  return false;
501
 
502
  $this->status = $newstatus;
503
+ $this->sqlQuery = "UPDATE $wpdb->pmpro_membership_orders SET status = '" . $wpdb->escape($newstatus) . "' WHERE id = '" . $this->id . "' LIMIT 1";
504
  if($wpdb->query($this->sqlQuery) !== false)
505
  return true;
506
  else
513
  }
514
 
515
  function cancel()
516
+ {
517
  //only need to cancel on the gateway if there is a subscription id
518
  if(empty($this->subscription_transaction_id))
519
  {
522
  return true;
523
  }
524
  else
525
+ {
526
  //cancel the gateway subscription first
527
+ return $this->Gateway->cancel($this);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
528
  }
529
  }
530
 
533
  return $this->Gateway->update($this);
534
  }
535
 
 
 
 
 
 
 
 
 
 
 
536
  function deleteMe()
537
  {
538
  if(empty($this->id))
classes/class.pmproemail.php CHANGED
@@ -34,7 +34,7 @@
34
  $this->fromname = pmpro_getOption("from_name");
35
 
36
  if(!$this->subject)
37
- $this->subject = sprintf(__("An Email From %s", "pmpro"), get_option("blogname"));
38
 
39
  //decode the subject line in case there are apostrophes/etc in it
40
  $this->subject = html_entity_decode($this->subject, ENT_QUOTES, 'UTF-8');
@@ -44,25 +44,16 @@
44
 
45
  $this->headers = array("Content-Type: text/html");
46
 
47
- $this->attachments = NULL;
48
-
49
  //load the template
50
- $locale = apply_filters("plugin_locale", get_locale(), "pmpro");
51
  if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/email/" . $this->template . ".html"))
52
- $this->body = file_get_contents(get_stylesheet_directory() . "/paid-memberships-pro/email/" . $this->template . ".html"); //email folder in pmpro folder in theme
53
  elseif(file_exists(get_stylesheet_directory() . "/membership-email-" . $this->template . ".html"))
54
- $this->body = file_get_contents(get_stylesheet_directory() . "/membership-email-" . $this->template . ".html"); //membership- file in pmpro folder in theme
55
  elseif(file_exists(TEMPLATEPATH . "/membership-email-" . $this->template . ".html"))
56
- $this->body = file_get_contents(TEMPLATEPATH . "/membership-email-" . $this->template . ".html"); //membership- file in theme root
57
- elseif(file_exists(WP_LANG_DIR . '/pmpro/email/' . $this->template . ".html"))
58
- $this->body = file_get_contents(WP_LANG_DIR . '/pmpro/email/' . $this->template . ".html"); //email folder in WP language folder
59
- elseif(file_exists(PMPRO_DIR . "/languages/" . $locale . "/" . $this->template . ".html"))
60
- $this->body = file_get_contents(PMPRO_DIR . "/languages/" . $locale . "/" . $this->template . ".html"); //email folder in PMPro language folder
61
  elseif(file_exists(PMPRO_DIR . "/email/" . $this->template . ".html"))
62
- $this->body = file_get_contents(PMPRO_DIR . "/email/" . $this->template . ".html"); //default template in plugin
63
- elseif(!empty($this->data) && !empty($this->data['body']))
64
- $this->body = $this->data['body'];
65
-
66
  //header and footer
67
  /* This is handled for all emails via the pmpro_send_html function in paid-memberships-pro now
68
  if(file_exists(TEMPLATEPATH . "/email_header.html"))
@@ -100,9 +91,8 @@
100
  $this->template = apply_filters("pmpro_email_template", $temail->template, $this);
101
  $this->body = apply_filters("pmpro_email_body", $temail->body, $this);
102
  $this->headers = apply_filters("pmpro_email_headers", $temail->headers, $this);
103
- $this->attachments = apply_filters("pmpro_email_attachments", $temail->attachments, $this);
104
 
105
- if(wp_mail($this->email,$this->subject,$this->body,$this->headers,$this->attachments))
106
  {
107
  return true;
108
  }
@@ -122,7 +112,7 @@
122
  return false;
123
 
124
  $this->email = $user->user_email;
125
- $this->subject = sprintf(__("Your membership at %s has been CANCELLED", "pmpro"), get_option("blogname"));
126
  $this->template = "cancel";
127
  $this->data = array("name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"));
128
 
@@ -144,10 +134,9 @@
144
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
145
 
146
  $this->email = get_bloginfo("admin_email");
147
- $this->subject = sprintf(__("Membership for %s at %s has been CANCELLED", "pmpro"), $user->user_login, get_option("blogname"));
148
  $this->template = "cancel_admin";
149
  $this->data = array("user_login" => $user->user_login, "user_email" => $user->user_email, "display_name" => $user->display_name, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url());
150
- $this->data['membership_id'] = $old_level_id;
151
  $this->data['membership_level_name'] = $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $old_level_id . "' LIMIT 1");
152
 
153
  //start and end date
@@ -175,7 +164,7 @@
175
  return false;
176
 
177
  $this->email = $user->user_email;
178
- $this->subject = sprintf(__("Your membership confirmation for %s", "pmpro"), get_option("blogname"));
179
 
180
  $this->data = array(
181
  "subject" => $this->subject,
@@ -183,15 +172,14 @@
183
  "user_login" => $user->user_login,
184
  "sitename" => get_option("blogname"),
185
  "siteemail" => pmpro_getOption("from_email"),
186
- "membership_id" => $user->membership_level->id,
187
  "membership_level_name" => $user->membership_level->name,
188
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
189
- "login_link" => wp_login_url(pmpro_url("account")),
190
  "display_name" => $user->display_name,
191
  "user_email" => $user->user_email,0
192
  );
193
-
194
- if(!empty($invoice) && !pmpro_isLevelFree($user->membership_level))
195
  {
196
  if($invoice->gateway == "paypalexpress")
197
  $this->template = "checkout_express";
@@ -218,17 +206,9 @@
218
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
219
  $this->data["expirationmonth"] = $invoice->expirationmonth;
220
  $this->data["expirationyear"] = $invoice->expirationyear;
221
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
222
- $invoice->billing->street,
223
- "", //address 2
224
- $invoice->billing->city,
225
- $invoice->billing->state,
226
- $invoice->billing->zip,
227
- $invoice->billing->country,
228
- $invoice->billing->phone);
229
 
230
  if($invoice->getDiscountCode())
231
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $invoice->discount_code->code . "</p>\n";
232
  else
233
  $this->data["discount_code"] = "";
234
  }
@@ -237,23 +217,19 @@
237
  $this->template = "checkout_free";
238
  global $discount_code;
239
  if(!empty($discount_code))
240
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $discount_code . "</p>\n";
241
  else
242
  $this->data["discount_code"] = "";
243
  }
244
  else
245
  {
246
  $this->template = "checkout_freetrial";
247
- global $discount_code;
248
- if(!empty($discount_code))
249
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $discount_code . "</p>\n";
250
- else
251
- $this->data["discount_code"] = "";
252
  }
253
 
254
  $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
255
  if($enddate)
256
- $this->data["membership_expiration"] = "<p>" . sprintf(__("This membership will expire on %s.", "pmpro"), date(get_option('date_format'), $enddate)) . "</p>\n";
257
  else
258
  $this->data["membership_expiration"] = "";
259
 
@@ -275,7 +251,7 @@
275
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
276
 
277
  $this->email = get_bloginfo("admin_email");
278
- $this->subject = sprintf(__("Member Checkout for %s at %s", "pmpro"), $user->membership_level->name, get_option("blogname"));
279
 
280
  $this->data = array(
281
  "subject" => $this->subject,
@@ -283,15 +259,14 @@
283
  "user_login" => $user->user_login,
284
  "sitename" => get_option("blogname"),
285
  "siteemail" => pmpro_getOption("from_email"),
286
- "membership_id" => $user->membership_level->id,
287
  "membership_level_name" => $user->membership_level->name,
288
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
289
- "login_link" => wp_login_url(pmpro_url("account")),
290
  "display_name" => $user->display_name,
291
  "user_email" => $user->user_email,0
292
  );
293
 
294
- if(!empty($invoice) && !pmpro_isLevelFree($user->membership_level))
295
  {
296
  if($invoice->gateway == "paypalexpress")
297
  $this->template = "checkout_express_admin";
@@ -315,17 +290,9 @@
315
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
316
  $this->data["expirationmonth"] = $invoice->expirationmonth;
317
  $this->data["expirationyear"] = $invoice->expirationyear;
318
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
319
- $invoice->billing->street,
320
- "", //address 2
321
- $invoice->billing->city,
322
- $invoice->billing->state,
323
- $invoice->billing->zip,
324
- $invoice->billing->country,
325
- $invoice->billing->phone);
326
 
327
  if($invoice->getDiscountCode())
328
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $invoice->discount_code->code . "</p>\n";
329
  else
330
  $this->data["discount_code"] = "";
331
  }
@@ -334,7 +301,7 @@
334
  $this->template = "checkout_free_admin";
335
  global $discount_code;
336
  if(!empty($discount_code))
337
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $discount_code . "</p>\n";
338
  else
339
  $this->data["discount_code"] = "";
340
  }
@@ -342,11 +309,11 @@
342
  {
343
  $this->template = "checkout_freetrial_admin";
344
  $this->data["discount_code"] = "";
345
- }
346
 
347
  $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
348
  if($enddate)
349
- $this->data["membership_expiration"] = "<p>" . sprintf(__("This membership will expire on %s.", "pmpro"), date(get_option('date_format'), $enddate)) . "</p>\n";
350
  else
351
  $this->data["membership_expiration"] = "";
352
 
@@ -363,7 +330,7 @@
363
  return false;
364
 
365
  $this->email = $user->user_email;
366
- $this->subject = sprintf(__("Your billing information has been udpated at %s", "pmpro"), get_option("blogname"));
367
  $this->template = "billing";
368
 
369
  $this->data = array(
@@ -372,7 +339,6 @@
372
  "user_login" => $user->user_login,
373
  "sitename" => get_option("blogname"),
374
  "siteemail" => pmpro_getOption("from_email"),
375
- "membership_id" => $user->membership_level->id,
376
  "membership_level_name" => $user->membership_level->name,
377
  "display_name" => $user->display_name,
378
  "user_email" => $user->user_email,
@@ -387,16 +353,8 @@
387
  "accountnumber" => hideCardNumber($invoice->accountnumber),
388
  "expirationmonth" => $invoice->expirationmonth,
389
  "expirationyear" => $invoice->expirationyear,
390
- "login_link" => wp_login_url(pmpro_url("account"))
391
  );
392
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
393
- $invoice->billing->street,
394
- "", //address 2
395
- $invoice->billing->city,
396
- $invoice->billing->state,
397
- $invoice->billing->zip,
398
- $invoice->billing->country,
399
- $invoice->billing->phone);
400
 
401
  return $this->sendEmail();
402
  }
@@ -416,7 +374,7 @@
416
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
417
 
418
  $this->email = get_bloginfo("admin_email");
419
- $this->subject = sprintf(__("Billing information has been udpated for %s at %s", "pmpro"), $user->user_login, get_option("blogname"));
420
  $this->template = "billing_admin";
421
 
422
  $this->data = array(
@@ -425,7 +383,6 @@
425
  "user_login" => $user->user_login,
426
  "sitename" => get_option("blogname"),
427
  "siteemail" => pmpro_getOption("from_email"),
428
- "membership_id" => $user->membership_level->id,
429
  "membership_level_name" => $user->membership_level->name,
430
  "display_name" => $user->display_name,
431
  "user_email" => $user->user_email,
@@ -442,14 +399,6 @@
442
  "expirationyear" => $invoice->expirationyear,
443
  "login_link" => wp_login_url()
444
  );
445
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
446
- $invoice->billing->street,
447
- "", //address 2
448
- $invoice->billing->city,
449
- $invoice->billing->state,
450
- $invoice->billing->zip,
451
- $invoice->billing->country,
452
- $invoice->billing->phone);
453
 
454
  return $this->sendEmail();
455
  }
@@ -464,7 +413,7 @@
464
  return false;
465
 
466
  $this->email = $user->user_email;
467
- $this->subject = sprintf(__("Membership Payment Failed at %s", "pmpro"), get_option("blogname"));
468
  $this->template = "billing_failure";
469
 
470
  $this->data = array(
@@ -473,7 +422,6 @@
473
  "user_login" => $user->user_login,
474
  "sitename" => get_option("blogname"),
475
  "siteemail" => pmpro_getOption("from_email"),
476
- "membership_id" => $user->membership_level->id,
477
  "membership_level_name" => $user->membership_level->name,
478
  "display_name" => $user->display_name,
479
  "user_email" => $user->user_email,
@@ -488,19 +436,11 @@
488
  "accountnumber" => hideCardNumber($invoice->accountnumber),
489
  "expirationmonth" => $invoice->expirationmonth,
490
  "expirationyear" => $invoice->expirationyear,
491
- "login_link" => wp_login_url(pmpro_url("billing"))
492
  );
493
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
494
- $invoice->billing->street,
495
- "", //address 2
496
- $invoice->billing->city,
497
- $invoice->billing->state,
498
- $invoice->billing->zip,
499
- $invoice->billing->country,
500
- $invoice->billing->phone);
501
 
502
  return $this->sendEmail();
503
- }
504
 
505
  function sendBillingFailureAdminEmail($email, $invoice = NULL)
506
  {
@@ -510,7 +450,7 @@
510
  $user = get_userdata($invoice->user_id);
511
 
512
  $this->email = $email;
513
- $this->subject = sprintf(__("Membership Payment Failed For %s at %s", "pmpro"), $user->display_name, get_option("blogname"));
514
  $this->template = "billing_failure_admin";
515
 
516
  $this->data = array(
@@ -519,7 +459,6 @@
519
  "user_login" => $user->user_login,
520
  "sitename" => get_option("blogname"),
521
  "siteemail" => pmpro_getOption("from_email"),
522
- "membership_id" => $user->membership_level->id,
523
  "membership_level_name" => $user->membership_level->name,
524
  "display_name" => $user->display_name,
525
  "user_email" => $user->user_email,
@@ -534,63 +473,8 @@
534
  "accountnumber" => hideCardNumber($invoice->accountnumber),
535
  "expirationmonth" => $invoice->expirationmonth,
536
  "expirationyear" => $invoice->expirationyear,
537
- "login_link" => wp_login_url(pmpro_url("billing"))
538
  );
539
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
540
- $invoice->billing->street,
541
- "", //address 2
542
- $invoice->billing->city,
543
- $invoice->billing->state,
544
- $invoice->billing->zip,
545
- $invoice->billing->country,
546
- $invoice->billing->phone);
547
- return $this->sendEmail();
548
- }
549
-
550
- function sendCreditCardExpiringEmail($user = NULL, $invoice = NULL)
551
- {
552
- global $current_user;
553
- if(!$user)
554
- $user = $current_user;
555
-
556
- if(!$user || !$invoice)
557
- return false;
558
-
559
- $this->email = $user->user_email;
560
- $this->subject = sprintf(__("Credit Card on File Expiring Soon at %s", "pmpro"), get_option("blogname"));
561
- $this->template = "credit_card_expiring";
562
-
563
- $this->data = array(
564
- "subject" => $this->subject,
565
- "name" => $user->display_name,
566
- "user_login" => $user->user_login,
567
- "sitename" => get_option("blogname"),
568
- "siteemail" => pmpro_getOption("from_email"),
569
- "membership_id" => $user->membership_level->id,
570
- "membership_level_name" => $user->membership_level->name,
571
- "display_name" => $user->display_name,
572
- "user_email" => $user->user_email,
573
- "billing_name" => $invoice->billing->name,
574
- "billing_street" => $invoice->billing->street,
575
- "billing_city" => $invoice->billing->city,
576
- "billing_state" => $invoice->billing->state,
577
- "billing_zip" => $invoice->billing->zip,
578
- "billing_country" => $invoice->billing->country,
579
- "billing_phone" => $invoice->billing->phone,
580
- "cardtype" => $invoice->cardtype,
581
- "accountnumber" => hideCardNumber($invoice->accountnumber),
582
- "expirationmonth" => $invoice->expirationmonth,
583
- "expirationyear" => $invoice->expirationyear,
584
- "login_link" => wp_login_url(pmpro_url("billing"))
585
- );
586
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
587
- $invoice->billing->street,
588
- "", //address 2
589
- $invoice->billing->city,
590
- $invoice->billing->state,
591
- $invoice->billing->zip,
592
- $invoice->billing->country,
593
- $invoice->billing->phone);
594
 
595
  return $this->sendEmail();
596
  }
@@ -605,7 +489,7 @@
605
  return false;
606
 
607
  $this->email = $user->user_email;
608
- $this->subject = sprintf(__("INVOICE for %s membership", "pmpro"), get_option("blogname"));
609
  $this->template = "invoice";
610
 
611
  $this->data = array(
@@ -614,11 +498,10 @@
614
  "user_login" => $user->user_login,
615
  "sitename" => get_option("blogname"),
616
  "siteemail" => pmpro_getOption("from_email"),
617
- "membership_id" => $user->membership_level->id,
618
  "membership_level_name" => $user->membership_level->name,
619
  "display_name" => $user->display_name,
620
  "user_email" => $user->user_email,
621
- "invoice_id" => $invoice->code,
622
  "invoice_total" => $pmpro_currency_symbol . number_format($invoice->total, 2),
623
  "invoice_date" => date(get_option('date_format'), $invoice->timestamp),
624
  "billing_name" => $invoice->billing->name,
@@ -632,26 +515,18 @@
632
  "accountnumber" => hideCardNumber($invoice->accountnumber),
633
  "expirationmonth" => $invoice->expirationmonth,
634
  "expirationyear" => $invoice->expirationyear,
635
- "login_link" => wp_login_url(pmpro_url("account")),
636
- "invoice_link" => wp_login_url(pmpro_url("invoice", "?invoice=" . $invoice->code)
637
- ));
638
- $this->data["billing_address"] = pmpro_formatAddress($invoice->billing->name,
639
- $invoice->billing->street,
640
- "", //address 2
641
- $invoice->billing->city,
642
- $invoice->billing->state,
643
- $invoice->billing->zip,
644
- $invoice->billing->country,
645
- $invoice->billing->phone);
646
 
647
  if($invoice->getDiscountCode())
648
- $this->data["discount_code"] = "<p>" . __("Discount Code", "pmpro") . ": " . $invoice->discount_code . "</p>\n";
649
  else
650
  $this->data["discount_code"] = "";
651
 
652
  $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
653
  if($enddate)
654
- $this->data["membership_expiration"] = "<p>" . sprintf(__("This membership will expire on %s.", "pmpro"), date(get_option('date_format'), $enddate)) . "</p>\n";
655
  else
656
  $this->data["membership_expiration"] = "";
657
 
@@ -676,16 +551,15 @@
676
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
677
 
678
  $this->email = $user->user_email;
679
- $this->subject = sprintf(__("Your trial at %s is ending soon", "pmpro"), get_option("blogname"));
680
  $this->template = "trial_ending";
681
  $this->data = array(
682
  "subject" => $this->subject,
683
  "name" => $user->display_name,
684
  "user_login" => $user->user_login,
685
  "sitename" => get_option("blogname"),
686
- "membership_id" => $user->membership_level->id,
687
  "membership_level_name" => $user->membership_level->name,
688
- "siteemail" => pmpro_getOption("from_email"),
689
  "login_link" => wp_login_url(),
690
  "display_name" => $user->display_name,
691
  "user_email" => $user->user_email,
@@ -694,7 +568,7 @@
694
  "cycle_period" => $user->membership_level->cycle_period,
695
  "trial_amount" => $pmpro_currency_symbol . $user->membership_level->trial_amount,
696
  "trial_limit" => $user->membership_level->trial_limit,
697
- "trial_end" => date(get_option('date_format'), strtotime(date("m/d/Y", $user->membership_level->startdate) . " + " . $user->membership_level->trial_limit . " " . $user->membership_level->cycle_period), current_time("timestamp"))
698
  );
699
 
700
  return $this->sendEmail();
@@ -710,9 +584,9 @@
710
  return false;
711
 
712
  $this->email = $user->user_email;
713
- $this->subject = sprintf(__("Your membership at %s has ended", "pmpro"), get_option("blogname"));
714
  $this->template = "membership_expired";
715
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url(), "display_name" => $user->display_name, "user_email" => $user->user_email, "levels_link" => pmpro_url("levels"));
716
 
717
  return $this->sendEmail();
718
  }
@@ -735,9 +609,9 @@
735
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
736
 
737
  $this->email = $user->user_email;
738
- $this->subject = sprintf(__("Your membership at %s will end soon", "pmpro"), get_option("blogname"));
739
  $this->template = "membership_expiring";
740
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_id" => $user->membership_level->id, "membership_level_name" => $user->membership_level->name, "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url(), "enddate" => date(get_option('date_format'), $user->membership_level->enddate), "display_name" => $user->display_name, "user_email" => $user->user_email);
741
 
742
  return $this->sendEmail();
743
  }
@@ -755,21 +629,21 @@
755
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
756
 
757
  $this->email = $user->user_email;
758
- $this->subject = sprintf(__("Your membership at %s has been changed", "pmpro"), get_option("blogname"));
759
  $this->template = "admin_change";
760
- $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_id" => $user->membership_level->id, "membership_level_name" => $user->membership_level->name, "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url());
761
  if($user->membership_level->ID)
762
- $this->data["membership_change"] = sprintf(__("The new level is %s.", "pmpro"), $user->membership_level->name);
763
  else
764
- $this->data["membership_change"] = __("Your membership has been cancelled", "pmpro");
765
 
766
  if(!empty($user->membership_level->enddate))
767
  {
768
- $this->data["membership_change"] .= ". " . sprintf(__("This membership will expire on %s", "pmpro"), date(get_option('date_format'), $user->membership_level->enddate));
769
  }
770
  elseif(!empty($this->expiration_changed))
771
  {
772
- $this->data["membership_change"] .= ". " . __("This membership does not expire", "pmpro");
773
  }
774
 
775
  return $this->sendEmail();
@@ -793,21 +667,21 @@
793
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
794
 
795
  $this->email = get_bloginfo("admin_email");
796
- $this->subject = sprintf(__("Membership for %s at %s has been changed", "pmpro"), $user->user_login, get_option("blogname"));
797
  $this->template = "admin_change_admin";
798
  $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
799
  if($user->membership_level->ID)
800
- $this->data["membership_change"] = sprintf(__("The new level is %s. This membership is free", "pmpro"), $user->membership_level->name);
801
  else
802
- $this->data["membership_change"] = __("Membership has been cancelled", "pmpro");
803
 
804
  if(!empty($user->membership_level->enddate))
805
  {
806
- $this->data["membership_change"] .= ". " . sprintf(__("This membership will expire on %s", "pmpro"), date(get_option('date_format'), $user->membership_level->enddate));
807
  }
808
  elseif(!empty($this->expiration_changed))
809
  {
810
- $this->data["membership_change"] .= ". " . __("This membership does not expire", "pmpro");
811
  }
812
 
813
  return $this->sendEmail();
34
  $this->fromname = pmpro_getOption("from_name");
35
 
36
  if(!$this->subject)
37
+ $this->subject = "An Email From " . get_option("blogname");
38
 
39
  //decode the subject line in case there are apostrophes/etc in it
40
  $this->subject = html_entity_decode($this->subject, ENT_QUOTES, 'UTF-8');
44
 
45
  $this->headers = array("Content-Type: text/html");
46
 
 
 
47
  //load the template
 
48
  if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/email/" . $this->template . ".html"))
49
+ $this->body = file_get_contents(get_stylesheet_directory() . "/paid-memberships-pro/email/" . $this->template . ".html");
50
  elseif(file_exists(get_stylesheet_directory() . "/membership-email-" . $this->template . ".html"))
51
+ $this->body = file_get_contents(get_stylesheet_directory() . "/membership-email-" . $this->template . ".html");
52
  elseif(file_exists(TEMPLATEPATH . "/membership-email-" . $this->template . ".html"))
53
+ $this->body = file_get_contents(TEMPLATEPATH . "/membership-email-" . $this->template . ".html");
 
 
 
 
54
  elseif(file_exists(PMPRO_DIR . "/email/" . $this->template . ".html"))
55
+ $this->body = file_get_contents(PMPRO_DIR . "/email/" . $this->template . ".html");
56
+
 
 
57
  //header and footer
58
  /* This is handled for all emails via the pmpro_send_html function in paid-memberships-pro now
59
  if(file_exists(TEMPLATEPATH . "/email_header.html"))
91
  $this->template = apply_filters("pmpro_email_template", $temail->template, $this);
92
  $this->body = apply_filters("pmpro_email_body", $temail->body, $this);
93
  $this->headers = apply_filters("pmpro_email_headers", $temail->headers, $this);
 
94
 
95
+ if(wp_mail($this->email,$this->subject,$this->body,$this->headers))
96
  {
97
  return true;
98
  }
112
  return false;
113
 
114
  $this->email = $user->user_email;
115
+ $this->subject = "Your membership at " . get_option("blogname") . " has been CANCELED";
116
  $this->template = "cancel";
117
  $this->data = array("name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"));
118
 
134
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
135
 
136
  $this->email = get_bloginfo("admin_email");
137
+ $this->subject = "Membership for " . $user->user_login . " at " . get_option("blogname") . " has been CANCELED";
138
  $this->template = "cancel_admin";
139
  $this->data = array("user_login" => $user->user_login, "user_email" => $user->user_email, "display_name" => $user->display_name, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url());
 
140
  $this->data['membership_level_name'] = $wpdb->get_var("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id = '" . $old_level_id . "' LIMIT 1");
141
 
142
  //start and end date
164
  return false;
165
 
166
  $this->email = $user->user_email;
167
+ $this->subject = "Your membership confirmation for " . get_option("blogname");
168
 
169
  $this->data = array(
170
  "subject" => $this->subject,
172
  "user_login" => $user->user_login,
173
  "sitename" => get_option("blogname"),
174
  "siteemail" => pmpro_getOption("from_email"),
 
175
  "membership_level_name" => $user->membership_level->name,
176
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
177
+ "login_link" => pmpro_url("account"),
178
  "display_name" => $user->display_name,
179
  "user_email" => $user->user_email,0
180
  );
181
+
182
+ if($invoice)
183
  {
184
  if($invoice->gateway == "paypalexpress")
185
  $this->template = "checkout_express";
206
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
207
  $this->data["expirationmonth"] = $invoice->expirationmonth;
208
  $this->data["expirationyear"] = $invoice->expirationyear;
 
 
 
 
 
 
 
 
209
 
210
  if($invoice->getDiscountCode())
211
+ $this->data["discount_code"] = "<p>Discount Code: " . $invoice->discount_code->code . "</p>\n";
212
  else
213
  $this->data["discount_code"] = "";
214
  }
217
  $this->template = "checkout_free";
218
  global $discount_code;
219
  if(!empty($discount_code))
220
+ $this->data["discount_code"] = "<p>Discount Code: " . $discount_code . "</p>\n";
221
  else
222
  $this->data["discount_code"] = "";
223
  }
224
  else
225
  {
226
  $this->template = "checkout_freetrial";
227
+ $this->data["discount_code"] = "";
 
 
 
 
228
  }
229
 
230
  $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
231
  if($enddate)
232
+ $this->data["membership_expiration"] = "<p>This membership will expire on " . date(get_option('date_format'), $enddate) . ".</p>\n";
233
  else
234
  $this->data["membership_expiration"] = "";
235
 
251
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
252
 
253
  $this->email = get_bloginfo("admin_email");
254
+ $this->subject = "Member Checkout for " . $user->membership_level->name . " at " . get_option("blogname");
255
 
256
  $this->data = array(
257
  "subject" => $this->subject,
259
  "user_login" => $user->user_login,
260
  "sitename" => get_option("blogname"),
261
  "siteemail" => pmpro_getOption("from_email"),
 
262
  "membership_level_name" => $user->membership_level->name,
263
  "membership_cost" => pmpro_getLevelCost($user->membership_level),
264
+ "login_link" => pmpro_url("account"),
265
  "display_name" => $user->display_name,
266
  "user_email" => $user->user_email,0
267
  );
268
 
269
+ if($invoice)
270
  {
271
  if($invoice->gateway == "paypalexpress")
272
  $this->template = "checkout_express_admin";
290
  $this->data["accountnumber"] = hideCardNumber($invoice->accountnumber);
291
  $this->data["expirationmonth"] = $invoice->expirationmonth;
292
  $this->data["expirationyear"] = $invoice->expirationyear;
 
 
 
 
 
 
 
 
293
 
294
  if($invoice->getDiscountCode())
295
+ $this->data["discount_code"] = "<p>Discount Code: " . $invoice->discount_code->code . "</p>\n";
296
  else
297
  $this->data["discount_code"] = "";
298
  }
301
  $this->template = "checkout_free_admin";
302
  global $discount_code;
303
  if(!empty($discount_code))
304
+ $this->data["discount_code"] = "<p>Discount Code: " . $discount_code . "</p>\n";
305
  else
306
  $this->data["discount_code"] = "";
307
  }
309
  {
310
  $this->template = "checkout_freetrial_admin";
311
  $this->data["discount_code"] = "";
312
+ }
313
 
314
  $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
315
  if($enddate)
316
+ $this->data["membership_expiration"] = "<p>This membership will expire on " . date(get_option('date_format'), $enddate) . ".</p>\n";
317
  else
318
  $this->data["membership_expiration"] = "";
319
 
330
  return false;
331
 
332
  $this->email = $user->user_email;
333
+ $this->subject = "Your billing information has been udpated at " . get_option("blogname");
334
  $this->template = "billing";
335
 
336
  $this->data = array(
339
  "user_login" => $user->user_login,
340
  "sitename" => get_option("blogname"),
341
  "siteemail" => pmpro_getOption("from_email"),
 
342
  "membership_level_name" => $user->membership_level->name,
343
  "display_name" => $user->display_name,
344
  "user_email" => $user->user_email,
353
  "accountnumber" => hideCardNumber($invoice->accountnumber),
354
  "expirationmonth" => $invoice->expirationmonth,
355
  "expirationyear" => $invoice->expirationyear,
356
+ "login_link" => pmpro_url("account")
357
  );
 
 
 
 
 
 
 
 
358
 
359
  return $this->sendEmail();
360
  }
374
  return true; //didn't send, but we also don't want to indicate failure because the settings say to not send
375
 
376
  $this->email = get_bloginfo("admin_email");
377
+ $this->subject = "Billing information has been udpated for " . $user->user_login . " at " . get_option("blogname");
378
  $this->template = "billing_admin";
379
 
380
  $this->data = array(
383
  "user_login" => $user->user_login,
384
  "sitename" => get_option("blogname"),
385
  "siteemail" => pmpro_getOption("from_email"),
 
386
  "membership_level_name" => $user->membership_level->name,
387
  "display_name" => $user->display_name,
388
  "user_email" => $user->user_email,
399
  "expirationyear" => $invoice->expirationyear,
400
  "login_link" => wp_login_url()
401
  );
 
 
 
 
 
 
 
 
402
 
403
  return $this->sendEmail();
404
  }
413
  return false;
414
 
415
  $this->email = $user->user_email;
416
+ $this->subject = "Membership Payment Failed at " . get_option("blogname");
417
  $this->template = "billing_failure";
418
 
419
  $this->data = array(
422
  "user_login" => $user->user_login,
423
  "sitename" => get_option("blogname"),
424
  "siteemail" => pmpro_getOption("from_email"),
 
425
  "membership_level_name" => $user->membership_level->name,
426
  "display_name" => $user->display_name,
427
  "user_email" => $user->user_email,
436
  "accountnumber" => hideCardNumber($invoice->accountnumber),
437
  "expirationmonth" => $invoice->expirationmonth,
438
  "expirationyear" => $invoice->expirationyear,
439
+ "login_link" => pmpro_url("billing")
440
  );
 
 
 
 
 
 
 
 
441
 
442
  return $this->sendEmail();
443
+ }
444
 
445
  function sendBillingFailureAdminEmail($email, $invoice = NULL)
446
  {
450
  $user = get_userdata($invoice->user_id);
451
 
452
  $this->email = $email;
453
+ $this->subject = "Membership Payment Failed For " . $user->display_name . " at " . get_option("blogname");
454
  $this->template = "billing_failure_admin";
455
 
456
  $this->data = array(
459
  "user_login" => $user->user_login,
460
  "sitename" => get_option("blogname"),
461
  "siteemail" => pmpro_getOption("from_email"),
 
462
  "membership_level_name" => $user->membership_level->name,
463
  "display_name" => $user->display_name,
464
  "user_email" => $user->user_email,
473
  "accountnumber" => hideCardNumber($invoice->accountnumber),
474
  "expirationmonth" => $invoice->expirationmonth,
475
  "expirationyear" => $invoice->expirationyear,
476
+ "login_link" => pmpro_url("billing")
477
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
 
479
  return $this->sendEmail();
480
  }
489
  return false;
490
 
491
  $this->email = $user->user_email;
492
+ $this->subject = "INVOICE for " . get_option("blogname") . " membership";
493
  $this->template = "invoice";
494
 
495
  $this->data = array(
498
  "user_login" => $user->user_login,
499
  "sitename" => get_option("blogname"),
500
  "siteemail" => pmpro_getOption("from_email"),
 
501
  "membership_level_name" => $user->membership_level->name,
502
  "display_name" => $user->display_name,
503
  "user_email" => $user->user_email,
504
+ "invoice_id" => $invoice->payment_transaction_id,
505
  "invoice_total" => $pmpro_currency_symbol . number_format($invoice->total, 2),
506
  "invoice_date" => date(get_option('date_format'), $invoice->timestamp),
507
  "billing_name" => $invoice->billing->name,
515
  "accountnumber" => hideCardNumber($invoice->accountnumber),
516
  "expirationmonth" => $invoice->expirationmonth,
517
  "expirationyear" => $invoice->expirationyear,
518
+ "login_link" => pmpro_url("account"),
519
+ "invoice_link" => pmpro_url("invoice", "?invoice=" . $invoice->code)
520
+ );
 
 
 
 
 
 
 
 
521
 
522
  if($invoice->getDiscountCode())
523
+ $this->data["discount_code"] = "<p>Discount Code: " . $invoice->discount_code . "</p>\n";
524
  else
525
  $this->data["discount_code"] = "";
526
 
527
  $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(enddate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND status = 'active' LIMIT 1");
528
  if($enddate)
529
+ $this->data["membership_expiration"] = "<p>This membership will expire on " . date(get_option('date_format'), $enddate) . ".</p>\n";
530
  else
531
  $this->data["membership_expiration"] = "";
532
 
551
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
552
 
553
  $this->email = $user->user_email;
554
+ $this->subject = "Your trial membership at " . get_option("blogname") . " is ending soon";
555
  $this->template = "trial_ending";
556
  $this->data = array(
557
  "subject" => $this->subject,
558
  "name" => $user->display_name,
559
  "user_login" => $user->user_login,
560
  "sitename" => get_option("blogname"),
 
561
  "membership_level_name" => $user->membership_level->name,
562
+ "siteemail" => get_bloginfo("admin_email"),
563
  "login_link" => wp_login_url(),
564
  "display_name" => $user->display_name,
565
  "user_email" => $user->user_email,
568
  "cycle_period" => $user->membership_level->cycle_period,
569
  "trial_amount" => $pmpro_currency_symbol . $user->membership_level->trial_amount,
570
  "trial_limit" => $user->membership_level->trial_limit,
571
+ "trial_end" => date(get_option('date_format'), strtotime(date("m/d/Y", $user->membership_level->startdate) . " + " . $user->membership_level->trial_limit . " " . $user->membership_level->cycle_period))
572
  );
573
 
574
  return $this->sendEmail();
584
  return false;
585
 
586
  $this->email = $user->user_email;
587
+ $this->subject = "Your membership at " . get_option("blogname") . " has ended";
588
  $this->template = "membership_expired";
589
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url(), "display_name" => $user->display_name, "user_email" => $user->user_email, "levels_link" => pmpro_url("levels"));
590
 
591
  return $this->sendEmail();
592
  }
609
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
610
 
611
  $this->email = $user->user_email;
612
+ $this->subject = "Your membership at " . get_option("blogname") . " will end soon";
613
  $this->template = "membership_expiring";
614
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url(), "enddate" => date(get_option('date_format'), $user->membership_level->enddate), "display_name" => $user->display_name, "user_email" => $user->user_email);
615
 
616
  return $this->sendEmail();
617
  }
629
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
630
 
631
  $this->email = $user->user_email;
632
+ $this->subject = "Your membership at " . get_option("blogname") . " has been changed";
633
  $this->template = "admin_change";
634
+ $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
635
  if($user->membership_level->ID)
636
+ $this->data["membership_change"] = "new level is " . $user->membership_level->name . ". This membership is free";
637
  else
638
+ $this->data["membership_change"] = "membership has been canceled";
639
 
640
  if(!empty($user->membership_level->enddate))
641
  {
642
+ $this->data["membership_change"] .= ". Your membership will expire on " . date(get_option('date_format'), $user->membership_level->enddate);
643
  }
644
  elseif(!empty($this->expiration_changed))
645
  {
646
+ $this->data["membership_change"] .= ". Your membership does not expire";
647
  }
648
 
649
  return $this->sendEmail();
667
  $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
668
 
669
  $this->email = get_bloginfo("admin_email");
670
+ $this->subject = "Membership for " . $user->user_login . " at " . get_option("blogname") . " has been changed";
671
  $this->template = "admin_change_admin";
672
  $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
673
  if($user->membership_level->ID)
674
+ $this->data["membership_change"] = "The new level is " . $user->membership_level->name . ". This membership is free";
675
  else
676
+ $this->data["membership_change"] = "membership has been canceled";
677
 
678
  if(!empty($user->membership_level->enddate))
679
  {
680
+ $this->data["membership_change"] .= ". This membership will expire on " . date(get_option('date_format'), $user->membership_level->enddate);
681
  }
682
  elseif(!empty($this->expiration_changed))
683
  {
684
+ $this->data["membership_change"] .= ". This membership does not expire";
685
  }
686
 
687
  return $this->sendEmail();
classes/gateways/class.pmprogateway.php CHANGED
@@ -43,7 +43,7 @@
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -52,7 +52,7 @@
52
  else
53
  {
54
  if(empty($order->error))
55
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
56
  return false;
57
  }
58
  }
@@ -90,7 +90,7 @@
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -103,14 +103,14 @@
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
- $order->error = __("Unknown error: Payment failed.", "pmpro");
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
- $order->error = __("Unknown error: Payment failed.", "pmpro");
112
 
113
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
114
  }
115
 
116
  return false;
@@ -126,7 +126,7 @@
126
  else
127
  {
128
  if(empty($order->error))
129
- $order->error = __("Unknown error: Payment failed.", "pmpro");
130
 
131
  return false;
132
  }
@@ -174,9 +174,6 @@
174
  //create a code for the order
175
  if(empty($order->code))
176
  $order->code = $order->getRandomCode();
177
-
178
- //filter order before subscription. use with care.
179
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
180
 
181
  //simulate a successful subscription processing
182
  $order->status = "success";
@@ -200,21 +197,5 @@
200
  $order->updateStatus("cancelled");
201
  return true;
202
  }
203
-
204
- function getSubscriptionStatus(&$order)
205
- {
206
- //require a subscription id
207
- if(empty($order->subscription_transaction_id))
208
- return false;
209
-
210
- //this looks different for each gateway, but generally an array of some sort
211
- return array();
212
- }
213
-
214
- function getTransactionStatus(&$order)
215
- {
216
- //this looks different for each gateway, but generally an array of some sort
217
- return array();
218
- }
219
  }
220
  ?>
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
52
  else
53
  {
54
  if(empty($order->error))
55
+ $order->error = "Unknown error: Authorization failed.";
56
  return false;
57
  }
58
  }
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod)) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
+ $order->error = "Unknown error: Payment failed.";
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
+ $order->error = "Unknown error: Payment failed.";
112
 
113
+ $order->error .= " A partial payment was made that we could not void. Please contact the site owner immediately to correct this.";
114
  }
115
 
116
  return false;
126
  else
127
  {
128
  if(empty($order->error))
129
+ $order->error = "Unknown error: Payment failed.";
130
 
131
  return false;
132
  }
174
  //create a code for the order
175
  if(empty($order->code))
176
  $order->code = $order->getRandomCode();
 
 
 
177
 
178
  //simulate a successful subscription processing
179
  $order->status = "success";
197
  $order->updateStatus("cancelled");
198
  return true;
199
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  }
201
  ?>
classes/gateways/class.pmprogateway_authorizenet.php CHANGED
@@ -43,7 +43,7 @@
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -52,7 +52,7 @@
52
  else
53
  {
54
  if(empty($order->error))
55
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
56
  return false;
57
  }
58
  }
@@ -90,7 +90,7 @@
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -103,13 +103,14 @@
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
- $order->error = __("Unknown error: Payment failed.", "pmpro");
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
- $order->error = __("Unknown error: Payment failed.", "pmpro");
112
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
 
113
  }
114
 
115
  return false;
@@ -125,7 +126,7 @@
125
  else
126
  {
127
  if(empty($order->error))
128
- $order->error = __("Unknown error: Payment failed.", "pmpro");
129
 
130
  return false;
131
  }
@@ -184,7 +185,7 @@
184
  "x_exp_date" => $order->ExpirationDate,
185
 
186
  "x_amount" => $amount,
187
- "x_description" => $order->membership_level->name . " " . __("Membership", "pmpro"),
188
 
189
  "x_first_name" => $order->FirstName,
190
  "x_last_name" => $order->LastName,
@@ -434,9 +435,6 @@
434
  if(empty($order->code))
435
  $order->code = $order->getRandomCode();
436
 
437
- //filter order before subscription. use with care.
438
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
439
-
440
  if(!empty($order->gateway_environment))
441
  $gateway_environment = $order->gateway_environment;
442
  if(empty($gateway_environment))
@@ -490,7 +488,8 @@
490
  //taxes
491
  $amount_tax = $order->getTaxForPrice($amount);
492
  $trial_tax = $order->getTaxForPrice($trialAmount);
493
-
 
494
  $amount = round((float)$amount + (float)$amount_tax, 2);
495
  $trialAmount = round((float)$trialAmount + (float)$trial_tax, 2);
496
 
@@ -784,8 +783,8 @@
784
  else
785
  {
786
  $order->status = "error";
787
- $order->error = __("Could not connect to Authorize.net", "pmpro");
788
- $order->shorterror = __("Could not connect to Authorize.net", "pmpro");
789
  return false;
790
  }
791
  }
43
  else
44
  {
45
  //add a period to the start date to account for the initial payment
46
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
47
  }
48
 
49
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
52
  else
53
  {
54
  if(empty($order->error))
55
+ $order->error = "Unknown error: Authorization failed.";
56
  return false;
57
  }
58
  }
90
  else
91
  {
92
  //add a period to the start date to account for the initial payment
93
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
94
  }
95
 
96
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
103
  if($this->void($order))
104
  {
105
  if(!$order->error)
106
+ $order->error = "Unknown error: Payment failed.";
107
  }
108
  else
109
  {
110
  if(!$order->error)
111
+ $order->error = "Unknown error: Payment failed.";
112
+
113
+ $order->error .= " A partial payment was made that we could not void. Please contact the site owner immediately to correct this.";
114
  }
115
 
116
  return false;
126
  else
127
  {
128
  if(empty($order->error))
129
+ $order->error = "Unknown error: Payment failed.";
130
 
131
  return false;
132
  }
185
  "x_exp_date" => $order->ExpirationDate,
186
 
187
  "x_amount" => $amount,
188
+ "x_description" => $order->membership_level->name . " Membership",
189
 
190
  "x_first_name" => $order->FirstName,
191
  "x_last_name" => $order->LastName,
435
  if(empty($order->code))
436
  $order->code = $order->getRandomCode();
437
 
 
 
 
438
  if(!empty($order->gateway_environment))
439
  $gateway_environment = $order->gateway_environment;
440
  if(empty($gateway_environment))
488
  //taxes
489
  $amount_tax = $order->getTaxForPrice($amount);
490
  $trial_tax = $order->getTaxForPrice($trialAmount);
491
+
492
+ $order->subtotal = $amount;
493
  $amount = round((float)$amount + (float)$amount_tax, 2);
494
  $trialAmount = round((float)$trialAmount + (float)$trial_tax, 2);
495
 
783
  else
784
  {
785
  $order->status = "error";
786
+ $order->error = "Could not connect to Authorize.net";
787
+ $order->shorterror = "Could not connect to Authorize.net";
788
  return false;
789
  }
790
  }
classes/gateways/class.pmprogateway_braintree.php CHANGED
@@ -23,7 +23,7 @@
23
  }
24
 
25
  function process(&$order)
26
- {
27
  //check for initial payment
28
  if(floatval($order->InitialPayment) == 0)
29
  {
@@ -58,7 +58,7 @@
58
  else
59
  {
60
  if(empty($order->error))
61
- $order->error = __("Unknown error: Initial payment failed.", "pmpro");
62
  return false;
63
  }
64
  }
@@ -117,7 +117,7 @@
117
  else
118
  {
119
  $order->errorcode = true;
120
- $order->error = __("Error during settlement:", "pmpro") . " " . $response->message;
121
  $order->shorterror = $response->message;
122
  return false;
123
  }
@@ -126,7 +126,7 @@
126
  {
127
  //$order->status = "error";
128
  $order->errorcode = true;
129
- $order->error = __("Error during charge:", "pmpro") . " " . $response->message;
130
  $order->shorterror = $response->message;
131
  return false;
132
  }
@@ -183,19 +183,19 @@
183
  'expirationDate' => $order->braintree->expiration_date,
184
  'cardholderName' => trim($order->FirstName . " " . $order->LastName),
185
  'options' => array(
186
- 'updateExistingToken' => $this->customer->creditCards[0]->token
187
  )
188
  )
189
  )
190
  );
191
-
192
  if($response->success)
193
  {
194
- $this->customer = $response->customer;
195
  }
196
  else
197
  {
198
- $order->error = __("Failed to update customer.", "pmpro") . " " . $response->message;
199
  $order->shorterror = $order->error;
200
  return false;
201
  }
@@ -208,7 +208,7 @@
208
  //assume no customer found
209
  }
210
  }
211
-
212
  //no customer id, create one
213
  if(!empty($order->accountnumber))
214
  {
@@ -243,14 +243,14 @@
243
  }
244
  else
245
  {
246
- $order->error = __("Failed to create customer.", "pmpro") . " " . $result->message;
247
  $order->shorterror = $order->error;
248
  return false;
249
  }
250
  }
251
  catch (Exception $e)
252
  {
253
- $order->error = __("Error creating customer record with Braintree:", "pmpro") . " " . $e->getMessage();
254
  $order->shorterror = $order->error;
255
  return false;
256
  }
@@ -275,7 +275,8 @@
275
 
276
  //figure out the amounts
277
  $amount = $order->PaymentAmount;
278
- $amount_tax = $order->getTaxForPrice($amount);
 
279
  $amount = round((float)$amount + (float)$amount_tax, 2);
280
 
281
  /*
@@ -296,13 +297,13 @@
296
  $trial_period_days = $order->BillingFrequency * 30; //assume monthly
297
 
298
  //convert to a profile start date
299
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
300
 
301
  //filter the start date
302
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
303
 
304
  //convert back to days
305
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d")) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
306
 
307
  //now add the actual trial set by the site
308
  if(!empty($order->TrialBillingCycles))
@@ -341,7 +342,7 @@
341
  }
342
  catch (Exception $e)
343
  {
344
- $order->error = __("Error subscribing customer to plan with Braintree:", "pmpro") . " " . $e->getMessage();
345
  //return error
346
  $order->shorterror = $order->error;
347
  return false;
@@ -356,7 +357,7 @@
356
  }
357
  else
358
  {
359
- $order->error = __("Failed to subscribe with Braintree:", "pmpro") . " " . $result->message;
360
  $order->shorterror = $result->message;
361
  return false;
362
  }
@@ -367,12 +368,12 @@
367
  //we just have to run getCustomer which will look for the customer and update it with the new token
368
  $this->getCustomer($order);
369
 
370
- if(!empty($this->customer) && empty($order->error))
371
  {
372
  return true;
373
  }
374
  else
375
- {
376
  return false; //couldn't find the customer
377
  }
378
  }
@@ -394,7 +395,7 @@
394
  catch(Exception $e)
395
  {
396
  $order->updateStatus("cancelled"); //assume it's been cancelled already
397
- $order->error = __("Could not find the subscription.", "pmpro") . " " . $e->getMessage();
398
  $order->shorterror = $order->error;
399
  return false; //no subscription found
400
  }
@@ -407,16 +408,17 @@
407
  else
408
  {
409
  $order->updateStatus("cancelled"); //assume it's been cancelled already
410
- $order->error = __("Could not find the subscription.", "pmpro") . " " . $result->message;
411
  $order->shorterror = $order->error;
412
  return false; //no subscription found
413
  }
414
  }
415
  else
416
  {
417
- $order->error = __("Could not find the subscription.", "pmpro");
418
  $order->shorterror = $order->error;
419
  return false; //no customer found
420
  }
421
  }
422
  }
 
23
  }
24
 
25
  function process(&$order)
26
+ {
27
  //check for initial payment
28
  if(floatval($order->InitialPayment) == 0)
29
  {
58
  else
59
  {
60
  if(empty($order->error))
61
+ $order->error = "Unknown error: Initial payment failed.";
62
  return false;
63
  }
64
  }
117
  else
118
  {
119
  $order->errorcode = true;
120
+ $order->error = "Error during settlement: " . $response->message;
121
  $order->shorterror = $response->message;
122
  return false;
123
  }
126
  {
127
  //$order->status = "error";
128
  $order->errorcode = true;
129
+ $order->error = "Error during charge: " . $response->message;
130
  $order->shorterror = $response->message;
131
  return false;
132
  }
183
  'expirationDate' => $order->braintree->expiration_date,
184
  'cardholderName' => trim($order->FirstName . " " . $order->LastName),
185
  'options' => array(
186
+ 'updateExistingToken' => $customer_id
187
  )
188
  )
189
  )
190
  );
191
+
192
  if($response->success)
193
  {
194
+ $this->customer = $result->customer;
195
  }
196
  else
197
  {
198
+ $order->error = "Failed to update customer.";
199
  $order->shorterror = $order->error;
200
  return false;
201
  }
208
  //assume no customer found
209
  }
210
  }
211
+
212
  //no customer id, create one
213
  if(!empty($order->accountnumber))
214
  {
243
  }
244
  else
245
  {
246
+ $order->error = "Failed to create customer.";
247
  $order->shorterror = $order->error;
248
  return false;
249
  }
250
  }
251
  catch (Exception $e)
252
  {
253
+ $order->error = "Error creating customer record with Braintree: " . $e->getMessage();
254
  $order->shorterror = $order->error;
255
  return false;
256
  }
275
 
276
  //figure out the amounts
277
  $amount = $order->PaymentAmount;
278
+ $amount_tax = $order->getTaxForPrice($amount);
279
+ $order->subtotal = $amount;
280
  $amount = round((float)$amount + (float)$amount_tax, 2);
281
 
282
  /*
297
  $trial_period_days = $order->BillingFrequency * 30; //assume monthly
298
 
299
  //convert to a profile start date
300
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day")) . "T0:0:0";
301
 
302
  //filter the start date
303
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
304
 
305
  //convert back to days
306
+ $trial_period_days = ceil(abs(strtotime(date("Y-m-d")) - strtotime($order->ProfileStartDate)) / 86400);
307
 
308
  //now add the actual trial set by the site
309
  if(!empty($order->TrialBillingCycles))
342
  }
343
  catch (Exception $e)
344
  {
345
+ $order->error = "Error subscribing customer to plan with B:" . $e->getMessage();
346
  //return error
347
  $order->shorterror = $order->error;
348
  return false;
357
  }
358
  else
359
  {
360
+ $order->error = "Failed to subscribe with Braintree: " . $result->message;
361
  $order->shorterror = $result->message;
362
  return false;
363
  }
368
  //we just have to run getCustomer which will look for the customer and update it with the new token
369
  $this->getCustomer($order);
370
 
371
+ if(!empty($this->customer))
372
  {
373
  return true;
374
  }
375
  else
376
+ {
377
  return false; //couldn't find the customer
378
  }
379
  }
395
  catch(Exception $e)
396
  {
397
  $order->updateStatus("cancelled"); //assume it's been cancelled already
398
+ $order->error = "Could not find the subscription.";
399
  $order->shorterror = $order->error;
400
  return false; //no subscription found
401
  }
408
  else
409
  {
410
  $order->updateStatus("cancelled"); //assume it's been cancelled already
411
+ $order->error = "Could not find the subscription.";
412
  $order->shorterror = $order->error;
413
  return false; //no subscription found
414
  }
415
  }
416
  else
417
  {
418
+ $order->error = "Could not find the subscription.";
419
  $order->shorterror = $order->error;
420
  return false; //no customer found
421
  }
422
  }
423
  }
424
+ ?>
classes/gateways/class.pmprogateway_check.php CHANGED
@@ -48,7 +48,7 @@
48
  else
49
  {
50
  //add a period to the start date to account for the initial payment
51
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
52
  }
53
 
54
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -57,7 +57,7 @@
57
  else
58
  {
59
  if(empty($order->error))
60
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
61
  return false;
62
  }
63
  }
@@ -95,7 +95,7 @@
95
  else
96
  {
97
  //add a period to the start date to account for the initial payment
98
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
99
  }
100
 
101
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
@@ -108,14 +108,14 @@
108
  if($this->void($order))
109
  {
110
  if(!$order->error)
111
- $order->error = __("Unknown error: Payment failed.", "pmpro");
112
  }
113
  else
114
  {
115
  if(!$order->error)
116
- $order->error = __("Unknown error: Payment failed.", "pmpro");
117
 
118
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
119
  }
120
 
121
  return false;
@@ -131,7 +131,7 @@
131
  else
132
  {
133
  if(empty($order->error))
134
- $order->error = __("Unknown error: Payment failed.", "pmpro");
135
 
136
  return false;
137
  }
@@ -179,10 +179,7 @@
179
  //create a code for the order
180
  if(empty($order->code))
181
  $order->code = $order->getRandomCode();
182
-
183
- //filter order before subscription. use with care.
184
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
185
-
186
  //simulate a successful subscription processing
187
  $order->status = "success";
188
  $order->subscription_transaction_id = "CHECK" . $order->code;
@@ -205,4 +202,5 @@
205
  $order->updateStatus("cancelled");
206
  return true;
207
  }
208
- }
 
48
  else
49
  {
50
  //add a period to the start date to account for the initial payment
51
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
52
  }
53
 
54
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
57
  else
58
  {
59
  if(empty($order->error))
60
+ $order->error = "Unknown error: Authorization failed.";
61
  return false;
62
  }
63
  }
95
  else
96
  {
97
  //add a period to the start date to account for the initial payment
98
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod)) . "T0:0:0";
99
  }
100
 
101
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
108
  if($this->void($order))
109
  {
110
  if(!$order->error)
111
+ $order->error = "Unknown error: Payment failed.";
112
  }
113
  else
114
  {
115
  if(!$order->error)
116
+ $order->error = "Unknown error: Payment failed.";
117
 
118
+ $order->error .= " A partial payment was made that we could not void. Please contact the site owner immediately to correct this.";
119
  }
120
 
121
  return false;
131
  else
132
  {
133
  if(empty($order->error))
134
+ $order->error = "Unknown error: Payment failed.";
135
 
136
  return false;
137
  }
179
  //create a code for the order
180
  if(empty($order->code))
181
  $order->code = $order->getRandomCode();
182
+
 
 
 
183
  //simulate a successful subscription processing
184
  $order->status = "success";
185
  $order->subscription_transaction_id = "CHECK" . $order->code;
202
  $order->updateStatus("cancelled");
203
  return true;
204
  }
205
+ }
206
+ ?>
classes/gateways/class.pmprogateway_cybersource.php DELETED
@@ -1,765 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- if(!class_exists("CyberSourceSoapClient"))
4
- require_once(dirname(__FILE__) . "/../../includes/lib/CyberSource/cyber_source_soap_client.php");
5
- class PMProGateway_cybersource
6
- {
7
- function PMProGateway_cybersource($gateway = NULL)
8
- {
9
- $this->gateway = $gateway;
10
- return $this->gateway;
11
- }
12
-
13
- function process(&$order)
14
- {
15
- //check for initial payment
16
- if(floatval($order->InitialPayment) == 0)
17
- {
18
- //auth first, then process
19
- if($this->authorize($order))
20
- {
21
- $this->void($order);
22
- if(!pmpro_isLevelTrial($order->membership_level))
23
- {
24
- //subscription will start today with a 1 period trial
25
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
26
- $order->TrialBillingPeriod = $order->BillingPeriod;
27
- $order->TrialBillingFrequency = $order->BillingFrequency;
28
- $order->TrialBillingCycles = 1;
29
- $order->TrialAmount = 0;
30
-
31
- //add a billing cycle to make up for the trial, if applicable
32
- if(!empty($order->TotalBillingCycles))
33
- $order->TotalBillingCycles++;
34
- }
35
- elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
36
- {
37
- //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
38
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
39
- $order->TrialBillingCycles++;
40
-
41
- //add a billing cycle to make up for the trial, if applicable
42
- if($order->TotalBillingCycles)
43
- $order->TotalBillingCycles++;
44
- }
45
- else
46
- {
47
- //add a period to the start date to account for the initial payment
48
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
49
- }
50
-
51
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
52
- return $this->subscribe($order);
53
- }
54
- else
55
- {
56
- if(empty($order->error))
57
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
58
- return false;
59
- }
60
- }
61
- else
62
- {
63
- //charge first payment
64
- if($this->charge($order))
65
- {
66
- //setup recurring billing
67
- if(pmpro_isLevelRecurring($order->membership_level))
68
- {
69
- if(!pmpro_isLevelTrial($order->membership_level))
70
- {
71
- //subscription will start today with a 1 period trial
72
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
73
- $order->TrialBillingPeriod = $order->BillingPeriod;
74
- $order->TrialBillingFrequency = $order->BillingFrequency;
75
- $order->TrialBillingCycles = 1;
76
- $order->TrialAmount = 0;
77
-
78
- //add a billing cycle to make up for the trial, if applicable
79
- if(!empty($order->TotalBillingCycles))
80
- $order->TotalBillingCycles++;
81
- }
82
- elseif($order->InitialPayment == 0 && $order->TrialAmount == 0)
83
- {
84
- //it has a trial, but the amount is the same as the initial payment, so we can squeeze it in there
85
- $order->ProfileStartDate = date("Y-m-d") . "T0:0:0";
86
- $order->TrialBillingCycles++;
87
-
88
- //add a billing cycle to make up for the trial, if applicable
89
- if(!empty($order->TotalBillingCycles))
90
- $order->TotalBillingCycles++;
91
- }
92
- else
93
- {
94
- //add a period to the start date to account for the initial payment
95
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $this->BillingFrequency . " " . $this->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
96
- }
97
-
98
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
99
- if($this->subscribe($order))
100
- {
101
- return true;
102
- }
103
- else
104
- {
105
- if($this->void($order))
106
- {
107
- if(!$order->error)
108
- $order->error = __("Unknown error: Payment failed.", "pmpro");
109
- }
110
- else
111
- {
112
- if(!$order->error)
113
- $order->error = __("Unknown error: Payment failed.", "pmpro");
114
-
115
- $order->error .= " " . __("A partial payment was made that we could not void. Please contact the site owner immediately to correct this.", "pmpro");
116
- }
117
-
118
- return false;
119
- }
120
- }
121
- else
122
- {
123
- //only a one time charge
124
- $order->status = "success"; //saved on checkout page
125
- return true;
126
- }
127
- }
128
- else
129
- {
130
- if(empty($order->error))
131
- $order->error = __("Unknown error: Payment failed.", "pmpro");
132
-
133
- return false;
134
- }
135
- }
136
- }
137
-
138
- function getCardType($name)
139
- {
140
- $card_types = array(
141
- 'Visa' => '001',
142
- 'MasterCard' => '002',
143
- 'Master Card' => '002',
144
- 'AMEX' => '003',
145
- 'American Express' => '003',
146
- 'Discover' => '004',
147
- 'Diners Club' => '005',
148
- 'Carte Blanche' => '006',
149
- 'JCB' => '007'
150
- );
151
-
152
- if(isset($card_types[$name]))
153
- return $card_types[$name];
154
- else
155
- return false;
156
- }
157
-
158
- function getWSDL($order)
159
- {
160
- //which gateway environment?
161
- if(empty($order->gateway_environment))
162
- $gateway_environment = pmpro_getOption("gateway_environment");
163
- else
164
- $gateway_environment = $order->gateway_environment;
165
-
166
- //which host?
167
- if($gateway_environment == "live")
168
- $host = "ics2ws.ic3.com";
169
- else
170
- $host = "ics2wstest.ic3.com";
171
-
172
- //path
173
- $path = "/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.90.wsdl";
174
-
175
- //build url
176
- $wsdl_url = "https://" . $host . $path;
177
-
178
- //filter
179
- $wsdl_url = apply_filters("pmpro_cybersource_wsdl_url", $wsdl_url, $gateway_environment);
180
-
181
- return $wsdl_url;
182
- }
183
-
184
- function authorize(&$order)
185
- {
186
- if(empty($order->code))
187
- $order->code = $order->getRandomCode();
188
-
189
- $wsdl_url = $this->getWSDL($order);
190
-
191
- //what amount to authorize? just $1 to test
192
- $amount = "1.00";
193
-
194
- //combine address
195
- $address = $order->Address1;
196
- if(!empty($order->Address2))
197
- $address .= "\n" . $order->Address2;
198
-
199
- //customer stuff
200
- $customer_email = $order->Email;
201
- $customer_phone = $order->billing->phone;
202
-
203
- if(!isset($order->membership_level->name))
204
- $order->membership_level->name = "";
205
-
206
- //to store our request
207
- $request = new stdClass();
208
-
209
- //which service?
210
- $ccAuthService = new stdClass();
211
- $ccAuthService->run = "true";
212
- $request->ccAuthService = $ccAuthService;
213
-
214
- //merchant id and order code
215
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
216
- $request->merchantReferenceCode = $order->code;
217
-
218
- //bill to
219
- $billTo = new stdClass();
220
- $billTo->firstName = $order->FirstName;
221
- $billTo->lastName = $order->LastName;
222
- $billTo->street1 = $address;
223
- $billTo->city = $order->billing->city;
224
- $billTo->state = $order->billing->state;
225
- $billTo->postalCode = $order->billing->zip;
226
- $billTo->country = $order->billing->country;
227
- $billTo->email = $order->Email;
228
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
229
- $request->billTo = $billTo;
230
-
231
- //card
232
- $card = new stdClass();
233
- $card->cardType = $this->getCardType($order->cardtype);
234
- $card->accountNumber = $order->accountnumber;
235
- $card->expirationMonth = $order->expirationmonth;
236
- $card->expirationYear = $order->expirationyear;
237
- $card->cvNumber = $order->CVV2;
238
- $request->card = $card;
239
-
240
- //currency
241
- $purchaseTotals = new stdClass();
242
- $purchaseTotals->currency = pmpro_getOption("currency");
243
- $request->purchaseTotals = $purchaseTotals;
244
-
245
- //item/price
246
- $item0 = new stdClass();
247
- $item0->unitPrice = $amount;
248
- $item0->quantity = "1";
249
- $item0->productName = $order->membership_level->name . " Membership";
250
- $item0->productSKU = $order->membership_level->id;
251
- $item0->id = $order->membership_id;
252
- $request->item = array($item0);
253
-
254
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
255
- $reply = $soapClient->runTransaction($request);
256
-
257
- if($reply->reasonCode == "100")
258
- {
259
- //success
260
- $order->payment_transaction_id = $reply->requestID;
261
- $order->updateStatus("authorized");
262
- return true;
263
- }
264
- else
265
- {
266
- //error
267
- $order->errorcode = $reply->reasonCode;
268
- $order->error = $this->getErrorFromCode($reply->reasonCode);
269
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
270
- return false;
271
- }
272
- }
273
-
274
- function void(&$order)
275
- {
276
- //need a transaction id
277
- if(empty($order->payment_transaction_id))
278
- return false;
279
-
280
- //get wsdl
281
- $wsdl_url = $this->getWSDL($order);
282
-
283
- //to store our request
284
- $request = new stdClass();
285
-
286
- //which service?
287
- $voidService = new stdClass();
288
- $voidService->run = "true";
289
- $voidService->voidRequestID = $order->payment_transaction_id;
290
- $request->voidService = $voidService;
291
-
292
- //merchant id and order code
293
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
294
- $request->merchantReferenceCode = $order->code;
295
-
296
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
297
- $reply = $soapClient->runTransaction($request);
298
-
299
- if($reply->reasonCode == "100")
300
- {
301
- //success
302
- $order->payment_transaction_id = $reply->requestID;
303
- $order->updateStatus("voided");
304
- return true;
305
- }
306
- else
307
- {
308
- //error
309
- $order->errorcode = $reply->reasonCode;
310
- $order->error = $this->getErrorFromCode($reply->reasonCode);
311
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
312
- return false;
313
- }
314
- }
315
-
316
- function charge(&$order)
317
- {
318
- //get a code
319
- if(empty($order->code))
320
- $order->code = $order->getRandomCode();
321
-
322
- //get wsdl
323
- $wsdl_url = $this->getWSDL($order);
324
-
325
- //what amount to charge?
326
- $amount = $order->InitialPayment;
327
-
328
- //tax
329
- $order->subtotal = $amount;
330
- $tax = $order->getTax(true);
331
- $amount = round((float)$order->subtotal + (float)$tax, 2);
332
-
333
- //combine address
334
- $address = $order->Address1;
335
- if(!empty($order->Address2))
336
- $address .= "\n" . $order->Address2;
337
-
338
- //customer stuff
339
- $customer_email = $order->Email;
340
- $customer_phone = $order->billing->phone;
341
-
342
- if(!isset($order->membership_level->name))
343
- $order->membership_level->name = "";
344
-
345
- //to store our request
346
- $request = new stdClass();
347
-
348
- //authorize and capture
349
- $ccAuthService = new stdClass();
350
- $ccAuthService->run = "true";
351
- $request->ccAuthService = $ccAuthService;
352
-
353
- $ccCaptureService = new stdClass();
354
- $ccCaptureService->run = "true";
355
- $request->ccCaptureService = $ccCaptureService;
356
-
357
- //merchant id and order code
358
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
359
- $request->merchantReferenceCode = $order->code;
360
-
361
- //bill to
362
- $billTo = new stdClass();
363
- $billTo->firstName = $order->FirstName;
364
- $billTo->lastName = $order->LastName;
365
- $billTo->street1 = $address;
366
- $billTo->city = $order->billing->city;
367
- $billTo->state = $order->billing->state;
368
- $billTo->postalCode = $order->billing->zip;
369
- $billTo->country = $order->billing->country;
370
- $billTo->email = $order->Email;
371
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
372
- $request->billTo = $billTo;
373
-
374
- //card
375
- $card = new stdClass();
376
- $card->cardType = $this->getCardType($order->cardtype);
377
- $card->accountNumber = $order->accountnumber;
378
- $card->expirationMonth = $order->expirationmonth;
379
- $card->expirationYear = $order->expirationyear;
380
- $card->cvNumber = $order->CVV2;
381
- $request->card = $card;
382
-
383
- //currency
384
- $purchaseTotals = new stdClass();
385
- $purchaseTotals->currency = pmpro_getOption("currency");
386
- $request->purchaseTotals = $purchaseTotals;
387
-
388
- //item/price
389
- $item0 = new stdClass();
390
- $item0->unitPrice = $amount;
391
- $item0->quantity = "1";
392
- $item0->productName = $order->membership_level->name . " Membership";
393
- $item0->productSKU = $order->membership_level->id;
394
- $item0->id = $order->membership_id;
395
- $request->item = array($item0);
396
-
397
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
398
- $reply = $soapClient->runTransaction($request);
399
-
400
- if($reply->reasonCode == "100")
401
- {
402
- //success
403
- $order->payment_transaction_id = $reply->requestID;
404
- $order->updateStatus("success");
405
- return true;
406
- }
407
- else
408
- {
409
- //error
410
- $order->errorcode = $reply->reasonCode;
411
- $order->error = $this->getErrorFromCode($reply->reasonCode);
412
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
413
- return false;
414
- }
415
- }
416
-
417
- function subscribe(&$order)
418
- {
419
- //create a code for the order
420
- if(empty($order->code))
421
- $order->code = $order->getRandomCode();
422
-
423
- //filter order before subscription. use with care.
424
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
425
-
426
- //get wsdl
427
- $wsdl_url = $this->getWSDL($order);
428
-
429
- //to store our request
430
- $request = new stdClass();
431
-
432
- //set service type
433
- $paySubscriptionCreateService = new stdClass();
434
- $paySubscriptionCreateService->run = 'true';
435
- $paySubscriptionCreateService->disableAutoAuth = 'true'; //we do our own auth check
436
- $request->paySubscriptionCreateService = $paySubscriptionCreateService;
437
-
438
- //merchant id and order code
439
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
440
- $request->merchantReferenceCode = $order->code;
441
-
442
- /*
443
- setup billing amount/etc
444
- */
445
- //figure out the amounts
446
- $amount = $order->PaymentAmount;
447
- $amount_tax = $order->getTaxForPrice($amount);
448
- $order->subtotal = $amount;
449
- $amount = round((float)$amount + (float)$amount_tax, 2);
450
-
451
- /*
452
- There are two parts to the trial. Part 1 is simply the delay until the first payment
453
- since we are doing the first payment as a separate transaction.
454
- The second part is the actual "trial" set by the admin.
455
- */
456
- //figure out the trial length (first payment handled by initial charge)
457
- if($order->BillingPeriod == "Year")
458
- $trial_period_days = $order->BillingFrequency * 365; //annual
459
- elseif($order->BillingPeriod == "Day")
460
- $trial_period_days = $order->BillingFrequency * 1; //daily
461
- elseif($order->BillingPeriod == "Week")
462
- $trial_period_days = $order->BillingFrequency * 7; //weekly
463
- else
464
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
465
-
466
- //convert to a profile start date
467
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
468
-
469
- //filter the start date
470
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
471
-
472
- //convert back to days
473
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d"), current_time('timestamp')) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
474
-
475
- //now add the actual trial set by the site
476
- if(!empty($order->TrialBillingCycles))
477
- {
478
- $trialOccurrences = (int)$order->TrialBillingCycles;
479
- if($order->BillingPeriod == "Year")
480
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
481
- elseif($order->BillingPeriod == "Day")
482
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
483
- elseif($order->BillingPeriod == "Week")
484
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
485
- else
486
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
487
- }
488
-
489
- //convert back into a date
490
- $profile_start_date = date("Ymd", strtotime("+ " . $trial_period_days . " Days"));
491
-
492
- //figure out the frequency
493
- if($order->BillingPeriod == "Year")
494
- {
495
- $frequency = "annually"; //ignoring BillingFrequency set on level.
496
- }
497
- elseif($order->BillingPeriod == "Month")
498
- {
499
- if($order->BillingFrequency == 6)
500
- $frequency = "semi annually";
501
- elseif($order->BillingFrequency == 3)
502
- $frequency = "quarterly";
503
- else
504
- $frequency = "monthly";
505
- }
506
- elseif($order->BillingPeriod == "Week")
507
- {
508
- if($order->BillingFrequency == 4)
509
- $frequency = "quad-weekly";
510
- elseif($order->BillingFrequency == 2)
511
- $frequency = "bi-weekly";
512
- else
513
- $frequency = "weekly";
514
- }
515
- elseif($order->BillingPeriod == "Day")
516
- {
517
- if($order->BillingFrequency == 365)
518
- $frequency = "annually";
519
- elseif($order->BillingFrequency == 182)
520
- $frequency = "semi annually";
521
- elseif($order->BillingFrequency == 183)
522
- $frequency = "semi annually";
523
- elseif($order->BillingFrequency == 90)
524
- $frequency = "quaterly";
525
- elseif($order->BillingFrequency == 30)
526
- $frequency = "monthly";
527
- elseif($order->BillingFrequency == 15)
528
- $frequency = "semi-monthly";
529
- elseif($order->BillingFrequency == 28)
530
- $frequency = "quad-weekly";
531
- elseif($order->BillingFrequency == 14)
532
- $frequency = "bi-weekly";
533
- elseif($order->BillingFrequency == 7)
534
- $frequency = "weekly";
535
- }
536
-
537
- //set subscription info for API
538
- $subscription = new stdClass();
539
- $subscription->title = $order->membership_level->name;
540
- $subscription->paymentMethod = "credit card";
541
- $request->subscription = $subscription;
542
-
543
- //recurring info
544
- $recurringSubscriptionInfo = new stdClass();
545
- $recurringSubscriptionInfo->amount = number_format($amount, 2);
546
- $recurringSubscriptionInfo->startDate = $profile_start_date;
547
- $recurringSubscriptionInfo->frequency = $frequency;
548
- if(!empty($order->TotalBillingCycles))
549
- $recurringSubscriptionInfo->numberOfPayments = $order->TotalBillingCycles;
550
- $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
551
-
552
- //combine address
553
- $address = $order->Address1;
554
- if(!empty($order->Address2))
555
- $address .= "\n" . $order->Address2;
556
-
557
- //bill to
558
- $billTo = new stdClass();
559
- $billTo->firstName = $order->FirstName;
560
- $billTo->lastName = $order->LastName;
561
- $billTo->street1 = $address;
562
- $billTo->city = $order->billing->city;
563
- $billTo->state = $order->billing->state;
564
- $billTo->postalCode = $order->billing->zip;
565
- $billTo->country = $order->billing->country;
566
- $billTo->email = $order->Email;
567
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
568
- $request->billTo = $billTo;
569
-
570
- //card
571
- $card = new stdClass();
572
- $card->cardType = $this->getCardType($order->cardtype);
573
- $card->accountNumber = $order->accountnumber;
574
- $card->expirationMonth = $order->expirationmonth;
575
- $card->expirationYear = $order->expirationyear;
576
- $card->cvNumber = $order->CVV2;
577
- $request->card = $card;
578
-
579
- //currency
580
- $purchaseTotals = new stdClass();
581
- $purchaseTotals->currency = pmpro_getOption("currency");
582
- $request->purchaseTotals = $purchaseTotals;
583
-
584
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
585
- $reply = $soapClient->runTransaction($request);
586
-
587
- if($reply->reasonCode == "100")
588
- {
589
- //success
590
- $order->subscription_transaction_id = $reply->requestID;
591
- $order->status = "success";
592
- return true;
593
- }
594
- else
595
- {
596
- //error
597
- $order->status = "error";
598
- $order->errorcode = $reply->reasonCode;
599
- $order->error = $this->getErrorFromCode($reply->reasonCode);
600
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
601
- return false;
602
- }
603
- }
604
-
605
- function update(&$order)
606
- {
607
- //get wsdl
608
- $wsdl_url = $this->getWSDL($order);
609
-
610
- //to store our request
611
- $request = new stdClass();
612
-
613
- //set service type
614
- $paySubscriptionUpdateService = new stdClass();
615
- $paySubscriptionUpdateService ->run = "true";
616
- $request->paySubscriptionUpdateService = $paySubscriptionUpdateService ;
617
-
618
- //merchant id and order code
619
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
620
- $request->merchantReferenceCode = $order->code;
621
-
622
- //set subscription info for API
623
- $recurringSubscriptionInfo = new stdClass();
624
- $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
625
- $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
626
-
627
- //combine address
628
- $address = $order->Address1;
629
- if(!empty($order->Address2))
630
- $address .= "\n" . $order->Address2;
631
-
632
- //bill to
633
- $billTo = new stdClass();
634
- $billTo->firstName = $order->FirstName;
635
- $billTo->lastName = $order->LastName;
636
- $billTo->street1 = $address;
637
- $billTo->city = $order->billing->city;
638
- $billTo->state = $order->billing->state;
639
- $billTo->postalCode = $order->billing->zip;
640
- $billTo->country = $order->billing->country;
641
- $billTo->email = $order->Email;
642
- $billTo->ipAddress = $_SERVER['REMOTE_ADDR'];
643
- $request->billTo = $billTo;
644
-
645
- //card
646
- $card = new stdClass();
647
- $card->cardType = $this->getCardType($order->cardtype);
648
- $card->accountNumber = $order->accountnumber;
649
- $card->expirationMonth = $order->expirationmonth;
650
- $card->expirationYear = $order->expirationyear;
651
- $card->cvNumber = $order->CVV2;
652
- $request->card = $card;
653
-
654
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
655
- $reply = $soapClient->runTransaction($request);
656
-
657
- if($reply->reasonCode == "100")
658
- {
659
- //success
660
- return true;
661
- }
662
- else
663
- {
664
- //error
665
- $order->errorcode = $reply->reasonCode;
666
- $order->error = $this->getErrorFromCode($reply->reasonCode);
667
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
668
- return false;
669
- }
670
- }
671
-
672
- function cancel(&$order)
673
- {
674
- //require a subscription id
675
- if(empty($order->subscription_transaction_id))
676
- return false;
677
-
678
- //get wsdl
679
- $wsdl_url = $this->getWSDL($order);
680
-
681
- //to store our request
682
- $request = new stdClass();
683
-
684
- //which service?
685
- $paySubscriptionDeleteService = new stdClass();
686
- $paySubscriptionDeleteService ->run = "true";
687
- $request->paySubscriptionDeleteService = $paySubscriptionDeleteService ;
688
-
689
- //which order
690
- $recurringSubscriptionInfo = new stdClass();
691
- $recurringSubscriptionInfo->subscriptionID = $order->subscription_transaction_id;
692
- $request->recurringSubscriptionInfo = $recurringSubscriptionInfo;
693
-
694
- //merchant id and order code
695
- $request->merchantID = pmpro_getOption("cybersource_merchantid");
696
- $request->merchantReferenceCode = $order->code;
697
-
698
- $soapClient = new CyberSourceSoapClient($wsdl_url, array("merchantID"=>pmpro_getOption("cybersource_merchantid"), "transactionKey"=>pmpro_getOption("cybersource_securitykey")));
699
- $reply = $soapClient->runTransaction($request);
700
-
701
- if($reply->reasonCode == "100")
702
- {
703
- //success
704
- $order->updateStatus("cancelled");
705
- return true;
706
- }
707
- else
708
- {
709
- //error
710
- $order->errorcode = $reply->reasonCode;
711
- $order->error = $this->getErrorFromCode($reply->reasonCode);
712
- $order->shorterror = $this->getErrorFromCode($reply->reasonCode);
713
- return false;
714
- }
715
- }
716
-
717
- function getErrorFromCode($code)
718
- {
719
- $error_messages = array(
720
- "100" => "Successful transaction.",
721
- "101" => "The request is missing one or more required fields.",
722
- "102" => "One or more fields in the request contains invalid data. Check that your billing address is valid.",
723
- "104" => "Duplicate order detected.",
724
- "110" => "Only partial amount was approved.",
725
- "150" => "Error: General system failure.",
726
- "151" => "Error: The request was received but there was a server timeout.",
727
- "152" => "Error: The request was received, but a service did not finish running in time. ",
728
- "200" => "Address Verification Service (AVS) failure.",
729
- "201" => "Authorization failed.",
730
- "202" => "Expired card or invalid expiration date.",
731
- "203" => "The card was declined.",
732
- "204" => "Insufficient funds in the account.",
733
- "205" => "Stolen or lost card.",
734
- "207" => "Issuing bank unavailable.",
735
- "208" => "Inactive card or card not authorized for card-not-present transactions.",
736
- "209" => "American Express Card Identification Digits (CID) did not match.",
737
- "210" => "The card has reached the credit limit. ",
738
- "211" => "Invalid card verification number.",
739
- "221" => "The customer matched an entry on the processors negative file. ",
740
- "230" => "Card verification (CV) check failed.",
741
- "231" => "Invalid account number.",
742
- "232" => "The card type is not accepted by the payment processor.",
743
- "233" => "General decline by the processor.",
744
- "234" => "There is a problem with your CyberSource merchant configuration.",
745
- "235" => "The requested amount exceeds the originally authorized amount.",
746
- "236" => "Processor failure.",
747
- "237" => "The authorization has already been reversed.",
748
- "238" => "The authorization has already been captured.",
749
- "239" => "The requested transaction amount must match the previous transaction amount.",
750
- "240" => "The card type sent is invalid or does not correlate with the credit card number.",
751
- "241" => "The referenced request id is invalid for all follow-on transactions.",
752
- "242" => "The request ID is invalid.",
753
- "243" => "The transaction has already been settled or reversed.",
754
- "246" => "The capture or credit is not voidable because the capture or credit information has already been submitted to your processor. Or, you requested a void for a type of transaction that cannot be voided.",
755
- "247" => "You requested a credit for a capture that was previously voided.",
756
- "250" => "Error: The request was received, but there was a timeout at the payment processor.",
757
- "520" => "Smart Authorization failed."
758
- );
759
-
760
- if(isset($error_messages[$code]))
761
- return $error_messages[$code];
762
- else
763
- return "Unknown error.";
764
- }
765
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/gateways/class.pmprogateway_payflowpro.php CHANGED
@@ -16,27 +16,34 @@
16
  $authorization_id = $this->authorize($order);
17
  if($authorization_id)
18
  {
19
- $this->void($order, $authorization_id);
20
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
21
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
  return $this->subscribe($order);
23
  }
24
  else
25
  {
26
  if(empty($order->error))
27
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
28
  return false;
29
  }
30
  }
31
  else
32
- {
 
 
 
 
 
 
 
33
  //charge first payment
34
  if($this->charge($order))
35
  {
36
  //setup recurring billing
37
  if(pmpro_isLevelRecurring($order->membership_level))
38
  {
39
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
40
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
41
  if($this->subscribe($order))
42
  {
@@ -47,14 +54,14 @@
47
  if($this->void($order, $order->payment_transaction_id))
48
  {
49
  if(empty($order->error))
50
- $order->error = __("Unknown error: Payment failed.", "pmpro");
51
  }
52
  else
53
  {
54
  if(empty($order->error))
55
- $order->error = __("Unknown error: Payment failed.", "pmpro");
56
 
57
- $order->error .= " " . __("A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.", "pmpro");
58
  }
59
 
60
  return false;
@@ -91,7 +98,7 @@
91
  else
92
  $cardtype = $order->cardtype;
93
 
94
- if(!empty($order->accountnumber))
95
  $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
96
 
97
  //billing address, etc
@@ -109,7 +116,7 @@
109
  $this->nvpStr = $nvpStr;
110
 
111
  $this->httpParsedResponseAr = $this->PPHttpPost('A', $nvpStr);
112
-
113
  if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
114
  $order->authorization_id = $this->httpParsedResponseAr['PNREF'];
115
  $order->updateStatus("authorized");
@@ -131,8 +138,8 @@
131
  //paypal profile stuff
132
  $nvpStr="&ORIGID=" . $authorization_id;
133
 
134
- $this->httpParsedResponseAr = $this->PPHttpPost('V', $nvpStr);
135
-
136
  if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
137
  return true;
138
  } else {
@@ -159,7 +166,7 @@
159
 
160
  //paypal profile stuff
161
  $nvpStr = "";
162
- $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
163
  $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
164
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
165
 
@@ -179,7 +186,7 @@
179
  $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
180
  }
181
 
182
- $this->nvpStr = $nvpStr;
183
  $this->httpParsedResponseAr = $this->PPHttpPost('S', $nvpStr);
184
 
185
  if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
@@ -197,160 +204,14 @@
197
 
198
  function subscribe(&$order)
199
  {
200
- global $pmpro_currency;
201
-
202
- if(empty($order->code))
203
- $order->code = $order->getRandomCode();
204
-
205
- //filter order before subscription. use with care.
206
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
207
-
208
- //taxes on the amount
209
- $amount = $order->PaymentAmount;
210
- $amount_tax = $order->getTaxForPrice($amount);
211
- $amount = round((float)$amount + (float)$amount_tax, 2);
212
-
213
- if($order->BillingPeriod == "Week")
214
- $payperiod = "WEEK";
215
- elseif($order->BillingPeriod == "Month")
216
- $payperiod = "MONT";
217
- elseif($order->BillingPeriod == "Year")
218
- $payperiod = "YEAR";
219
-
220
- //paypal profile stuff
221
- $nvpStr = "&ACTION=A";
222
- $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax . "&CURRENCY=" . $pmpro_currency;
223
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
224
- //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
225
-
226
- $nvpStr .= "&PROFILENAME=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
227
-
228
- $nvpStr .= "&PAYPERIOD=" . $payperiod;
229
-
230
- $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR']; // . "&INVNUM=" . $order->code;
231
-
232
- //if billing cycles are defined
233
- if(!empty($order->TotalBillingCycles))
234
- $nvpStr .= "&TERM=" . $order->TotalBillingCycles;
235
- else
236
- $nvpStr .= "&TERM=0";
237
-
238
- if(!empty($order->accountnumber))
239
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
240
-
241
- /*
242
- Let's figure out the start date. There are two parts.
243
- 1. We need to add the billing period to the start date to account for the initial payment.
244
- 2. We can allow for free trials by further delaying the start date of the subscription.
245
- */
246
- if($order->BillingPeriod == "Year")
247
- $trial_period_days = $order->BillingFrequency * 365; //annual
248
- elseif($order->BillingPeriod == "Day")
249
- $trial_period_days = $order->BillingFrequency * 1; //daily
250
- elseif($order->BillingPeriod == "Week")
251
- $trial_period_days = $order->BillingFrequency * 7; //weekly
252
- else
253
- $trial_period_days = $order->BillingFrequency * 30; //assume monthly
254
-
255
- //convert to a profile start date
256
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
257
-
258
- //filter the start date
259
- $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
260
-
261
- //convert back to days
262
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d"), current_time('timestamp')) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
263
-
264
- //now add the actual trial set by the site
265
- if(!empty($order->TrialBillingCycles))
266
- {
267
- $trialOccurrences = (int)$order->TrialBillingCycles;
268
- if($order->BillingPeriod == "Year")
269
- $trial_period_days = $trial_period_days + (365 * $order->BillingFrequency * $trialOccurrences); //annual
270
- elseif($order->BillingPeriod == "Day")
271
- $trial_period_days = $trial_period_days + (1 * $order->BillingFrequency * $trialOccurrences); //daily
272
- elseif($order->BillingPeriod == "Week")
273
- $trial_period_days = $trial_period_days + (7 * $order->BillingFrequency * $trialOccurrences); //weekly
274
- else
275
- $trial_period_days = $trial_period_days + (30 * $order->BillingFrequency * $trialOccurrences); //assume monthly
276
- }
277
-
278
- //convert back into a date
279
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
280
-
281
- //start date
282
- $nvpStr .= "&START=" . date("mdY", strtotime($order->ProfileStartDate));
283
-
284
- if(!empty($order->accountnumber))
285
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
286
-
287
- //billing address, etc
288
- if($order->Address1)
289
- {
290
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
291
-
292
- if($order->Address2)
293
- $nvpStr .= " " . $order->Address2;
294
-
295
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
296
- }
297
-
298
- $this->nvpStr = $nvpStr;
299
- $this->httpParsedResponseAr = $this->PPHttpPost('R', $nvpStr);
300
-
301
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
302
- $order->subscription_transaction_id = $this->httpParsedResponseAr['PROFILEID'];
303
- $order->status = "success";
304
- return true;
305
- } else {
306
- $order->status = "error";
307
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
308
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
309
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
310
- return false;
311
- }
312
  }
313
 
314
  function update(&$order)
315
  {
316
- $order->getMembershipLevel();
317
-
318
- //paypal profile stuff
319
- $nvpStr = "&ORIGPROFILEID=" . $order->subscription_transaction_id . "&ACTION=M";
320
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
321
-
322
- $nvpStr .= "&PROFILENAME=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
323
-
324
- $nvpStr .= "&CUSTIP=" . $_SERVER['REMOTE_ADDR']; // . "&INVNUM=" . $order->code;
325
-
326
- if(!empty($order->accountnumber))
327
- $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
328
-
329
- //billing address, etc
330
- if($order->Address1)
331
- {
332
- $nvpStr .= "&EMAIL=" . $order->Email . "&FIRSTNAME=" . $order->FirstName . "&LASTNAME=" . $order->LastName . "&STREET=" . $order->Address1;
333
-
334
- if($order->Address2)
335
- $nvpStr .= " " . $order->Address2;
336
-
337
- $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
338
- }
339
-
340
- $this->nvpStr = $nvpStr;
341
- $this->httpParsedResponseAr = $this->PPHttpPost('R', $nvpStr);
342
-
343
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
344
- $order->subscription_transaction_id = $this->httpParsedResponseAr['PROFILEID'];
345
- $order->updateStatus("success");
346
- return true;
347
- } else {
348
- $order->status = "error";
349
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
350
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
351
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
352
- return false;
353
- }
354
  }
355
 
356
  function cancel(&$order)
@@ -359,25 +220,9 @@
359
  if(empty($order->subscription_transaction_id))
360
  return false;
361
 
362
- //paypal profile stuff
363
- $nvpStr = "&ORIGPROFILEID=" . $order->subscription_transaction_id . "&ACTION=C";
364
-
365
- $this->nvpStr = $nvpStr;
366
- $this->httpParsedResponseAr = $this->PPHttpPost('R', $nvpStr);
367
-
368
- if("0" == strtoupper($this->httpParsedResponseAr["RESULT"]))
369
- {
370
- $order->updateStatus("cancelled");
371
- return true;
372
- }
373
- else
374
- {
375
- $order->status = "error";
376
- $order->errorcode = $this->httpParsedResponseAr['RESULT'];
377
- $order->error = urldecode($this->httpParsedResponseAr['RESPMSG']);
378
- $order->shorterror = urldecode($this->httpParsedResponseAr['RESPMSG']);
379
- return false;
380
- }
381
  }
382
 
383
  /**
@@ -446,3 +291,4 @@
446
  return $httpParsedResponseAr;
447
  }
448
  }
 
16
  $authorization_id = $this->authorize($order);
17
  if($authorization_id)
18
  {
19
+ $this->void($order, $authorization_id);
20
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
21
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
  return $this->subscribe($order);
23
  }
24
  else
25
  {
26
  if(empty($order->error))
27
+ $order->error = "Unknown error: Authorization failed.";
28
  return false;
29
  }
30
  }
31
  else
32
+ {
33
+ //let's return an error for recurring levels for now
34
+ if(pmpro_isLevelRecurring($order->membership_level))
35
+ {
36
+ $order->error = "Recurring payments with Payflow is not supported by Paid Memberships Pro at this time.";
37
+ return false;
38
+ }
39
+
40
  //charge first payment
41
  if($this->charge($order))
42
  {
43
  //setup recurring billing
44
  if(pmpro_isLevelRecurring($order->membership_level))
45
  {
46
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
47
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
48
  if($this->subscribe($order))
49
  {
54
  if($this->void($order, $order->payment_transaction_id))
55
  {
56
  if(empty($order->error))
57
+ $order->error = "Unknown error: Payment failed.";
58
  }
59
  else
60
  {
61
  if(empty($order->error))
62
+ $order->error = "Unknown error: Payment failed.";
63
 
64
+ $order->error .= " A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.";
65
  }
66
 
67
  return false;
98
  else
99
  $cardtype = $order->cardtype;
100
 
101
+ if(!empty($accountnumber))
102
  $nvpStr .= "&ACCT=" . $order->accountnumber . "&EXPDATE=" . $order->expirationmonth . substr($order->expirationyear, 2, 2) . "&CVV2=" . $order->CVV2;
103
 
104
  //billing address, etc
116
  $this->nvpStr = $nvpStr;
117
 
118
  $this->httpParsedResponseAr = $this->PPHttpPost('A', $nvpStr);
119
+
120
  if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
121
  $order->authorization_id = $this->httpParsedResponseAr['PNREF'];
122
  $order->updateStatus("authorized");
138
  //paypal profile stuff
139
  $nvpStr="&ORIGID=" . $authorization_id;
140
 
141
+ $this->httpParsedResponseAr = $this->PPHttpPost('C', $nvpStr);
142
+
143
  if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
144
  return true;
145
  } else {
166
 
167
  //paypal profile stuff
168
  $nvpStr = "";
169
+ $nvpStr .="&AMT=" . $amount . "&TAXAMT=" . $amount_tax;
170
  $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
171
  //$nvpStr .= "&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . $order->PaymentAmount;
172
 
186
  $nvpStr .= "&CITY=" . $order->billing->city . "&STATE=" . $order->billing->state . "&BILLTOCOUNTRY=" . $order->billing->country . "&ZIP=" . $order->billing->zip . "&PHONENUM=" . $order->billing->phone;
187
  }
188
 
189
+ $this->nvpStr = $nvpStr;
190
  $this->httpParsedResponseAr = $this->PPHttpPost('S', $nvpStr);
191
 
192
  if("0" == strtoupper($this->httpParsedResponseAr["RESULT"])) {
204
 
205
  function subscribe(&$order)
206
  {
207
+ $order->error = "Recurring subscriptions with Payflow are not currently supported by Paid Memberships Pro";
208
+ return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
  }
210
 
211
  function update(&$order)
212
  {
213
+ $order->error = "Updated billing with Payflow is not currently supported by Paid Memberships Pro";
214
+ return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  }
216
 
217
  function cancel(&$order)
220
  if(empty($order->subscription_transaction_id))
221
  return false;
222
 
223
+ //simulate a successful cancel
224
+ $order->updateStatus("cancelled");
225
+ return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  }
227
 
228
  /**
291
  return $httpParsedResponseAr;
292
  }
293
  }
294
+ ?>
classes/gateways/class.pmprogateway_paypal.php CHANGED
@@ -17,14 +17,14 @@
17
  if($authorization_id)
18
  {
19
  $this->void($order, $authorization_id);
20
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
21
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
  return $this->subscribe($order);
23
  }
24
  else
25
  {
26
  if(empty($order->error))
27
- $order->error = __("Unknown error: Authorization failed.", "pmpro");
28
  return false;
29
  }
30
  }
@@ -36,7 +36,7 @@
36
  //setup recurring billing
37
  if(pmpro_isLevelRecurring($order->membership_level))
38
  {
39
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
40
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
41
  if($this->subscribe($order))
42
  {
@@ -47,14 +47,14 @@
47
  if($this->refund($order, $order->payment_transaction_id))
48
  {
49
  if(empty($order->error))
50
- $order->error = __("Unknown error: Payment failed.", "pmpro");
51
  }
52
  else
53
  {
54
  if(empty($order->error))
55
  $order->error = "Unknown error: Payment failed.";
56
 
57
- $order->error .= " " . __("A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.", "pmpro");
58
  }
59
 
60
  return false;
@@ -239,12 +239,10 @@
239
  if(empty($order->code))
240
  $order->code = $order->getRandomCode();
241
 
242
- //filter order before subscription. use with care.
243
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
244
-
245
  //taxes on the amount
246
  $amount = $order->PaymentAmount;
247
- $amount_tax = $order->getTaxForPrice($amount);
 
248
  $amount = round((float)$amount + (float)$amount_tax, 2);
249
 
250
  //paypal profile stuff
@@ -369,23 +367,21 @@
369
  {
370
  //paypal profile stuff
371
  $nvpStr = "";
372
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id) . "&ACTION=Cancel&NOTE=" . urlencode("User requested cancel.");
373
 
374
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
375
 
376
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
377
- {
378
  $order->updateStatus("cancelled");
379
- return true;
380
- }
381
- else
382
- {
383
  $order->status = "error";
384
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
385
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']) . ". " . __("Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward.", "pmpro");
386
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
387
-
388
- return false;
389
  }
390
  }
391
 
@@ -453,4 +449,5 @@
453
 
454
  return $httpParsedResponseAr;
455
  }
456
- }
 
17
  if($authorization_id)
18
  {
19
  $this->void($order, $authorization_id);
20
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
21
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
22
  return $this->subscribe($order);
23
  }
24
  else
25
  {
26
  if(empty($order->error))
27
+ $order->error = "Unknown error: Authorization failed.";
28
  return false;
29
  }
30
  }
36
  //setup recurring billing
37
  if(pmpro_isLevelRecurring($order->membership_level))
38
  {
39
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
40
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
41
  if($this->subscribe($order))
42
  {
47
  if($this->refund($order, $order->payment_transaction_id))
48
  {
49
  if(empty($order->error))
50
+ $order->error = "Unknown error: Payment failed.";
51
  }
52
  else
53
  {
54
  if(empty($order->error))
55
  $order->error = "Unknown error: Payment failed.";
56
 
57
+ $order->error .= " A partial payment was made that we could not refund. Please contact the site owner immediately to correct this.";
58
  }
59
 
60
  return false;
239
  if(empty($order->code))
240
  $order->code = $order->getRandomCode();
241
 
 
 
 
242
  //taxes on the amount
243
  $amount = $order->PaymentAmount;
244
+ $amount_tax = $order->getTaxForPrice($amount);
245
+ $order->subtotal = $amount;
246
  $amount = round((float)$amount + (float)$amount_tax, 2);
247
 
248
  //paypal profile stuff
367
  {
368
  //paypal profile stuff
369
  $nvpStr = "";
370
+ $nvpStr .= "&PROFILEID=" . $order->subscription_transaction_id . "&ACTION=Cancel&NOTE=User requested cancel.";
371
 
372
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
373
 
374
+ if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]) || $this->httpParsedResponseAr['L_ERRORCODE0'] == "11556") {
 
375
  $order->updateStatus("cancelled");
376
+ return true;
377
+ //exit('CreateRecurringPaymentsProfile Completed Successfully: '.print_r($this->httpParsedResponseAr, true));
378
+ } else {
 
379
  $order->status = "error";
380
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
381
+ $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
382
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
383
+ return false;
384
+ //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
385
  }
386
  }
387
 
449
 
450
  return $httpParsedResponseAr;
451
  }
452
+ }
453
+ ?>
classes/gateways/class.pmprogateway_paypalexpress.php CHANGED
@@ -9,10 +9,10 @@
9
  }
10
 
11
  function process(&$order)
12
- {
13
  if(pmpro_isLevelRecurring($order->membership_level))
14
  {
15
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
16
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
17
  return $this->subscribe($order);
18
  }
@@ -40,20 +40,17 @@
40
 
41
  //taxes on the amount
42
  $amount = $order->PaymentAmount;
43
- $amount_tax = $order->getTaxForPrice($amount);
44
  $order->subtotal = $amount;
45
  $amount = round((float)$amount + (float)$amount_tax, 2);
46
 
47
  //paypal profile stuff
48
  $nvpStr = "";
49
- $nvpStr .="&AMT=" . $initial_payment . "&CURRENCYCODE=" . $pmpro_currency;
50
- if(!empty($order->ProfileStartDate) && strtotime($order->ProfileStartDate, current_time("timestamp")) > 0)
51
- $nvpStr .= "&PROFILESTARTDATE=" . $order->ProfileStartDate;
52
- if(!empty($order->BillingFrequency))
53
- $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling&L_BILLINGTYPE0=RecurringPayments";
54
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
55
- $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
56
- $nvpStr .= "&NOSHIPPING=1&L_BILLINGAGREEMENTDESCRIPTION0=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127)) . "&L_PAYMENTTYPE0=Any";
57
 
58
  //if billing cycles are defined
59
  if(!empty($order->TotalBillingCycles))
@@ -88,16 +85,7 @@
88
  }
89
 
90
  $nvpStr .= "&CANCELURL=" . urlencode(pmpro_url("levels"));
91
-
92
- $account_optional = apply_filters('pmpro_paypal_account_optional', true);
93
- if ($account_optional)
94
- $nvpStr .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing';
95
-
96
- $nvpStr = apply_filters("pmpro_set_express_checkout_nvpstr", $nvpStr, $order);
97
-
98
- ///echo str_replace("&", "&<br />", $nvpStr);
99
- ///exit;
100
-
101
  $this->httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $nvpStr);
102
 
103
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
@@ -178,13 +166,10 @@
178
  $nvpStr = "";
179
  if(!empty($order->Token))
180
  $nvpStr .= "&TOKEN=" . $order->Token;
181
- $nvpStr .="&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency;
182
- /*
183
  if(!empty($amount_tax))
184
  $nvpStr .= "&TAXAMT=" . $amount_tax;
185
- */
186
- if(!empty($order->BillingFrequency))
187
- $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
188
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
189
  $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
190
  $nvpStr .= "&NOSHIPPING=1";
@@ -193,7 +178,7 @@
193
  $order->nvpStr = $nvpStr;
194
 
195
  $this->httpParsedResponseAr = $this->PPHttpPost('DoExpressCheckoutPayment', $nvpStr);
196
-
197
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
198
  $order->payment_transaction_id = urldecode($this->httpParsedResponseAr['TRANSACTIONID']);
199
  $order->status = "success";
@@ -218,10 +203,7 @@
218
 
219
  if(empty($order->code))
220
  $order->code = $order->getRandomCode();
221
-
222
- //filter order before subscription. use with care.
223
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
224
-
225
  //taxes on initial amount
226
  $initial_payment = $order->InitialPayment;
227
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
@@ -229,8 +211,9 @@
229
 
230
  //taxes on the amount
231
  $amount = $order->PaymentAmount;
232
- $amount_tax = $order->getTaxForPrice($amount);
233
- //$amount = round((float)$amount + (float)$amount_tax, 2);
 
234
 
235
  //paypal profile stuff
236
  $nvpStr = "";
@@ -260,10 +243,7 @@
260
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
261
 
262
  $this->nvpStr = $nvpStr;
263
-
264
- ///echo str_replace("&", "&<br />", $nvpStr);
265
- ///exit;
266
-
267
  $this->httpParsedResponseAr = $this->PPHttpPost('CreateRecurringPaymentsProfile', $nvpStr);
268
 
269
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
@@ -289,51 +269,23 @@
289
  {
290
  //paypal profile stuff
291
  $nvpStr = "";
292
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id) . "&ACTION=Cancel&NOTE=" . urlencode("User requested cancel.");
293
 
294
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
295
-
296
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
297
- {
298
  $order->updateStatus("cancelled");
299
- return true;
300
- }
301
- else
302
- {
303
  $order->status = "error";
304
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
305
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']) . ". " . __("Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward.", "pmpro");
306
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
307
 
308
- return false;
309
- }
310
- }
311
-
312
- function getSubscriptionStatus(&$order)
313
- {
314
- if(empty($order->subscription_transaction_id))
315
  return false;
316
-
317
- //paypal profile stuff
318
- $nvpStr = "";
319
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id);
320
-
321
- $this->httpParsedResponseAr = $this->PPHttpPost('GetRecurringPaymentsProfileDetails', $nvpStr);
322
-
323
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
324
- {
325
- return $this->httpParsedResponseAr;
326
- }
327
- else
328
- {
329
- $order->status = "error";
330
- $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
331
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
332
- $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
333
-
334
- return false;
335
  }
336
- }
337
 
338
  /**
339
  * PAYPAL Function
@@ -400,3 +352,4 @@
400
  return $httpParsedResponseAr;
401
  }
402
  }
 
9
  }
10
 
11
  function process(&$order)
12
+ {
13
  if(pmpro_isLevelRecurring($order->membership_level))
14
  {
15
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
16
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
17
  return $this->subscribe($order);
18
  }
40
 
41
  //taxes on the amount
42
  $amount = $order->PaymentAmount;
43
+ $amount_tax = $order->getTaxForPrice($amount);
44
  $order->subtotal = $amount;
45
  $amount = round((float)$amount + (float)$amount_tax, 2);
46
 
47
  //paypal profile stuff
48
  $nvpStr = "";
49
+ $nvpStr .="&AMT=" . $initial_payment . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
50
+ $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
 
 
 
51
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
52
+ $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
53
+ $nvpStr .= "&NOSHIPPING=1&L_BILLINGTYPE0=RecurringPayments&L_BILLINGAGREEMENTDESCRIPTION0=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127)) . "&L_PAYMENTTYPE0=Any";
54
 
55
  //if billing cycles are defined
56
  if(!empty($order->TotalBillingCycles))
85
  }
86
 
87
  $nvpStr .= "&CANCELURL=" . urlencode(pmpro_url("levels"));
88
+
 
 
 
 
 
 
 
 
 
89
  $this->httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $nvpStr);
90
 
91
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
166
  $nvpStr = "";
167
  if(!empty($order->Token))
168
  $nvpStr .= "&TOKEN=" . $order->Token;
169
+ $nvpStr .="&AMT=" . $amount . "&CURRENCYCODE=" . $pmpro_currency . "&PROFILESTARTDATE=" . $order->ProfileStartDate;
 
170
  if(!empty($amount_tax))
171
  $nvpStr .= "&TAXAMT=" . $amount_tax;
172
+ $nvpStr .= "&BILLINGPERIOD=" . $order->BillingPeriod . "&BILLINGFREQUENCY=" . $order->BillingFrequency . "&AUTOBILLAMT=AddToNextBilling";
 
 
173
  $nvpStr .= "&DESC=" . urlencode(substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127));
174
  $nvpStr .= "&NOTIFYURL=" . urlencode(admin_url('admin-ajax.php') . "?action=ipnhandler");
175
  $nvpStr .= "&NOSHIPPING=1";
178
  $order->nvpStr = $nvpStr;
179
 
180
  $this->httpParsedResponseAr = $this->PPHttpPost('DoExpressCheckoutPayment', $nvpStr);
181
+
182
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
183
  $order->payment_transaction_id = urldecode($this->httpParsedResponseAr['TRANSACTIONID']);
184
  $order->status = "success";
203
 
204
  if(empty($order->code))
205
  $order->code = $order->getRandomCode();
206
+
 
 
 
207
  //taxes on initial amount
208
  $initial_payment = $order->InitialPayment;
209
  $initial_payment_tax = $order->getTaxForPrice($initial_payment);
211
 
212
  //taxes on the amount
213
  $amount = $order->PaymentAmount;
214
+ $amount_tax = $order->getTaxForPrice($amount);
215
+ $order->subtotal = $amount;
216
+ $amount = round((float)$amount + (float)$amount_tax, 2);
217
 
218
  //paypal profile stuff
219
  $nvpStr = "";
243
  $nvpStr .= "&TRIALTOTALBILLINGCYCLES=" . $order->TrialBillingCycles;
244
 
245
  $this->nvpStr = $nvpStr;
246
+
 
 
 
247
  $this->httpParsedResponseAr = $this->PPHttpPost('CreateRecurringPaymentsProfile', $nvpStr);
248
 
249
  if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"])) {
269
  {
270
  //paypal profile stuff
271
  $nvpStr = "";
272
+ $nvpStr .= "&PROFILEID=" . $order->subscription_transaction_id . "&ACTION=Cancel&NOTE=User requested cancel.";
273
 
274
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
275
+ if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]) || $this->httpParsedResponseAr['L_ERRORCODE0'] == "11556") {
 
 
276
  $order->updateStatus("cancelled");
277
+ return true;
278
+ //exit('CreateRecurringPaymentsProfile Completed Successfully: '.print_r($this->httpParsedResponseAr, true));
279
+ } else {
 
280
  $order->status = "error";
281
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
282
+ $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
283
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
284
 
 
 
 
 
 
 
 
285
  return false;
286
+ //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  }
288
+ }
289
 
290
  /**
291
  * PAYPAL Function
352
  return $httpParsedResponseAr;
353
  }
354
  }
355
+ ?>
classes/gateways/class.pmprogateway_paypalstandard.php CHANGED
@@ -69,7 +69,7 @@
69
  $paypal_args = array(
70
  'cmd' => '_xclick-subscriptions',
71
  'a1' => number_format($initial_payment, 2),
72
- 'p1' => $order->BillingFrequency,
73
  't1' => $period,
74
  'a3' => number_format($amount, 2),
75
  'p3' => $order->BillingFrequency,
@@ -114,13 +114,13 @@
114
  else
115
  {
116
  //we can try to work in any change in ProfileStartDate
117
- $psd = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod, current_time("timestamp"))) . "T0:0:0";
118
  $adjusted_psd = apply_filters("pmpro_profile_start_date", $psd, $order);
119
  if($psd != $adjusted_psd)
120
  {
121
  //someone is trying to push the start date back
122
- $adjusted_psd_time = strtotime($adjusted_psd, current_time("timestamp"));
123
- $seconds_til_psd = $adjusted_psd_time - current_time('timestamp');
124
  $days_til_psd = floor($seconds_til_psd/(60*60*24));
125
 
126
  //push back trial one by days_til_psd
@@ -144,20 +144,9 @@
144
  if(!empty($order->TotalBillingCycles))
145
  {
146
  if(!empty($trial_amount))
147
- {
148
-
149
- $srt = intval($order->TotalBillingCycles) - 1; //subtract one for the trial period
150
- }
151
- else
152
- {
153
- $srt = intval($order->TotalBillingCycles);
154
- }
155
-
156
- //srt must be at least 2 or the subscription is not "recurring" according to paypal
157
- if($srt > 1)
158
- $paypal_args['srt'] = $srt;
159
  else
160
- $paypal_args['src'] = '0';
161
  }
162
  else
163
  $paypal_args['srt'] = '0'; //indefinite subscription
@@ -195,17 +184,11 @@
195
  foreach($additional_parameters as $key => $value)
196
  $nvpStr .= urlencode("&" . $key . "=" . $value);
197
  }
198
-
199
- $account_optional = apply_filters('pmpro_paypal_account_optional', true);
200
- if ($account_optional)
201
- $nvpStr .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing';
202
 
203
- $nvpStr = apply_filters("pmpro_paypal_standard_nvpstr", $nvpStr, $order);
204
-
205
  //redirect to paypal
206
  $paypal_url .= $nvpStr;
207
 
208
- //wp_die(str_replace("&", "<br />", $paypal_url));
209
 
210
  wp_redirect($paypal_url);
211
  exit;
@@ -215,23 +198,21 @@
215
  {
216
  //paypal profile stuff
217
  $nvpStr = "";
218
- $nvpStr .= "&PROFILEID=" . urlencode($order->subscription_transaction_id) . "&ACTION=Cancel&NOTE=" . urlencode("User requested cancel.");
219
 
220
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
221
-
222
- if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]))
223
- {
224
  $order->updateStatus("cancelled");
225
- return true;
226
- }
227
- else
228
- {
229
  $order->status = "error";
230
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
231
- $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']) . ". " . __("Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward.", "pmpro");
232
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
233
 
234
- return false;
 
235
  }
236
  }
237
 
@@ -271,7 +252,7 @@
271
 
272
  // NVPRequest for submitting to server
273
  $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_";
274
-
275
  // setting the nvpreq as POST FIELD to curl
276
  curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
277
 
@@ -300,3 +281,4 @@
300
  return $httpParsedResponseAr;
301
  }
302
  }
 
69
  $paypal_args = array(
70
  'cmd' => '_xclick-subscriptions',
71
  'a1' => number_format($initial_payment, 2),
72
+ 'p1' => '1',
73
  't1' => $period,
74
  'a3' => number_format($amount, 2),
75
  'p3' => $order->BillingFrequency,
114
  else
115
  {
116
  //we can try to work in any change in ProfileStartDate
117
+ $psd = date("Y-m-d", strtotime("+ " . $order->BillingFrequency . " " . $order->BillingPeriod)) . "T0:0:0";
118
  $adjusted_psd = apply_filters("pmpro_profile_start_date", $psd, $order);
119
  if($psd != $adjusted_psd)
120
  {
121
  //someone is trying to push the start date back
122
+ $adjusted_psd_time = strtotime($adjusted_psd);
123
+ $seconds_til_psd = $adjusted_psd_time - time();
124
  $days_til_psd = floor($seconds_til_psd/(60*60*24));
125
 
126
  //push back trial one by days_til_psd
144
  if(!empty($order->TotalBillingCycles))
145
  {
146
  if(!empty($trial_amount))
147
+ $paypal_args['srt'] = intval($order->TotalBillingCycles) - 1; //subtract 1 for the trial period
 
 
 
 
 
 
 
 
 
 
 
148
  else
149
+ $paypal_args['srt'] = intval($order->TotalBillingCycles);
150
  }
151
  else
152
  $paypal_args['srt'] = '0'; //indefinite subscription
184
  foreach($additional_parameters as $key => $value)
185
  $nvpStr .= urlencode("&" . $key . "=" . $value);
186
  }
 
 
 
 
187
 
 
 
188
  //redirect to paypal
189
  $paypal_url .= $nvpStr;
190
 
191
+ //die($paypal_url);
192
 
193
  wp_redirect($paypal_url);
194
  exit;
198
  {
199
  //paypal profile stuff
200
  $nvpStr = "";
201
+ $nvpStr .= "&PROFILEID=" . $order->subscription_transaction_id . "&ACTION=Cancel&NOTE=User requested cancel.";
202
 
203
  $this->httpParsedResponseAr = $this->PPHttpPost('ManageRecurringPaymentsProfileStatus', $nvpStr);
204
+ if("SUCCESS" == strtoupper($this->httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($this->httpParsedResponseAr["ACK"]) || $this->httpParsedResponseAr['L_ERRORCODE0'] == "11556") {
 
 
205
  $order->updateStatus("cancelled");
206
+ return true;
207
+ //exit('CreateRecurringPaymentsProfile Completed Successfully: '.print_r($this->httpParsedResponseAr, true));
208
+ } else {
 
209
  $order->status = "error";
210
  $order->errorcode = $this->httpParsedResponseAr['L_ERRORCODE0'];
211
+ $order->error = urldecode($this->httpParsedResponseAr['L_LONGMESSAGE0']);
212
  $order->shorterror = urldecode($this->httpParsedResponseAr['L_SHORTMESSAGE0']);
213
 
214
+ return false;
215
+ //exit('CreateRecurringPaymentsProfile failed: ' . print_r($httpParsedResponseAr, true));
216
  }
217
  }
218
 
252
 
253
  // NVPRequest for submitting to server
254
  $nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_";
255
+
256
  // setting the nvpreq as POST FIELD to curl
257
  curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
258
 
281
  return $httpParsedResponseAr;
282
  }
283
  }
284
+ ?>
classes/gateways/class.pmprogateway_stripe.php CHANGED
@@ -50,7 +50,7 @@
50
  else
51
  {
52
  if(empty($order->error))
53
- $order->error = __("Unknown error: Initial payment failed.", "pmpro");
54
  return false;
55
  }
56
  }
@@ -58,8 +58,6 @@
58
 
59
  function charge(&$order)
60
  {
61
- global $pmpro_currency;
62
-
63
  //create a code for the order
64
  if(empty($order->code))
65
  $order->code = $order->getRandomCode();
@@ -85,7 +83,7 @@
85
  {
86
  $response = Stripe_Charge::create(array(
87
  "amount" => $amount * 100, # amount in cents, again
88
- "currency" => $pmpro_currency,
89
  "customer" => $this->customer->id,
90
  "description" => "Order #" . $order->code . ", " . trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")"
91
  )
@@ -164,21 +162,13 @@
164
  //update the customer description and card
165
  if(!empty($order->stripeToken))
166
  {
167
- $name = trim($order->FirstName . " " . $order->LastName);
168
-
169
- if (empty($name))
170
- {
171
- $name = trim($current_user->first_name . " " . $current_user->last_name);
172
- }
173
-
174
- $this->customer->description = $name . " (" . $order->Email . ")";
175
- $this->customer->email = $order->Email;
176
  $this->customer->card = $order->stripeToken;
177
  $this->customer->save();
178
  }
179
 
180
  return $this->customer;
181
- }
182
  catch (Exception $e)
183
  {
184
  //assume no customer found
@@ -192,36 +182,19 @@
192
  {
193
  $this->customer = Stripe_Customer::create(array(
194
  "description" => trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")",
195
- "email" => $order->Email,
196
  "card" => $order->stripeToken
197
  ));
198
  }
199
  catch (Exception $e)
200
  {
201
- $order->error = __("Error creating customer record with Stripe:", "pmpro") . " " . $e->getMessage();
202
  $order->shorterror = $order->error;
203
  return false;
204
  }
205
 
206
- if(!empty($user_id))
207
- {
208
- //user logged in/etc
209
- update_user_meta($user_id, "pmpro_stripe_customerid", $this->customer->id);
210
- }
211
- else
212
- {
213
- //user not registered yet, queue it up
214
- global $pmpro_stripe_customer_id;
215
- $pmpro_stripe_customer_id = $this->customer->id;
216
- function pmpro_user_register_stripe_customerid($user_id)
217
- {
218
- global $pmpro_stripe_customer_id;
219
- update_user_meta($user_id, "pmpro_stripe_customerid", $pmpro_stripe_customer_id);
220
- }
221
- add_action("user_register", "pmpro_user_register_stripe_customerid");
222
- }
223
-
224
- return apply_filters('pmpro_stripe_create_customer', $this->customer);
225
  }
226
 
227
  return false;
@@ -229,15 +202,10 @@
229
 
230
  function subscribe(&$order)
231
  {
232
- global $pmpro_currency;
233
-
234
  //create a code for the order
235
  if(empty($order->code))
236
  $order->code = $order->getRandomCode();
237
 
238
- //filter order before subscription. use with care.
239
- $order = apply_filters("pmpro_subscribe_order", $order, $this);
240
-
241
  //setup customer
242
  $this->getCustomer($order);
243
  if(empty($this->customer))
@@ -245,7 +213,8 @@
245
 
246
  //figure out the amounts
247
  $amount = $order->PaymentAmount;
248
- $amount_tax = $order->getTaxForPrice($amount);
 
249
  $amount = round((float)$amount + (float)$amount_tax, 2);
250
 
251
  /*
@@ -266,13 +235,13 @@
266
  $trial_period_days = $order->BillingFrequency * 30; //assume monthly
267
 
268
  //convert to a profile start date
269
- $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day", current_time("timestamp"))) . "T0:0:0";
270
 
271
  //filter the start date
272
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
273
 
274
  //convert back to days
275
- $trial_period_days = ceil(abs(strtotime(date("Y-m-d"), current_time("timestamp")) - strtotime($order->ProfileStartDate, current_time("timestamp"))) / 86400);
276
 
277
  //now add the actual trial set by the site
278
  if(!empty($order->TrialBillingCycles))
@@ -290,22 +259,20 @@
290
 
291
  //create a plan
292
  try
293
- {
294
- $plan = array(
295
- "amount" => $amount * 100,
296
- "interval_count" => $order->BillingFrequency,
297
- "interval" => strtolower($order->BillingPeriod),
298
- "trial_period_days" => $trial_period_days,
299
- "name" => $order->membership_name . " for order " . $order->code,
300
- "currency" => strtolower($pmpro_currency),
301
- "id" => $order->code
302
- );
303
-
304
- $plan = Stripe_Plan::create(apply_filters('pmpro_stripe_create_plan_array', $plan));
305
  }
306
  catch (Exception $e)
307
  {
308
- $order->error = __("Error creating plan with Stripe:", "pmpro") . $e->getMessage();
309
  $order->shorterror = $order->error;
310
  return false;
311
  }
@@ -321,7 +288,7 @@
321
  $plan->delete();
322
 
323
  //return error
324
- $order->error = __("Error subscribing customer to plan with Stripe:", "pmpro") . $e->getMessage();
325
  $order->shorterror = $order->error;
326
  return false;
327
  }
@@ -353,55 +320,37 @@
353
 
354
  function cancel(&$order)
355
  {
356
- //no matter what happens below, we're going to cancel the order in our system
357
- $order->updateStatus("cancelled");
358
-
359
  //require a subscription id
360
  if(empty($order->subscription_transaction_id))
361
  return false;
362
 
363
  //find the customer
364
- $this->getCustomer($order);
365
 
366
  if(!empty($this->customer))
367
  {
368
- //find subscription with this order code
369
- $subscriptions = $this->customer->subscriptions->all();
370
-
371
- if(!empty($subscriptions))
 
 
372
  {
373
- //in case only one is returned
374
- if(!is_array($subscriptions))
375
- $subscriptions = array($subscriptions);
376
-
377
- foreach($subscriptions as $sub)
378
- {
379
- if($sub->data[0]->plan->id == $order->code)
380
- {
381
- //found it, cancel it
382
- try
383
- {
384
- $this->customer->subscriptions->retrieve($sub->data[0]->id)->cancel();
385
- break;
386
- }
387
- catch(Exception $e)
388
- {
389
- $order->error = __("Could not cancel old subscription.", "pmpro");
390
- $order->shorterror = $order->error;
391
-
392
- return false;
393
- }
394
- }
395
- }
396
- }
397
 
 
398
  return true;
399
  }
400
  else
401
  {
402
- $order->error = __("Could not find the subscription.", "pmpro");
403
  $order->shorterror = $order->error;
404
  return false; //no customer found
405
  }
406
  }
407
- }
 
50
  else
51
  {
52
  if(empty($order->error))
53
+ $order->error = "Unknown error: Initial payment failed.";
54
  return false;
55
  }
56
  }
58
 
59
  function charge(&$order)
60
  {
 
 
61
  //create a code for the order
62
  if(empty($order->code))
63
  $order->code = $order->getRandomCode();
83
  {
84
  $response = Stripe_Charge::create(array(
85
  "amount" => $amount * 100, # amount in cents, again
86
+ "currency" => strtolower(pmpro_getOption("currency")),
87
  "customer" => $this->customer->id,
88
  "description" => "Order #" . $order->code . ", " . trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")"
89
  )
162
  //update the customer description and card
163
  if(!empty($order->stripeToken))
164
  {
165
+ $this->customer->description = trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")";
 
 
 
 
 
 
 
 
166
  $this->customer->card = $order->stripeToken;
167
  $this->customer->save();
168
  }
169
 
170
  return $this->customer;
171
+ }
172
  catch (Exception $e)
173
  {
174
  //assume no customer found
182
  {
183
  $this->customer = Stripe_Customer::create(array(
184
  "description" => trim($order->FirstName . " " . $order->LastName) . " (" . $order->Email . ")",
 
185
  "card" => $order->stripeToken
186
  ));
187
  }
188
  catch (Exception $e)
189
  {
190
+ $order->error = "Error creating customer record with Stripe: " . $e->getMessage();
191
  $order->shorterror = $order->error;
192
  return false;
193
  }
194
 
195
+ update_user_meta($user_id, "pmpro_stripe_customerid", $customer->id);
196
+
197
+ return $this->customer;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  }
199
 
200
  return false;
202
 
203
  function subscribe(&$order)
204
  {
 
 
205
  //create a code for the order
206
  if(empty($order->code))
207
  $order->code = $order->getRandomCode();
208
 
 
 
 
209
  //setup customer
210
  $this->getCustomer($order);
211
  if(empty($this->customer))
213
 
214
  //figure out the amounts
215
  $amount = $order->PaymentAmount;
216
+ $amount_tax = $order->getTaxForPrice($amount);
217
+ $order->subtotal = $amount;
218
  $amount = round((float)$amount + (float)$amount_tax, 2);
219
 
220
  /*
235
  $trial_period_days = $order->BillingFrequency * 30; //assume monthly
236
 
237
  //convert to a profile start date
238
+ $order->ProfileStartDate = date("Y-m-d", strtotime("+ " . $trial_period_days . " Day")) . "T0:0:0";
239
 
240
  //filter the start date
241
  $order->ProfileStartDate = apply_filters("pmpro_profile_start_date", $order->ProfileStartDate, $order);
242
 
243
  //convert back to days
244
+ $trial_period_days = ceil(abs(strtotime(date("Y-m-d")) - strtotime($order->ProfileStartDate)) / 86400);
245
 
246
  //now add the actual trial set by the site
247
  if(!empty($order->TrialBillingCycles))
259
 
260
  //create a plan
261
  try
262
+ {
263
+ $plan = Stripe_Plan::create(array(
264
+ "amount" => $amount * 100,
265
+ "interval_count" => $order->BillingFrequency,
266
+ "interval" => strtolower($order->BillingPeriod),
267
+ "trial_period_days" => $trial_period_days,
268
+ "name" => $order->membership_name . " for order " . $order->code,
269
+ "currency" => strtolower(pmpro_getOption("currency")),
270
+ "id" => $order->code)
271
+ );
 
 
272
  }
273
  catch (Exception $e)
274
  {
275
+ $order->error = "Error creating plan with Stripe:" . $e->getMessage();
276
  $order->shorterror = $order->error;
277
  return false;
278
  }
288
  $plan->delete();
289
 
290
  //return error
291
+ $order->error = "Error subscribing customer to plan with Stripe:" . $e->getMessage();
292
  $order->shorterror = $order->error;
293
  return false;
294
  }
320
 
321
  function cancel(&$order)
322
  {
 
 
 
323
  //require a subscription id
324
  if(empty($order->subscription_transaction_id))
325
  return false;
326
 
327
  //find the customer
328
+ $this->getCustomer($order);
329
 
330
  if(!empty($this->customer))
331
  {
332
+ //cancel
333
+ try
334
+ {
335
+ $this->customer->cancelSubscription();
336
+ }
337
+ catch(Exception $e)
338
  {
339
+ $order->updateStatus("cancelled"); //assume it's been cancelled already
340
+ $order->error = "Could not find the subscription.";
341
+ $order->shorterror = $order->error;
342
+ return false; //no subscription found
343
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
 
345
+ $order->updateStatus("cancelled");
346
  return true;
347
  }
348
  else
349
  {
350
+ $order->error = "Could not find the subscription.";
351
  $order->shorterror = $order->error;
352
  return false; //no customer found
353
  }
354
  }
355
+ }
356
+ ?>
classes/gateways/class.pmprogateway_twocheckout.php DELETED
@@ -1,145 +0,0 @@
1
- <?php
2
- require_once(dirname(__FILE__) . "/class.pmprogateway.php");
3
- if(!class_exists("Twocheckout"))
4
- require_once(dirname(__FILE__) . "/../../includes/lib/Twocheckout/Twocheckout.php");
5
- class PMProGateway_Twocheckout
6
- {
7
- function PMProGateway_Twocheckout($gateway = NULL)
8
- {
9
- $this->gateway = $gateway;
10
- return $this->gateway;
11
- }
12
-
13
- function process(&$order)
14
- {
15
- if(empty($order->code))
16
- $order->code = $order->getRandomCode();
17
-
18
- //clean up a couple values
19
- $order->payment_type = "2CheckOut";
20
- $order->CardType = "";
21
- $order->cardtype = "";
22
-
23
- //just save, the user will go to 2checkout to pay
24
- $order->status = "review";
25
- $order->saveOrder();
26
-
27
- return true;
28
- }
29
-
30
- function sendToTwocheckout(&$order)
31
- {
32
- global $pmpro_currency;
33
- // Set up credentials
34
- Twocheckout::setCredentials( pmpro_getOption("twocheckout_apiusername"), pmpro_getOption("twocheckout_apipassword") );
35
-
36
- $tco_args = array(
37
- 'sid' => pmpro_getOption("twocheckout_accountnumber"),
38
- 'mode' => '2CO', // will always be 2CO according to docs (@see https://www.2checkout.com/documentation/checkout/parameter-sets/pass-through-products/)
39
- 'li_0_type' => 'product',
40
- 'li_0_name' => substr($order->membership_level->name . " at " . get_bloginfo("name"), 0, 127),
41
- 'li_0_quantity' => 1,
42
- 'li_0_tangible' => 'N',
43
- 'li_0_product_id' => $order->code,
44
- 'merchant_order_id' => $order->code,
45
- 'currency_code' => $pmpro_currency,
46
- 'pay_method' => 'CC',
47
- 'purchase_step' => 'billing-information',
48
- 'x_receipt_link_url' => admin_url("admin-ajax.php") . "?action=twocheckout-ins" //pmpro_url("confirmation", "?level=" . $order->membership_level->id)
49
- );
50
-
51
- //taxes on initial amount
52
- $initial_payment = $order->InitialPayment;
53
- $initial_payment_tax = $order->getTaxForPrice($initial_payment);
54
- $initial_payment = round((float)$initial_payment + (float)$initial_payment_tax, 2);
55
-
56
- //taxes on the amount (NOT CURRENTLY USED)
57
- $amount = $order->PaymentAmount;
58
- $amount_tax = $order->getTaxForPrice($amount);
59
- $order->subtotal = $amount;
60
- $amount = round((float)$amount + (float)$amount_tax, 2);
61
-
62
- // Recurring membership
63
- if( pmpro_isLevelRecurring( $order->membership_level ) ) {
64
- $tco_args['li_0_startup_fee'] = number_format($initial_payment - $amount, 2); //negative amount for lower initial payments
65
- $recurring_payment = $order->membership_level->billing_amount;
66
- $recurring_payment_tax = $order->getTaxForPrice($recurring_payment);
67
- $recurring_payment = round((float)$recurring_payment + (float)$recurring_payment_tax, 2);
68
- $tco_args['li_0_price'] = number_format($recurring_payment, 2);
69
-
70
- $tco_args['li_0_recurrence'] = ( $order->BillingFrequency == 1 ) ? $order->BillingFrequency . ' ' . $order->BillingPeriod : $order->BillingFrequency . ' ' . $order->BillingPeriod . 's';
71
-
72
- if( property_exists( $order, 'TotalBillingCycles' ) )
73
- $tco_args['li_0_duration'] = ($order->BillingFrequency * $order->TotalBillingCycles ) . ' ' . $order->BillingPeriod;
74
- else
75
- $tco_args['li_0_duration'] = 'Forever';
76
- }
77
- // Non-recurring membership
78
- else {
79
- $tco_args['li_0_price'] = $initial_payment;
80
- }
81
-
82
- // Demo mode?
83
- $environment = pmpro_getOption("gateway_environment");
84
- if("sandbox" === $environment || "beta-sandbox" === $environment)
85
- $tco_args['demo'] = 'Y';
86
-
87
- // Trial?
88
- //li_#_startup_fee Any start up fees for the product or service. Can be negative to provide discounted first installment pricing, but cannot equal or surpass the product price.
89
- if(!empty($order->TrialBillingPeriod)) {
90
- $trial_amount = $order->TrialAmount;
91
- $trial_tax = $order->getTaxForPrice($trial_amount);
92
- $trial_amount = round((float)$trial_amount + (float)$trial_tax, 2);
93
- $tco_args['li_0_startup_fee'] = $trial_amount; // Negative trial amount
94
- }
95
-
96
- $ptpStr = '';
97
- foreach( $tco_args as $key => $value ) {
98
- reset( $tco_args ); // Used to verify whether or not we're on the first argument
99
- $ptpStr .= ( $key == key($tco_args) ) ? '?' . $key . '=' . urlencode( $value ) : '&' . $key . '=' . urlencode( $value );
100
- }
101
-
102
- //anything modders might add
103
- $additional_parameters = apply_filters( 'pmpro_twocheckout_return_url_parameters', array() );
104
- if( ! empty( $additional_parameters ) )
105
- foreach( $additional_parameters as $key => $value )
106
- $ptpStr .= "&" . urlencode($key) . "=" . urlencode($value);
107
-
108
- $ptpStr = apply_filters( 'pmpro_twocheckout_ptpstr', $ptpStr, $order );
109
-
110
- //echo str_replace("&", "&<br />", $ptpStr);
111
- //exit;
112
-
113
- //redirect to 2checkout
114
- $tco_url = 'https://www.2checkout.com/checkout/purchase' . $ptpStr;
115
-
116
- //echo $tco_url;
117
- //die();
118
- wp_redirect( $tco_url );
119
- exit;
120
- }
121
-
122
- function cancel(&$order) {
123
- // If recurring, stop the recurring payment
124
- if(pmpro_isLevelRecurring($order->membership_level)) {
125
- $params['sale_id'] = $order->payment_transaction_id;
126
- $result = Twocheckout_Sale::stop( $params ); // Stop the recurring billing
127
-
128
- // Successfully cancelled
129
- if (isset($result['response_code']) && $result['response_code'] === 'OK') {
130
- $order->updateStatus("cancelled");
131
- return true;
132
- }
133
- // Failed
134
- else {
135
- $order->status = "error";
136
- $order->errorcode = $result->getCode();
137
- $order->error = $result->getMessage();
138
-
139
- return false;
140
- }
141
- }
142
-
143
- return $order;
144
- }
145
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/admin-rtl.css DELETED
@@ -1,63 +0,0 @@
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
- }
8
-
9
- .pmpro_admin .pmpro_banner .pmpro_meta {
10
- float: right;
11
- }
12
-
13
- .pmpro_admin .pmpro_banner .pmpro_meta .pmpro_tag-blue {
14
- margin: 0 5px 0 0;
15
- }
16
-
17
- .pmpro_admin .pmpro_banner .pmpro_logo {
18
- float: right;
19
- margin: 0 0 0 1em;
20
- }
21
-
22
- .pmpro_admin .pmpro_banner ul.pmpro_menu li {
23
- border-left: 1px solid #CCC;
24
- border-right: none;
25
- }
26
-
27
- /* messages */
28
- .pmpro_message {
29
- padding: 6px 25px 6px 6px;
30
- }
31
-
32
- /* highlighted trs */
33
-
34
- /* discount levels */
35
-
36
- /* pagination */
37
- div.pmpro_pagination {
38
- float: left;
39
- }
40
-
41
- /* add ons */
42
-
43
- .pmpro_admin .widgets-holder-wrap .widget {
44
- float: right;
45
- margin: 0 0 1% 1%;
46
- }
47
-
48
- .pmpro_admin .widgets-holder-wrap .widget-title .status-label {
49
- float: right;
50
- margin: 0 0 0 5px;
51
- }
52
-
53
- .pmpro_admin .widgets-holder-wrap .widget-title .version {
54
- left: 10px;
55
- left: auto;
56
- }
57
-
58
- .pmpro_admin .widgets-holder-wrap .widget-inside .addon-thumb {
59
- float: left;
60
- margin: 10px 10px 0 0;
61
- }
62
-
63
- /* Generated by the RTLer - http://l0uy.com/rtler/ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/admin.css CHANGED
@@ -1,97 +1,61 @@
1
- .pmpro_admin {background: url(../images/Paid-Memberships-Pro_watermark.png) bottom right no-repeat !important; padding: 1em 0 70px 0; }
2
-
3
- .pmpro_admin .pmpro_banner h2 {float: left; }
4
- .pmpro_admin .pmpro_banner .pmpro_meta {float: left; margin: 26px 0 0 0; font-size: 12px; }
5
- .pmpro_admin .pmpro_banner .pmpro_meta .pmpro_tag-blue {margin: 0 0 0 5px; }
6
- .pmpro_admin .pmpro_banner .pmpro_logo {float: left; margin: 0 1em 0 0; width: 350px; height: 75px; }
7
- .pmpro_admin .pmpro_banner ul.pmpro_menu {clear: both; border: 1px solid #CCC; border-radius: 5px; -moz-border-radius: 5px; background: #FFF; }
8
- .pmpro_admin .pmpro_banner ul.pmpro_menu li {display: inline-block; margin: 10px 0; padding: 0px 10px; border-right: 1px solid #CCC; }
9
- .pmpro_admin .pmpro_banner ul.pmpro_menu li a, .pmpro_admin .pmpro_banner ul.pmpro_menu li a:link {color: #1e0741; text-decoration: none; }
10
- .pmpro_admin .pmpro_banner ul.pmpro_menu li a:hover {text-decoration: underline; color: #412f5b; }
11
-
12
- .pmpro_admin .pmpro_tag-grey {display: inline-block; font-size: 11px; font-weight: bold; position: relative; padding: 2px 5px; border: 1px solid #CCC; background: whiteSmoke; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; }
13
- .pmpro_admin .pmpro_tag-blue {display: inline-block; font-size: 11px; font-weight: bold; position: relative; padding: 2px 5px; border: 1px solid #2997c8; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; background: #2997c8; color: #FFF; text-decoration: none; }
14
- .pmpro_admin a.pmpro_tag-blue:hover {background: #77a02e; border: 1px solid #77a02e; }
15
-
16
- .pmpro_admin .topborder {border-top: 1px solid #CCC; margin-top: 1em; padding-top: 1em; }
17
- .pmpro_admin #editorcontainer #description {width: 100%; height: 180px; }
18
- .pmpro_admin .widefat {margin-top: 1em; }
19
-
20
- .ssp_description #description {width: 100%;}
21
- .checkbox_box {width: 300px; background: #FFFFFF; border: 1px solid #CCC;}
22
- .checkbox_box div {border-bottom: 1px solid #CCC; padding: 3px;}
23
- .checkbox_box .clickable {cursor: pointer;}
24
- .checkbox_box .clickable:hover {background: #FFC;}
25
- .top0em {margin-top: 0;}
26
-
27
- tr.pmpro_gray td {color: #AAA;}
28
-
29
- /* messages */
30
- .pmpro_message {background-color: #D5E4F7; background-image: url(../images/icon_information.gif); background-position: 3px 5px; background-repeat: no-repeat; margin: .5em 0; padding: 6px 6px 6px 25px; color: #345395; font-size: 11px; font-weight: bold; line-height: 1.3em; }
31
-
32
- .pmpro_success {background-color: #CFEECA; background-image: url(../images/icon_success.gif); color: #208A1B; }
33
- .pmpro_error {background-color: #F9D6CB; background-image: url(../images/icon_error.gif); color: #E36154; }
34
- .pmpro_alert {background-color: #FFF6CC; background-image: url(../images/icon_alert.gif); color: #CF8516; }
35
-
36
- .pmpro_message a {color: #345395; }
37
- .pmpro_success a {color: #208A1B; }
38
- .pmpro_error a {color: #E36154; }
39
- .pmpro_alert a {color: #CF8516; }
40
-
41
- /* highlighted trs */
42
- tr.pmpro_message {background-image: none;}
43
- tr.pmpro_success {background-image: none;}
44
- tr.pmpro_error {background-image: none;}
45
- tr.pmpro_alert {background-image: none;}
46
-
47
- /* discount levels */
48
- .pmpro_discount_levels {border: 1px solid #CCC;}
49
- .pmpro_discount_levels div {padding: 5px; border: 1px solid #CCC;}
50
- .pmpro_discount_levels div div {margin-top: 5px; background: #F5F5F5;}
51
-
52
- /* pagination */
53
- div.pmpro_pagination {padding: 3px; margin: 5px 0px 5px 0px; font-size: 10px; float: right; }
54
- div.pmpro_pagination a {padding: 2px 5px 2px 5px; margin: 1px; border: 1px solid #666; text-decoration: none; /* no underline */ color: #666; background: #EEE; }
55
- div.pmpro_pagination a:hover, div.pmpro_pagination a:active {background: #FFF; }
56
- div.pmpro_pagination span.current {border: 1px solid #FFF; color: #FFF; background: #666; padding: 2px 5px 2px 5px; margin: 1px; font-weight: bold; }
57
- div.pmpro_pagination span.disabled {padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #BBB; color: #BBB; background: #EFEFEF;}
58
-
59
- p.pmpro_meta_notice {font-size: .8em; padding-top: 5px; border-top: 1px solid #CCC;}
60
-
61
- /* add ons */
62
- .pmpro_admin .widgets-holder-wrap {clear: both; margin-top: 20px; padding: 0 8px; }
63
- .pmpro_admin .widgets-holder-wrap .widget {float: left; width: 32%; margin: 0 1% 1% 0; position: relative; }
64
- .pmpro_admin .widgets-holder-wrap p.description {padding: 0; }
65
- .pmpro_admin .widgets-holder-wrap .widget-top {height: auto; cursor: default; }
66
- .pmpro_admin .widgets-holder-wrap .widget-inside {display: block; height: 130px; overflow: hidden; }
67
- .pmpro_admin .widgets-holder-wrap .widget-inside p {height: 80px; overflow: hidden; }
68
- .pmpro_admin #pmpro-gists.widgets-holder-wrap .widget-inside, .pmpro_admin #pmpro-gists.widgets-holder-wrap .widget-inside p {height: auto; }
69
- .pmpro_admin .widgets-holder-wrap .widget-title { }
70
- .pmpro_admin .widgets-holder-wrap .widget-title h4 { }
71
- .pmpro_admin .widgets-holder-wrap .widget-title .status-label {display: block; float: left; margin: 0 5px 0 0; width: 10px;
72
- height: 10px; overflow: hidden; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border: 1px solid #DFDFDF; text-indent: -9999em; }
73
- .pmpro_admin .widgets-holder-wrap .disabled .widget-title .status-label {background: #F00; }
74
- .pmpro_admin .widgets-holder-wrap .enabled .widget-title .status-label {background: #0C0; }
75
-
76
- .pmpro_admin .widgets-holder-wrap .widget-title .version {position: absolute; top: 13px; right: 10px; }
77
- .pmpro_admin .widgets-holder-wrap .widget-inside .addon-thumb {width: 100px; height: 100px; float: right; margin: 10px 0 0 10px; border: 1px solid #DFDFDF; background: #FFF; padding: 2px;}
78
-
79
- /*@media (min-width: 1200px) {
80
- .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside, .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside p {height: auto; }
81
- }
82
- */
83
- @media (max-width:900px) {
84
- .auto-fold .pmpro_admin .widgets-holder-wrap .widget {float: none; width: 100%; }
85
- .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside, .auto-fold .pmpro_admin .widgets-holder-wrap .widget-inside p {height: auto; }
86
- }
87
-
88
- /* misc */
89
- .pmpro_lite {color: #AAA;}
90
- .pmpro_pad20 {padding: 20px !important;}
91
- .pmpro_red {color: #CC0000;}
92
- .pmpro_green {color: #00AA00;}
93
-
94
- /* reports */
95
- .pmpro_reports-holder { }
96
- .pmpro_clickable {cursor: pointer;}
97
- .js .postbox.pmpro_clickable h3 {cursor: pointer;}
1
+ .pmpro_admin {background: url(../images/PaidMembershipsPro-grey.gif) bottom right no-repeat !important; padding-bottom: 70px; }
2
+
3
+ .pmpro_admin .pmpro_banner {margin: 2em 0; font-family: Georgia, "Times New Roman", Times, serif; }
4
+ .pmpro_admin .pmpro_banner .pmpro_meta {float: right; margin: 2em 0 1em 1em; font-size: 12px; font-style: italic; }
5
+ .pmpro_admin .pmpro_banner .pmpro_logo {float: left; margin: 0 1em 1em 0; width: 350px; }
6
+ .pmpro_admin .pmpro_banner .pmpro_tagline {float: left; width: 350px; font-family: "Arial Black", Gadget, sans-serif; color: #412f5b; text-transform: uppercase; font-size: 13px; padding: 15px 0; }
7
+ .pmpro_admin .pmpro_banner ul.pmpro_menu {clear: both; border: 1px solid #CCC; border-radius: 5px; -moz-border-radius: 5px; background: #FFF; }
8
+ .pmpro_admin .pmpro_banner ul.pmpro_menu li {display: inline-block; margin: 10px 0; padding: 0px 10px; border-right: 1px solid #CCC; }
9
+ .pmpro_admin .pmpro_banner ul.pmpro_menu li a, .pmpro_admin .pmpro_banner ul.pmpro_menu li a:link {color: #1e0741; text-decoration: none; }
10
+ .pmpro_admin .pmpro_banner ul.pmpro_menu li a:hover {text-decoration: underline; color: #412f5b; }
11
+
12
+ .pmpro_admin .topborder {border-top: 1px solid #CCC; margin-top: 1em; padding-top: 1em; }
13
+ .pmpro_admin #editorcontainer #description {width: 100%; height: 180px; }
14
+ .pmpro_admin .widefat {margin-top: 1em; }
15
+
16
+ .ssp_description #description {width: 100%;}
17
+ .checkbox_box {width: 300px; background: #FFFFFF; border: 1px solid #CCC;}
18
+ .checkbox_box div {border-bottom: 1px solid #CCC; padding: 3px;}
19
+ .checkbox_box .clickable {cursor: pointer;}
20
+ .checkbox_box .clickable:hover {background: #FFC;}
21
+ .top0em {margin-top: 0;}
22
+
23
+ tr.pmpro_gray td {color: #AAA;}
24
+
25
+ /* messages */
26
+ .pmpro_message {background-color: #D5E4F7; background-image: url(../images/icon_information.gif); background-position: 3px 5px; background-repeat: no-repeat; margin: .5em 0; padding: 6px 6px 6px 25px; color: #345395; font-size: 11px; font-weight: bold; line-height: 1.3em; }
27
+
28
+ .pmpro_success {background-color: #CFEECA; background-image: url(../images/icon_success.gif); color: #208A1B; }
29
+ .pmpro_error {background-color: #F9D6CB; background-image: url(../images/icon_error.gif); color: #E36154; }
30
+ .pmpro_alert {background-color: #FFF6CC; background-image: url(../images/icon_alert.gif); color: #CF8516; }
31
+
32
+ .pmpro_message a {color: #345395; }
33
+ .pmpro_success a {color: #208A1B; }
34
+ .pmpro_error a {color: #E36154; }
35
+ .pmpro_alert a {color: #CF8516; }
36
+
37
+ /* highlighted trs */
38
+ tr.pmpro_message {background-image: none;}
39
+ tr.pmpro_success {background-image: none;}
40
+ tr.pmpro_error {background-image: none;}
41
+ tr.pmpro_alert {background-image: none;}
42
+
43
+ /* discount levels */
44
+ .pmpro_discount_levels {border: 1px solid #CCC;}
45
+ .pmpro_discount_levels div {padding: 5px; border: 1px solid #CCC;}
46
+ .pmpro_discount_levels div div {margin-top: 5px; background: #F5F5F5;}
47
+
48
+ /* pagination */
49
+ div.pmpro_pagination {padding: 3px; margin: 5px 0px 5px 0px; font-size: 10px; float: right; }
50
+ div.pmpro_pagination a {padding: 2px 5px 2px 5px; margin: 1px; border: 1px solid #666; text-decoration: none; /* no underline */ color: #666; background: #EEE; }
51
+ div.pmpro_pagination a:hover, div.pmpro_pagination a:active {background: #FFF; }
52
+ div.pmpro_pagination span.current {border: 1px solid #FFF; color: #FFF; background: #666; padding: 2px 5px 2px 5px; margin: 1px; font-weight: bold; }
53
+ div.pmpro_pagination span.disabled {padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #BBB; color: #BBB; background: #EFEFEF;}
54
+
55
+ p.pmpro_meta_notice {font-size: .6em; padding-top: 5px; border-top: 1px solid #CCC;}
56
+
57
+ /* misc */
58
+ .pmpro_lite {color: #AAA;}
59
+ .pmpro_pad20 {padding: 20px !important;}
60
+ .pmpro_red {color: #CC0000;}
61
+ .pmpro_green {color: #00AA00;}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/frontend-rtl.css DELETED
@@ -1,111 +0,0 @@
1
- /*---------------------------------------
2
- Buttons
3
- ---------------------------------------*/
4
-
5
- /*---------------------------------------
6
- Forms
7
- ---------------------------------------*/
8
- form.pmpro_form div {
9
- clear: right;
10
- }
11
-
12
- form.pmpro_form label {
13
- float: right;
14
- margin: 3px 0 0 10px;
15
- text-align: left;
16
- }
17
-
18
- form.pmpro_form .input, form.pmpro_form textarea, .input, form.pmpro_form select {
19
- margin: 0 0 0 3px;
20
- }
21
-
22
- form.pmpro_form .leftmar {
23
- margin: 8px 130px 0 0;
24
- }
25
-
26
- form.pmpro_form .pmpro_captcha {
27
- margin: 0 130px 0 0 !important;
28
- }
29
-
30
- form.pmpro_form .pmpro_submit {
31
- margin-right: 130px;
32
- margin-left: auto;
33
- }
34
-
35
- form.pmpro_form .pmpro_submit span {
36
- float: right;
37
- }
38
-
39
- form.pmpro_form #pmpro_processing_message {
40
- margin: 5px 10px 0 0;
41
- }
42
-
43
- /*--------------------------------------------------
44
- Messages - Success, Error, Alert
45
- ----------------------------------------------------*/
46
-
47
- .pmpro_content_message a {
48
- margin: 5px 0 0 5px;
49
- }
50
-
51
- /*---------------------------------------
52
- Membership Checkout
53
- ---------------------------------------*/
54
-
55
- .pmpro_checkout ul {
56
- margin: 5px 20px 0 0;
57
- }
58
-
59
- .pmpro_checkout td.rtbdr {
60
- border-left: 1px solid #CCC;
61
- border-right: none;
62
- }
63
-
64
- .pmpro_thead-msg {
65
- float: left;
66
- text-align: left;
67
- }
68
-
69
- .pmpro_ordersummary {
70
- float: left;
71
- }
72
-
73
- .pmpro_sslseal {
74
- float: left;
75
- }
76
-
77
- /*---------------------------------------
78
- Membership Invoice
79
- ---------------------------------------*/
80
-
81
- /*---------------------------------------
82
- Membership Account
83
- ---------------------------------------*/
84
-
85
- li.pmpro_more {
86
- margin-right: -20px;
87
- padding-right: 0;
88
- padding-left: 0;
89
- margin-left: auto;
90
- }
91
-
92
- /*---------------------------------------
93
- Membership Levels
94
- ---------------------------------------*/
95
-
96
- /*---------------------------------------
97
- Misc
98
- ---------------------------------------*/
99
- .pmpro_a-right {
100
- float: left;
101
- text-align: left;
102
- }
103
-
104
- .pmpro_a-print {
105
- float: left;
106
- background: url(../images/printer.gif) top right no-repeat;
107
- padding: 0px 20px 2px 0px;
108
- }
109
-
110
-
111
- /* Generated by the RTLer - http://l0uy.com/rtler/ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/frontend.css CHANGED
@@ -1,174 +1,119 @@
1
- /*---------------------------------------
2
- Buttons
3
- ---------------------------------------*/
4
- .pmpro_btn, .pmpro_btn:link, .pmpro_content_message a, .pmpro_content_message a:link {
5
- display: inline-block;
6
- background-color: #EFEFEF;
7
- background-image: none;
8
- border: 1px solid #D6D6D6;
9
- -webkit-border-radius: 4px;
10
- -moz-border-radius: 4px;
11
- border-radius: 4px;
12
- padding: 6px 12px;
13
- margin: 0;
14
- color: #444;
15
- font-size: 12px;
16
- font-weight: 700;
17
- text-transform: none;
18
- text-decoration: none;
19
- text-align: center;
20
- white-space: nowrap;
21
- vertical-align: middle;
22
- cursor: pointer;
23
- -webkit-user-select: none;
24
- -moz-user-select: none;
25
- -ms-user-select: none;
26
- -o-user-select: none;
27
- user-select: none;
28
- }
29
-
30
- .pmpro_btn:focus, .pmpro_content_message a:focus {
31
- outline: thin dotted;
32
- outline: 5px auto -webkit-focus-ring-color;
33
- outline-offset: -2px;
34
- }
35
-
36
- .pmpro_btn:hover, .pmpro_btn:focus, .pmpro_content_message a:focus, .pmpro_content_message a:hover {
37
- color: #000;
38
- background-color: #FAFAFA;
39
- text-decoration: none;
40
- }
41
-
42
- .pmpro_btn:active,
43
- .pmpro_btn.active {
44
- background-image: none;
45
- outline: 0;
46
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
47
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
48
- }
49
-
50
- .pmpro_btn.disabled,
51
- .pmpro_btn[disabled],
52
- fieldset[disabled] .pmpro_btn {
53
- pointer-events: none;
54
- cursor: not-allowed;
55
- opacity: 0.65;
56
- filter: alpha(opacity=65);
57
- -webkit-box-shadow: none;
58
- box-shadow: none;
59
- }
60
-
61
- /*---------------------------------------
62
- Forms
63
- ---------------------------------------*/
64
- form.pmpro_form div {clear: left; margin: .5em 0 1em 0; }
65
- form.pmpro_form label {float: left; margin: 3px 10px 0 0; width: 120px; font-weight: bold; text-align: right; }
66
- form.pmpro_form label.pmpro_normal {float: none; margin: 0 0 0 0; width: auto; font-weight: normal; text-align: auto;}
67
- .pmpro_clickable {cursor: pointer;}
68
- form.pmpro_form .likelabel {font-weight: bold; }
69
- form.pmpro_form .input, form.pmpro_form textarea, .input, form.pmpro_form select {padding: 3px; border: 1px solid #AAA; margin: 0 3px 0 0; }
70
- form.pmpro_form textarea {font-family: Arial, Helvetica, sans-serif; font-size: 12px; }
71
- form.pmpro_form select {margin: 2px 0 0 0 ; font-size: 12px;}
72
- form.pmpro_form .lite {color: #666; }
73
- form.pmpro_form .leftmar {margin: 8px 0 0 130px; }
74
-
75
- form.pmpro_form .pmpro_captcha {margin: 0 0 0 130px !important; }
76
- form.pmpro_form .pmpro_captcha div {clear: none; margin: 0; }
77
- form.pmpro_form .pmpro_submit {margin-left: 130px; }
78
- form.pmpro_form .pmpro_submit span {float: left; }
79
- form.pmpro_form #pmpro_processing_message {margin: 5px 0 0 10px; font-style: italic; color: #999; }
80
-
81
- /*--------------------------------------------------
82
- Messages - Success, Error, Alert
83
- ----------------------------------------------------*/
84
- .pmpro_message {background-color: #d9edf7; margin: .5em 0; padding: 10px 15px; color: #31708f; font-size: 14px; font-weight: 400; line-height: 1.5em; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; border: 1px solid #bce8f1; }
85
-
86
- .pmpro_success {background-color: #dff0d8; color: #3c763d; border-color: #bce8f1; }
87
- .pmpro_error {background-color: #f2dede; color: #a94442; border-color: #ebccd1; }
88
- .pmpro_alert {background-color: #fcf8e3; color: #8a6d3b; border-color: #faebcc;}
89
-
90
- .pmpro_content_message a {margin: 5px 5px 0 0; }
91
-
92
- .pmpro_message a {color: #245269; text-decoration: underline; }
93
- .pmpro_success a {color: #2b542c; }
94
- .pmpro_error a {color: #843534; }
95
- .pmpro_alert a {color: #66512c; }
96
-
97
- input.pmpro_error {background-image: none;}
98
- select.pmpro_error {background-image: none;}
99
-
100
- /*---------------------------------------
101
- Membership Checkout
102
- ---------------------------------------*/
103
- .pmpro_checkout thead th {font-weight: bold; color: #444; padding: 10px; }
104
- .pmpro_checkout tbody td {padding: 10px; }
105
- .pmpro_checkout tr.odd td {background: rgba(125,125,125,.1); }
106
- .pmpro_checkout tr.selected td {background: #FFC; }
107
- .pmpro_checkout tr.active td {background: #FFC; }
108
- .pmpro_checkout .name {font-weight: bold; }
109
- .pmpro_checkout ul {margin: 5px 0 0 20px; padding: 0; font-size: .8em; color: #444; }
110
-
111
- .pmpro_checkout tfoot td {padding: 10px; color: #444; }
112
- .pmpro_checkout .topfoot td {border-top: 2px solid #CCC;}
113
- .pmpro_checkout .total td {border-top: 1px solid #CCC; font-size: 1.2em; font-weight: bold; padding-bottom: 30px;}
114
- .pmpro_checkout tfoot .entercode td {background: #EEE; }
115
-
116
- .pmpro_checkout td.rtbdr {border-right: 1px solid #CCC; }
117
-
118
- .pmpro_checkout select {font-size: 11px; }
119
-
120
- .pmpro_thead-msg {display: block; float: right; width: auto; font-style: italic; font-weight: normal; text-align: right; white-space: nowrap; }
121
-
122
- .pmpro_ordersummary {float: right; }
123
-
124
- #pmpro_license { background: #FFF; padding: 5px; border: 1px solid #CCC; height: 200px; margin: 3px; color: #666; overflow: auto; }
125
-
126
- .pmpro_sslseal {float: right; clear: none !important; margin: 0 !important; }
127
-
128
- a.pmpro_radio {text-decoration: none; color: #000;}
129
-
130
- /*---------------------------------------
131
- Membership Invoice
132
- ---------------------------------------*/
133
- .pmpro_invoice { }
134
-
135
-
136
- /*---------------------------------------
137
- Membership Account
138
- ---------------------------------------*/
139
- #pmpro_account .pmpro_box {border-top: 1px solid #CCC; padding: 1em 0; margin: 1em 0; }
140
- #pmpro_account .pmpro_box h3 {margin: 0; padding: 0; border: none; background: none; }
141
- #pmpro_account .pmpro_box p {margin: .5em 0 0 0; padding: 0; }
142
- #pmpro_account .pmpro_box ul {margin-bottom: 0; }
143
-
144
- #pmpro_account #pmpro_account-membership { }
145
- #pmpro_account #pmpro_account-profile { }
146
- #pmpro_account #pmpro_account-billing { }
147
- #pmpro_account #pmpro_account-invoices { }
148
- #pmpro_account #pmpro_account-links { }
149
-
150
-
151
- .pmpro_hidden {display: none;}
152
- li.pmpro_more {list-style-type: none; text-align: center; margin-left: -20px; padding-left: 0;}
153
-
154
- /*---------------------------------------
155
- Membership Levels
156
- ---------------------------------------*/
157
- #pmpro_levels_table {background: #FFF; }
158
- #pmpro_levels_table .pmpro_btn {display: block; }
159
-
160
- /*---------------------------------------
161
- Misc
162
- ---------------------------------------*/
163
- .pmpro_a-right {float: right; width: auto; text-align: right; text-decoration: underline; font-size: 11px; }
164
- .pmpro_a-print {float: right; width: auto; text-decoration: none; color: #345395; background: url(../images/printer.gif) top left no-repeat; padding: 0px 0px 2px 20px; font-size: 11px; line-height: 16px; cursor: pointer; }
165
-
166
- .pmpro_red {color: #CC0000; }
167
- .pmpro_grey {color: #999; }
168
-
169
- .top1em {margin-top: 1em;}
170
- .bot1em {margin-bottom: 1em;}
171
- .bot0em {margin-bottom: 0em;}
172
- .clear {clear: both; }
173
-
174
  .pmpro_small {font-size: .8em;}
1
+ /*---------------------------------------
2
+ Buttons
3
+ ---------------------------------------*/
4
+ .pmpro_btn {display: inline-block; margin: 0; cursor: pointer; }
5
+ .pmpro_btn:hover { }
6
+
7
+ /*---------------------------------------
8
+ Forms
9
+ ---------------------------------------*/
10
+ form.pmpro_form div {clear: left; margin: .5em 0 1em 0; }
11
+ form.pmpro_form label {float: left; margin: 3px 10px 0 0; width: 120px; font-weight: bold; text-align: right; }
12
+ /*form.pmpro_form div div {width: 380px; margin-left: 130px; clear: none;}*/
13
+ form.pmpro_form .likelabel {font-weight: bold; }
14
+ form.pmpro_form .input, form.pmpro_form textarea, .input, form.pmpro_form select {padding: 3px; border: 1px solid #AAA; margin: 0 3px 0 0; }
15
+ form.pmpro_form textarea {font-family: Arial, Helvetica, sans-serif; font-size: 12px; }
16
+ form.pmpro_form select {margin: 2px 0 0 0 ; font-size: 12px;}
17
+ form.pmpro_form .lite {color: #666; }
18
+ form.pmpro_form .leftmar {margin: 8px 0 0 130px; }
19
+
20
+ form.pmpro_form .pmpro_captcha {margin: 0 0 0 130px !important; }
21
+ form.pmpro_form .pmpro_captcha div {clear: none; margin: 0; }
22
+ form.pmpro_form .pmpro_submit {margin-left: 140px; }
23
+ form.pmpro_form .pmpro_submit span {float: left; }
24
+ form.pmpro_form #pmpro_processing_message {margin: 5px 0 0 10px; font-style: italic; color: #999; }
25
+
26
+ /*--------------------------------------------------
27
+ Messages - Success, Error, Alert
28
+ ----------------------------------------------------*/
29
+ .pmpro_message, .pmpro_content_message {background-color: #D5E4F7; background-image: url(../images/icon_information.gif); background-position: 3px 5px; background-repeat: no-repeat; margin: .5em 0; padding: 6px 6px 6px 25px; color: #345395; font-size: 11px; font-weight: bold; line-height: 1.3em; }
30
+
31
+ .pmpro_success {background-color: #CFEECA; background-image: url(../images/icon_success.gif); color: #208A1B; }
32
+ .pmpro_error {background-color: #F9D6CB; background-image: url(../images/icon_error.gif); color: #E36154; }
33
+ .pmpro_alert, .pmpro_content_message {background-color: #FFF6CC; background-image: url(../images/icon_alert.gif); color: #CF8516; }
34
+ .pmpro_content_message {background-position: 5px 10px; }
35
+
36
+ .pmpro_message a {color: #345395; }
37
+ .pmpro_success a {color: #208A1B; }
38
+ .pmpro_error a {color: #E36154; }
39
+ .pmpro_alert a {color: #CF8516; }
40
+
41
+ input.pmpro_error {background-image: none;}
42
+
43
+ /*---------------------------------------
44
+ Membership Checkout
45
+ ---------------------------------------*/
46
+ .pmpro_checkout thead th {font-weight: bold; color: #444; padding: 10px; }
47
+ .pmpro_checkout tbody td {padding: 10px; }
48
+ .pmpro_checkout tr.odd td {background: #FAFAFA; }
49
+ .pmpro_checkout tr.selected td {background: #FFC; }
50
+ .pmpro_checkout tr.active td {background: #FFC; }
51
+ .pmpro_checkout .name {font-weight: bold; }
52
+ .pmpro_checkout ul {margin: 5px 0 0 20px; padding: 0; font-size: .8em; color: #444; }
53
+
54
+ .pmpro_checkout tfoot td {padding: 10px; color: #444; }
55
+ .pmpro_checkout .topfoot td {border-top: 2px solid #CCC;}
56
+ .pmpro_checkout .total td {border-top: 1px solid #CCC; font-size: 1.2em; font-weight: bold; padding-bottom: 30px;}
57
+ .pmpro_checkout tfoot .entercode td {background: #EEE; }
58
+
59
+ .pmpro_checkout td.rtbdr {border-right: 1px solid #CCC; }
60
+
61
+ .pmpro_checkout select {font-size: 11px; }
62
+
63
+ .pmpro_thead-msg {display: block; float: right; width: auto; font-style: italic; font-weight: normal; text-align: right; }
64
+
65
+ .pmpro_ordersummary {float: right; }
66
+
67
+ #pmpro_license { background: #FFF; padding: 5px; border: 1px solid #CCC; height: 200px; margin: 3px; color: #666; overflow: auto; }
68
+
69
+ .pmpro_sslseal {float: right; clear: none !important; margin: 0 !important; }
70
+
71
+ a.pmpro_radio {text-decoration: none; color: #000;}
72
+
73
+ /* button styles from member lite */
74
+ .pmpro_btn, .pmpro_btn:link, #pmpro_levels_table tbody a, #pmpro_levels_table tbody a:link, .pmpro_btn-submit-checkout, .pmpro_yeslink, .pmpro_nolink, .pmpro_yeslink:link, .pmpro_nolink:link, .pmpro_content_message a {display: inline-block; margin: 0; background-position: top left; background-repeat: repeat-x; cursor: pointer; border-radius: 4px; -moz-border-radius: 4px; padding: 5px 10px; text-decoration: none; text-shadow: 1px 1px 3px #000; border: none; font-family: Arial, Helvetica, sans-serif; }
75
+ .pmpro_btn:hover {background-position: bottom left; }
76
+ .pmpro_btn-grey, .pmpro_btn-grey:link, .pmpro_nolink, .pmpro_nolink:link {background: #EEE url(../images/bg_grad-grey.gif) 0px -5px repeat-x; border: 1px solid #CCC; text-shadow: none; }
77
+ .pmpro_btn-inactive {color: #AAA; text-shadow: none; border: 1px solid #CCC; cursor: not-allowed; }
78
+ .pmpro_btn {font-size: 14px; }
79
+ .pmpro_btn-primary, .pmpro_btn-primary:link, #pmpro_levels_table tbody a, #pmpro_levels_table tbody a:link, .pmpro_btn-submit-checkout, .pmpro_yeslink, .pmpro_yeslink:link {background-color: #666; background-image: url(../images/bg_grad-chrome.gif); color: #FFF; }
80
+ .pmpro_btn-primary:hover, #pmpro_levels_table tbody a:hover, .pmpro_btn-submit-checkout:hover, .pmpro_yeslink:hover {background: #444; color: #FFF; }
81
+ .pmpro_btn-inactive, .pmpro_btn-inactive:hover {background: #EEE url(../images/bg_grad-grey.gif) 0px -5px repeat-x; }
82
+
83
+ .pmpro_content_message a, .pmpro_content_message a:link {text-shadow: none; background: #EEE url(../images/bg_grad-grey.gif) 0px -5px repeat-x; border: 1px solid #CCC; color: #666; text-decoration: none; margin: 0 0 0 5px; }
84
+ .pmpro_content_message a:hover {background: #FFF; }
85
+
86
+ /*---------------------------------------
87
+ Membership Invoice
88
+ ---------------------------------------*/
89
+ .pmpro_invoice { }
90
+
91
+
92
+ /*---------------------------------------
93
+ Membership Account
94
+ ---------------------------------------*/
95
+ .pmpro_left {float: left; width: 49%; }
96
+ .pmpro_right {float: right; width: 49%; }
97
+
98
+ .pmpro_box {border: 1px solid #CCC; padding: 1em; margin: 0 0 1em 0; }
99
+ .pmpro_box h3 {border:none; background: none; border-bottom: 1px solid #CCC; padding: 0 0 .5em 0; margin: 0 0 .5em 0; }
100
+
101
+ .pmpro_hidden {display: none;}
102
+ li.pmpro_more {list-style-type: none; text-align: center; margin-left: -20px; padding-left: 0;}
103
+
104
+
105
+ /*---------------------------------------
106
+ Misc
107
+ ---------------------------------------*/
108
+ .pmpro_a-right {float: right; width: auto; text-align: right; text-decoration: underline; font-size: 11px; }
109
+ .pmpro_a-print {float: right; width: auto; text-decoration: none; color: #345395; background: url(../images/printer.gif) top left no-repeat; padding: 0px 0px 2px 20px; font-size: 11px; line-height: 16px; cursor: pointer; }
110
+
111
+ .pmpro_red {color: #CC0000; }
112
+ .pmpro_grey {color: #999; }
113
+
114
+ .top1em {margin-top: 1em;}
115
+ .bot1em {margin-bottom: 1em;}
116
+ .bot0em {margin-bottom: 0em;}
117
+ .clear {clear: both; }
118
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  .pmpro_small {font-size: .8em;}
email/admin_change.html CHANGED
@@ -1,6 +1,6 @@
1
  <p>An administrator at !!sitename!! has changed your membership level.</p>
2
 
3
- <p>!!membership_change!!.</p>
4
 
5
  <p>If you did not request this membership change and would like more information please contact us at !!siteemail!!</p>
6
 
1
  <p>An administrator at !!sitename!! has changed your membership level.</p>
2
 
3
+ <p>Your !!membership_change!!.</p>
4
 
5
  <p>If you did not request this membership change and would like more information please contact us at !!siteemail!!</p>
6
 
email/billing.html CHANGED
@@ -3,7 +3,10 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Billing Information:<br />
6
- !!billing_address!!
 
 
 
7
  </p>
8
 
9
  <p>
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Billing Information:<br />
6
+ !!billing_name!!<br />
7
+ !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
9
+ !!billing_phone!!
10
  </p>
11
 
12
  <p>
email/billing_failure.html CHANGED
@@ -3,7 +3,11 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
- <p>!!billing_address!!</p>
 
 
 
 
7
 
8
  <p>
9
  !!cardtype!!: !!accountnumber!!<br />
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
+ <p>!!billing_name!!</br />
7
+ !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
9
+ !!billing_phone!!
10
+ </p>
11
 
12
  <p>
13
  !!cardtype!!: !!accountnumber!!<br />
email/billing_failure_admin.html CHANGED
@@ -3,7 +3,11 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
- <p>!!billing_address!!</p>
 
 
 
 
7
 
8
  <p>
9
  !!cardtype!!: !!accountnumber!!<br />
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>The most recent account information we have on file is:</p>
5
 
6
+ <p>!!billing_name!!</br />
7
+ !!billing_street!!<br />
8
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
9
+ !!billing_phone!!
10
+ </p>
11
 
12
  <p>
13
  !!cardtype!!: !!accountnumber!!<br />
email/cancel.html CHANGED
@@ -1,3 +1,3 @@
1
- <p>Your membership at !!sitename!! has been cancelled.</p>
2
 
3
  <p>If you did not request this cancellation and would like more information please contact us at !!siteemail!!</p>
1
+ <p>Your membership at !!sitename!! has been canceled.</p>
2
 
3
  <p>If you did not request this cancellation and would like more information please contact us at !!siteemail!!</p>
email/cancel_admin.html CHANGED
@@ -1,4 +1,4 @@
1
- <p>The membership for !!user_login!! at !!sitename!! has been cancelled.</p>
2
 
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>Membership Level: !!membership_level_name!!</p>
1
+ <p>The membership for !!user_login!! at !!sitename!! has been canceled.</p>
2
 
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>Membership Level: !!membership_level_name!!</p>
email/checkout_check.html CHANGED
@@ -11,7 +11,7 @@
11
 
12
  <p>
13
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
14
- Total Billed: !!invoice_total!!
15
  </p>
16
 
17
  <p>Log in to your membership account here: !!login_link!!</p>
11
 
12
  <p>
13
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
14
+ Total Billed: $!!invoice_total!!
15
  </p>
16
 
17
  <p>Log in to your membership account here: !!login_link!!</p>
email/checkout_express.html CHANGED
@@ -8,7 +8,7 @@
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
- Total Billed: !!invoice_total!!
12
  </p>
13
 
14
- <p>Log in to your membership account here: !!login_link!!</p>
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
+ Total Billed: $!!invoice_total!!
12
  </p>
13
 
14
+ <p>Log in to your membership account here: !!login_link!!</p>
email/checkout_express_admin.html CHANGED
@@ -8,7 +8,7 @@
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
- Total Billed: !!invoice_total!!
12
  </p>
13
 
14
- <p>Log in to your membership account here: !!login_link!!</p>
8
 
9
  <p>
10
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
11
+ Total Billed: $!!invoice_total!!
12
  </p>
13
 
14
+ <p>Log in to your membership account here: !!login_link!!</p>
email/checkout_freetrial.html CHANGED
@@ -8,7 +8,10 @@
8
 
9
  <p>
10
  Billing Information on File:<br />
11
- !!billing_address!!
 
 
 
12
  </p>
13
 
14
  <p>
8
 
9
  <p>
10
  Billing Information on File:<br />
11
+ !!billing_name!!<br />
12
+ !!billing_street!!<br />
13
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
14
+ !!billing_phone!!
15
  </p>
16
 
17
  <p>
email/checkout_freetrial_admin.html CHANGED
@@ -8,7 +8,10 @@
8
 
9
  <p>
10
  Billing Information on File:<br />
11
- !!billing_address!!
 
 
 
12
  </p>
13
 
14
  <p>
8
 
9
  <p>
10
  Billing Information on File:<br />
11
+ !!billing_name!!<br />
12
+ !!billing_street!!<br />
13
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
14
+ !!billing_phone!!
15
  </p>
16
 
17
  <p>
email/checkout_paid.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/checkout_paid_admin.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/checkout_trial.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/checkout_trial_admin.html CHANGED
@@ -12,7 +12,10 @@
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
- !!billing_address!!
 
 
 
16
  </p>
17
 
18
  <p>
12
  </p>
13
  <p>
14
  Billing Information:<br />
15
+ !!billing_name!!<br />
16
+ !!billing_street!!<br />
17
+ !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
18
+ !!billing_phone!!
19
  </p>
20
 
21
  <p>
email/credit_card_expiring.html DELETED
@@ -1,13 +0,0 @@
1
- <p>The payment method used for your membership at !!sitename!! will expire soon. <strong>Please click the following link to log in and update your billing information to avoid account suspension. !!login_link!!</strong></p>
2
-
3
- <p>Account: !!display_name!! (!!user_email!!)</p>
4
- <p>The most recent account information we have on file is:</p>
5
-
6
- <p>!!billing_name!!</br />
7
- !!billing_address!!
8
- </p>
9
-
10
- <p>
11
- !!cardtype!!: !!accountnumber!!<br />
12
- Expires: !!expirationmonth!!/!!expirationyear!!
13
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
email/invoice.html CHANGED
@@ -3,11 +3,15 @@
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
6
- Total Billed: !!invoice_total!!
7
  </p>
8
  <p>
9
  Billing Information:<br />
10
- !!billing_address!!
 
 
 
 
11
  </p>
12
 
13
  <p>
3
  <p>Account: !!display_name!! (!!user_email!!)</p>
4
  <p>
5
  Invoice #!!invoice_id!! on !!invoice_date!!<br />
6
+ Total Billed: $!!invoice_total!!
7
  </p>
8
  <p>
9
  Billing Information:<br />
10
+ !!billing_name!!<br />
11
+ !!billing_street!!<br />
12
+ !!billing_city!!, !!billing_state!! !!billing_zip!!<br />
13
+ !!billing_country!!<br />
14
+ !!billing_phone!!
15
  </p>
16
 
17
  <p>
images/Paid-Memberships-Pro.png DELETED
Binary file
images/Paid-Memberships-Pro_watermark.png DELETED
Binary file
images/icon-pmproadmin16-sprite.png DELETED
Binary file
images/icon-pmproadmin16-sprite_2x.png DELETED
Binary file
images/icon-pmproadmin32.png DELETED
Binary file
images/icon-pmproadmin32_2x.png DELETED
Binary file
includes/adminpages.php DELETED
@@ -1,226 +0,0 @@
1
- <?php
2
- /*
3
- Get array of PMPro Capabilities
4
- */
5
- function pmpro_getPMProCaps()
6
- {
7
- $pmpro_caps = array(
8
- //pmpro_memberships_menu //this controls viewing the menu itself
9
- 'pmpro_membershiplevels',
10
- 'pmpro_pagesettings',
11
- 'pmpro_paymentsettings',
12
- 'pmpro_emailsettings',
13
- 'pmpro_advancedsettings',
14
- 'pmpro_addons',
15
- 'pmpro_memberslist',
16
- 'pmpro_reports',
17
- 'pmpro_orders',
18
- 'pmpro_discountcodes'
19
- );
20
-
21
- return $pmpro_caps;
22
- }
23
-
24
- /*
25
- Dashboard Menu
26
- */
27
- function pmpro_add_pages()
28
- {
29
- global $wpdb;
30
-
31
- //array of all caps in the menu
32
- $pmpro_caps = pmpro_getPMProCaps();
33
-
34
- //the top level menu links to the first page they have access to
35
- foreach($pmpro_caps as $cap)
36
- {
37
- if(current_user_can($cap))
38
- {
39
- $top_menu_cap = $cap;
40
- break;
41
- }
42
- }
43
-
44
- if(empty($top_menu_cap))
45
- return;
46
-
47
- add_menu_page(__('Memberships', 'pmpro'), __('Memberships', 'pmpro'), 'pmpro_memberships_menu', 'pmpro-membershiplevels', $top_menu_cap, PMPRO_URL . '/images/menu_users.png');
48
- add_submenu_page('pmpro-membershiplevels', __('Page Settings', 'pmpro'), __('Page Settings', 'pmpro'), 'pmpro_pagesettings', 'pmpro-pagesettings', 'pmpro_pagesettings');
49
- add_submenu_page('pmpro-membershiplevels', __('Payment Settings', 'pmpro'), __('Payment Settings', 'pmpro'), 'pmpro_paymentsettings', 'pmpro-paymentsettings', 'pmpro_paymentsettings');
50
- add_submenu_page('pmpro-membershiplevels', __('Email Settings', 'pmpro'), __('Email Settings', 'pmpro'), 'pmpro_emailsettings', 'pmpro-emailsettings', 'pmpro_emailsettings');
51
- add_submenu_page('pmpro-membershiplevels', __('Advanced Settings', 'pmpro'), __('Advanced Settings', 'pmpro'), 'pmpro_advancedsettings', 'pmpro-advancedsettings', 'pmpro_advancedsettings');
52
- add_submenu_page('pmpro-membershiplevels', __('Add Ons', 'pmpro'), __('Add Ons', 'pmpro'), 'pmpro_addons', 'pmpro-addons', 'pmpro_addons');
53
- add_submenu_page('pmpro-membershiplevels', __('Members List', 'pmpro'), __('Members List', 'pmpro'), 'pmpro_memberslist', 'pmpro-memberslist', 'pmpro_memberslist');
54
- add_submenu_page('pmpro-membershiplevels', __('Reports', 'pmpro'), __('Reports', 'pmpro'), 'pmpro_reports', 'pmpro-reports', 'pmpro_reports');
55
- add_submenu_page('pmpro-membershiplevels', __('Orders', 'pmpro'), __('Orders', 'pmpro'), 'pmpro_orders', 'pmpro-orders', 'pmpro_orders');
56
- add_submenu_page('pmpro-membershiplevels', __('Discount Codes', 'pmpro'), __('Discount Codes', 'pmpro'), 'pmpro_discountcodes', 'pmpro-discountcodes', 'pmpro_discountcodes');
57
-
58
- //rename the automatically added Memberships submenu item
59
- global $submenu;
60
- if(!empty($submenu['pmpro-membershiplevels']))
61
- {
62
- if(current_user_can("pmpro_membershiplevels"))
63
- {
64
- $submenu['pmpro-membershiplevels'][0][0] = __( 'Membership Levels', 'pmpro' );
65
- $submenu['pmpro-membershiplevels'][0][3] = __( 'Membership Levels', 'pmpro' );
66
- }
67
- else
68
- {
69
- unset($submenu['pmpro-membershiplevels']);
70
- }
71
- }
72
- }
73
- add_action('admin_menu', 'pmpro_add_pages');
74
-
75
- /*
76
- Admin Bar
77
- */
78
- function pmpro_admin_bar_menu() {
79
- global $wp_admin_bar;
80
-
81
- //view menu at all?
82
- if ( !current_user_can('pmpro_memberships_menu') || !is_admin_bar_showing() )
83
- return;
84
-
85
- //array of all caps in the menu
86
- $pmpro_caps = pmpro_getPMProCaps();
87
-
88
- //the top level menu links to the first page they have access to
89
- foreach($pmpro_caps as $cap)
90
- {
91
- if(current_user_can($cap))
92
- {
93
- $top_menu_page = str_replace("_", "-", $cap);
94
- break;
95
- }
96
- }
97
-
98
- $wp_admin_bar->add_menu( array(
99
- 'id' => 'paid-memberships-pro',
100
- 'title' => __( 'Memberships', 'pmpro'),
101
- 'href' => get_admin_url(NULL, '/admin.php?page=' . $top_menu_page) ) );
102
-
103
- if(current_user_can('pmpro_membershiplevels'))
104
- $wp_admin_bar->add_menu( array(
105
- 'id' => 'pmpro-membership-levels',
106
- 'parent' => 'paid-memberships-pro',
107
- 'title' => __( 'Membership Levels', 'pmpro'),
108
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-membershiplevels') ) );
109
-
110
- if(current_user_can('pmpro_pagesettings'))
111
- $wp_admin_bar->add_menu( array(
112
- 'id' => 'pmpro-page-settings',
113
- 'parent' => 'paid-memberships-pro',
114
- 'title' => __( 'Page Settings', 'pmpro'),
115
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-pagesettings') ) );
116
-
117
- if(current_user_can('pmpro_paymentsettings'))
118
- $wp_admin_bar->add_menu( array(
119
- 'id' => 'pmpro-payment-settings',
120
- 'parent' => 'paid-memberships-pro',
121
- 'title' => __( 'Payment Settings', 'pmpro'),
122
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-paymentsettings') ) );
123
-
124
- if(current_user_can('pmpro_emailsettings'))
125
- $wp_admin_bar->add_menu( array(
126
- 'id' => 'pmpro-email-settings',
127
- 'parent' => 'paid-memberships-pro',
128
- 'title' => __( 'Email Settings', 'pmpro'),
129
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-emailsettings') ) );
130
-
131
- if(current_user_can('pmpro_advancedsettings'))
132
- $wp_admin_bar->add_menu( array(
133
- 'id' => 'pmpro-advanced-settings',
134
- 'parent' => 'paid-memberships-pro',
135
- 'title' => __( 'Advanced Settings', 'pmpro'),
136
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-advancedsettings') ) );
137
-
138
- if(current_user_can('pmpro_addons'))
139
- $wp_admin_bar->add_menu( array(
140
- 'id' => 'pmpro-addons',
141
- 'parent' => 'paid-memberships-pro',
142
- 'title' => __( 'Add Ons', 'pmpro'),
143
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-addons') ) );
144
-
145
- if(current_user_can('pmpro_memberslist'))
146
- $wp_admin_bar->add_menu( array(
147
- 'id' => 'pmpro-members-list',
148
- 'parent' => 'paid-memberships-pro',
149
- 'title' => __( 'Members List', 'pmpro'),
150
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-memberslist') ) );
151
-
152
- if(current_user_can('pmpro_reports'))
153
- $wp_admin_bar->add_menu( array(
154
- 'id' => 'pmpro-reports',
155
- 'parent' => 'paid-memberships-pro',
156
- 'title' => __( 'Reports', 'pmpro'),
157
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-reports') ) );
158
-
159
- if(current_user_can('pmpro_orders'))
160
- $wp_admin_bar->add_menu( array(
161
- 'id' => 'pmpro-orders',
162
- 'parent' => 'paid-memberships-pro',
163
- 'title' => __( 'Orders', 'pmpro'),
164
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-orders') ) );
165
-
166
- if(current_user_can('pmpro_discountcodes'))
167
- $wp_admin_bar->add_menu( array(
168
- 'id' => 'pmpro-discount-codes',
169
- 'parent' => 'paid-memberships-pro',
170
- 'title' => __( 'Discount Codes', 'pmpro'),
171
- 'href' => get_admin_url(NULL, '/admin.php?page=pmpro-discountcodes') ) );
172
- }
173
- add_action('admin_bar_menu', 'pmpro_admin_bar_menu', 1000);
174
-
175
- /*
176
- Functions to load pages from adminpages directory
177
- */
178
- function pmpro_reports()
179
- {
180
- require_once(PMPRO_DIR . "/adminpages/reports.php");
181
- }
182
-
183
- function pmpro_memberslist()
184
- {
185
- require_once(PMPRO_DIR . "/adminpages/memberslist.php");
186
- }
187
-
188
- function pmpro_discountcodes()
189
- {
190
- require_once(PMPRO_DIR . "/adminpages/discountcodes.php");
191
- }
192
-
193
- function pmpro_membershiplevels()
194
- {
195
- require_once(PMPRO_DIR . "/adminpages/membershiplevels.php");
196
- }
197
-
198
- function pmpro_pagesettings()
199
- {
200
- require_once(PMPRO_DIR . "/adminpages/pagesettings.php");
201
- }
202
-
203
- function pmpro_paymentsettings()
204
- {
205
- require_once(PMPRO_DIR . "/adminpages/paymentsettings.php");
206
- }
207
-
208
- function pmpro_emailsettings()
209
- {
210
- require_once(PMPRO_DIR . "/adminpages/emailsettings.php");
211
- }
212
-
213
- function pmpro_advancedsettings()
214
- {
215
- require_once(PMPRO_DIR . "/adminpages/advancedsettings.php");
216
- }
217
-
218
- function pmpro_addons()
219
- {
220
- require_once(PMPRO_DIR . "/adminpages/addons.php");
221
- }
222
-
223
- function pmpro_orders()
224
- {
225
- require_once(PMPRO_DIR . "/adminpages/orders.php");
226
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/cleanup.php DELETED
@@ -1,40 +0,0 @@
1
- <?php
2
- /*
3
- Clean things up when deletes happen, etc. (This stuff needs a better home.)
4
- */
5
- //deleting a user? remove their account info.
6
- function pmpro_delete_user($user_id = NULL)
7
- {
8
- global $wpdb;
9
-
10
- //changing their membership level to 0 will cancel any subscription and remove their membership level entry
11
- //we don't remove the orders because it would affect reporting
12
- if(pmpro_changeMembershipLevel(0, $user_id))
13
- {
14
- //okay
15
- }
16
- else
17
- {
18
- //okay, guessing they didn't have a level
19
- }
20
- }
21
- add_action('delete_user', 'pmpro_delete_user');
22
- add_action('wpmu_delete_user', 'pmpro_delete_user');
23
-
24
- //deleting a category? remove any level associations
25
- function pmpro_delete_category($cat_id = NULL)
26
- {
27
- global $wpdb;
28
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE category_id = '" . $cat_id . "'";
29
- $wpdb->query($sqlQuery);
30
- }
31
- add_action('delete_category', 'pmpro_delete_category');
32
-
33
- //deleting a post? remove any level associations
34
- function pmpro_delete_post($post_id = NULL)
35
- {
36
- global $wpdb;
37
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_pages WHERE page_id = '" . $post_id . "'";
38
- $wpdb->query($sqlQuery);
39
- }
40
- add_action('delete_post', 'pmpro_delete_post');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/content.php DELETED
@@ -1,405 +0,0 @@
1
- <?php
2
- /*
3
- Functions to detect member content and protect it.
4
- */
5
- function pmpro_has_membership_access($post_id = NULL, $user_id = NULL, $return_membership_levels = false)
6
- {
7
- global $post, $wpdb, $current_user;
8
- //use globals if no values supplied
9
- if(!$post_id)
10
- $post_id = $post->ID;
11
- if(!$user_id)
12
- $user_id = $current_user->ID;
13
-
14
- //no post, return true (changed from false in version 1.7.2)
15
- if(!$post_id)
16
- return true;
17
-
18
- //if no post or current_user object, set them up
19
- if(!empty($post->ID) && $post_id == $post->ID)
20
- $mypost = $post;
21
- else
22
- $mypost = get_post($post_id);
23
-
24
- if($user_id == $current_user->ID)
25
- $myuser = $current_user;
26
- else
27
- $myuser = get_userdata($user_id);
28
-
29
- //for these post types, we want to check the parent
30
- if($mypost->post_type == "attachment" || $mypost->post_type == "revision")
31
- {
32
- $mypost = get_post($mypost->post_parent);
33
- }
34
-
35
- if($mypost->post_type == "post")
36
- {
37
- $post_categories = wp_get_post_categories($mypost->ID);
38
-
39
- if(!$post_categories)
40
- {
41
- //just check for entries in the memberships_pages table
42
- $sqlQuery = "SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "'";
43
- }
44
- else
45
- {
46
- //are any of the post categories associated with membership levels? also check the memberships_pages table
47
- $sqlQuery = "(SELECT m.id, m.name FROM $wpdb->pmpro_memberships_categories mc LEFT JOIN $wpdb->pmpro_membership_levels m ON mc.membership_id = m.id WHERE mc.category_id IN(" . implode(",", $post_categories) . ") AND m.id IS NOT NULL) UNION (SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "')";
48
- }
49
- }
50
- else
51
- {
52
- //are any membership levels associated with this page?
53
- $sqlQuery = "SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "'";
54
- }
55
-
56
-
57
- $post_membership_levels = $wpdb->get_results($sqlQuery);
58
-
59
- $post_membership_levels_ids = array();
60
- $post_membership_levels_names = array();
61
-
62
- if(!$post_membership_levels)
63
- {
64
- $hasaccess = true;
65
- }
66
- else
67
- {
68
- //we need to see if the user has access
69
- foreach($post_membership_levels as $level)
70
- {
71
- $post_membership_levels_ids[] = $level->id;
72
- $post_membership_levels_names[] = $level->name;
73
- }
74
-
75
- //levels found. check if this is in a feed or if the current user is in at least one of those membership levels
76
- if(is_feed())
77
- {
78
- //always block restricted feeds
79
- $hasaccess = false;
80
- }
81
- elseif(!empty($myuser->ID))
82
- {
83
- $myuser->membership_level = pmpro_getMembershipLevelForUser($myuser->ID);
84
- if(!empty($myuser->membership_level->ID) && in_array($myuser->membership_level->ID, $post_membership_levels_ids))
85
- {
86
- //the users membership id is one that will grant access
87
- $hasaccess = true;
88
- }
89
- else
90
- {
91
- //user isn't a member of a level with access
92
- $hasaccess = false;
93
- }
94
- }
95
- else
96
- {
97
- //user is not logged in and this content requires membership
98
- $hasaccess = false;
99
- }
100
- }
101
-
102
- /*
103
- Filters
104
- The generic filter is run first. Then if there is a filter for this post type, that is run.
105
- */
106
- //general filter for all posts
107
- $hasaccess = apply_filters("pmpro_has_membership_access_filter", $hasaccess, $mypost, $myuser, $post_membership_levels);
108
- //filter for this post type
109
- if(has_filter("pmpro_has_membership_access_filter_" . $mypost->post_type))
110
- $hasaccess = apply_filters("pmpro_has_membership_access_filter_" . $mypost->post_type, $hasaccess, $mypost, $myuser, $post_membership_levels);
111
-
112
- //return
113
- if($return_membership_levels)
114
- return array($hasaccess, $post_membership_levels_ids, $post_membership_levels_names);
115
- else
116
- return $hasaccess;
117
- }
118
-
119
- function pmpro_search_filter($query)
120
- {
121
- global $current_user, $wpdb, $pmpro_pages;
122
-
123
- //hide pmpro pages from search results
124
- if(!$query->is_admin && $query->is_search && empty($query->query['post_parent']))
125
- {
126
- $query->set('post__not_in', $pmpro_pages ); // id of page or post
127
- }
128
-
129
- //hide member pages from non-members (make sure they aren't hidden from members)
130
- if(!$query->is_admin &&
131
- !$query->is_singular &&
132
- empty($query->query['post_parent']) &&
133
- (
134
- empty($query->query_vars['post_type']) ||
135
- in_array($query->query_vars['post_type'], apply_filters('pmpro_search_filter_post_types', array("page", "post")))
136
- )
137
- )
138
- {
139
- //get page ids that are in my levels
140
- $levels = pmpro_getMembershipLevelsForUser($current_user->ID);
141
- $my_pages = array();
142
-
143
- if($levels) {
144
- foreach($levels as $key => $level) {
145
- //get restricted posts for level
146
- $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages WHERE membership_id=" . $current_user->membership_level->ID;
147
- $member_pages = $wpdb->get_col($sql);
148
- $my_pages = array_unique(array_merge($my_pages, $member_pages));
149
- }
150
- }
151
-
152
- //get hidden page ids
153
- if(!empty($my_pages))
154
- $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages WHERE page_id NOT IN(" . implode(',', $my_pages) . ")";
155
- else
156
- $sql = "SELECT page_id FROM $wpdb->pmpro_memberships_pages";
157
- $hidden_page_ids = array_values(array_unique($wpdb->get_col($sql)));
158
-
159
- if($hidden_page_ids)
160
- $query->set('post__not_in', $hidden_page_ids);
161
-
162
- //get categories that are filtered by level, but not my level
163
- $my_cats = array();
164
-
165
- if($levels) {
166
- foreach($levels as $key => $level) {
167
- $member_cats = pmpro_getMembershipCategories($level->id);
168
- $my_cats = array_unique(array_merge($my_cats, $member_cats));
169
- }
170
- }
171
-
172
- //get hidden cats
173
- if(!empty($my_cats))
174
- $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories WHERE category_id NOT IN(" . implode(',', $my_cats) . ")";
175
- else
176
- $sql = "SELECT category_id FROM $wpdb->pmpro_memberships_categories";
177
-
178
- $hidden_cat_ids = array_values(array_unique($wpdb->get_col($sql)));
179
-
180
- //make this work
181
- if($hidden_cat_ids)
182
- $query->set('category__not_in', $hidden_cat_ids);
183
- }
184
-
185
- return $query;
186
- }
187
- $filterqueries = pmpro_getOption("filterqueries");
188
- if(!empty($filterqueries))
189
- add_filter( 'pre_get_posts', 'pmpro_search_filter' );
190
-
191
- function pmpro_membership_content_filter($content, $skipcheck = false)
192
- {
193
- global $post, $current_user;
194
-
195
- if(!$skipcheck)
196
- {
197
- $hasaccess = pmpro_has_membership_access(NULL, NULL, true);
198
- if(is_array($hasaccess))
199
- {
200
- //returned an array to give us the membership level values
201
- $post_membership_levels_ids = $hasaccess[1];
202
- $post_membership_levels_names = $hasaccess[2];
203
- $hasaccess = $hasaccess[0];
204
- }
205
- }
206
-
207
- if($hasaccess)
208
- {
209
- //all good, return content
210
- return $content;
211
- }
212
- else
213
- {
214
- //if show excerpts is set, return just the excerpt
215
- if(pmpro_getOption("showexcerpts"))
216
- {
217
- //show excerpt
218
- global $post;
219
- if($post->post_excerpt)
220
- {
221
- //defined exerpt
222
- $content = wpautop($post->post_excerpt);
223
- }
224
- elseif(strpos($content, "<span id=\"more-" . $post->ID . "\"></span>") !== false)
225
- {
226
- //more tag
227
- $pos = strpos($content, "<span id=\"more-" . $post->ID . "\"></span>");
228
- $content = wpautop(substr($content, 0, $pos));
229
- }
230
- elseif(strpos($content, 'class="more-link">') !== false)
231
- {
232
- //more link
233
- $content = preg_replace("/\<a.*class\=\"more\-link\".*\>.*\<\/a\>/", "", $content);
234
- }
235
- else
236
- {
237
- //auto generated excerpt. pulled from wp_trim_excerpt
238
- $content = strip_shortcodes( $content );
239
- $content = str_replace(']]>', ']]&gt;', $content);
240
- $content = strip_tags($content);
241
- $excerpt_length = apply_filters('excerpt_length', 55);
242
- $words = preg_split("/[\n\r\t ]+/", $content, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
243
- if ( count($words) > $excerpt_length ) {
244
- array_pop($words);
245
- $content = implode(' ', $words);
246
- $content = $content . "... ";
247
- } else {
248
- $content = implode(' ', $words) . "... ";
249
- }
250
-
251
- $content = wpautop($content);
252
- }
253
- }
254
- else
255
- {
256
- //else hide everything
257
- $content = "";
258
- }
259
-
260
- if(empty($post_membership_levels_ids))
261
- $post_membership_levels_ids = array();
262
-
263
- if(empty($post_membership_levels_names))
264
- $post_membership_levels_names = array();
265
-
266
- $pmpro_content_message_pre = '<div class="pmpro_content_message">';
267
- $pmpro_content_message_post = '</div>';
268
-
269
- $sr_search = array("!!levels!!", "!!referrer!!");
270
- $sr_replace = array(pmpro_implodeToEnglish($post_membership_levels_names), $_SERVER['REQUEST_URI']);
271
-
272
- //get the correct message to show at the bottom
273
- if(is_feed())
274
- {
275
- $newcontent = apply_filters("pmpro_rss_text_filter", stripslashes(pmpro_getOption("rsstext")));
276
- $content .= $pmpro_content_message_pre . str_replace($sr_search, $sr_replace, $newcontent) . $pmpro_content_message_post;
277
- }
278
- elseif($current_user->ID)
279
- {
280
- //not a member
281
- $newcontent = apply_filters("pmpro_non_member_text_filter", stripslashes(pmpro_getOption("nonmembertext")));
282
- $content .= $pmpro_content_message_pre . str_replace($sr_search, $sr_replace, $newcontent) . $pmpro_content_message_post;
283
- }
284
- else
285
- {
286
- //not logged in!
287
- $newcontent = apply_filters("pmpro_not_logged_in_text_filter", stripslashes(pmpro_getOption("notloggedintext")));
288
- $content .= $pmpro_content_message_pre . str_replace($sr_search, $sr_replace, $newcontent) . $pmpro_content_message_post;
289
- }
290
- }
291
-
292
- return $content;
293
- }
294
- add_filter('the_content', 'pmpro_membership_content_filter', 5);
295
- add_filter('the_content_rss', 'pmpro_membership_content_filter', 5);
296
- add_filter('comment_text_rss', 'pmpro_membership_content_filter', 5);
297
-
298
- /*
299
- If the_excerpt is called, we want to disable the_content filters so the PMPro messages aren't added to the content before AND after the ecerpt.
300
- */
301
- function pmpro_membership_excerpt_filter($content, $skipcheck = false)
302
- {
303
- remove_filter('the_content', 'pmpro_membership_content_filter', 5);
304
- $content = pmpro_membership_content_filter($content, $skipcheck);
305
- add_filter('the_content', 'pmpro_membership_content_filter', 5);
306
-
307
- return $content;
308
- }
309
- function pmpro_membership_get_excerpt_filter_start($content, $skipcheck = false)
310
- {
311
- remove_filter('the_content', 'pmpro_membership_content_filter', 5);
312
- return $content;
313
- }
314
- function pmpro_membership_get_excerpt_filter_end($content, $skipcheck = false)
315
- {
316
- add_filter('the_content', 'pmpro_membership_content_filter', 5);
317
- return $content;
318
- }
319
- add_filter('the_excerpt', 'pmpro_membership_excerpt_filter', 15);
320
- add_filter('get_the_excerpt', 'pmpro_membership_get_excerpt_filter_start', 1);
321
- add_filter('get_the_excerpt', 'pmpro_membership_get_excerpt_filter_end', 100);
322
-
323
- function pmpro_comments_filter($comments, $post_id = NULL)
324
- {
325
- global $post, $wpdb, $current_user;
326
- if(!$post_id)
327
- $post_id = $post->ID;
328
-
329
- if(!$comments)
330
- return $comments; //if they are closed anyway, we don't need to check
331
-
332
- global $post, $current_user;
333
-
334
- $hasaccess = pmpro_has_membership_access(NULL, NULL, true);
335
- if(is_array($hasaccess))
336
- {
337
- //returned an array to give us the membership level values
338
- $post_membership_levels_ids = $hasaccess[1];
339
- $post_membership_levels_names = $hasaccess[2];
340
- $hasaccess = $hasaccess[0];
341
- }
342
-
343
- if($hasaccess)
344
- {
345
- //all good, return content
346
- return $comments;
347
- }
348
- else
349
- {
350
- if(!$post_membership_levels_ids)
351
- $post_membership_levels_ids = array();
352
-
353
- if(!$post_membership_levels_names)
354
- $post_membership_levels_names = array();
355
-
356
- //get the correct message
357
- if(is_feed())
358
- {
359
- if(is_array($comments))
360
- return array();
361
- else
362
- return false;
363
- }
364
- elseif($current_user->ID)
365
- {
366
- //not a member
367
- if(is_array($comments))
368
- return array();
369
- else
370
- return false;
371
- }
372
- else
373
- {
374
- //not logged in!
375
- if(is_array($comments))
376
- return array();
377
- else
378
- return false;
379
- }
380
- }
381
-
382
- return $comments;
383
- }
384
- add_filter("comments_array", "pmpro_comments_filter");
385
- add_filter("comments_open", "pmpro_comments_filter");
386
-
387
- //keep non-members from getting to certain pages (attachments, etc)
388
- function pmpro_hide_pages_redirect()
389
- {
390
- global $post;
391
-
392
- if(!is_admin() && !empty($post->ID))
393
- {
394
- if($post->post_type == "attachment")
395
- {
396
- //check if the user has access to the parent
397
- if(!pmpro_has_membership_access($post->ID))
398
- {
399
- wp_redirect(pmpro_url("levels"));
400
- exit;
401
- }
402
- }
403
- }
404
- }
405
- add_action('wp', 'pmpro_hide_pages_redirect');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/currencies.php CHANGED
@@ -10,13 +10,10 @@
10
  'AUD' => __('Australian Dollars (&#36;)', 'pmpro'),
11
  'BRL' => __('Brazilian Real (&#36;)', 'pmpro'),
12
  'CAD' => __('Canadian Dollars (&#36;)', 'pmpro'),
13
- 'CNY' => __('Chinese Yuan', 'pmpro'),
14
  'CZK' => __('Czech Koruna', 'pmpro'),
15
  'DKK' => __('Danish Krone', 'pmpro'),
16
  'HKD' => __('Hong Kong Dollar (&#36;)', 'pmpro'),
17
  'HUF' => __('Hungarian Forint', 'pmpro'),
18
- 'INR' => __('Indian Rupee', 'pmpro'),
19
- 'IDR' => __('Indonesia Rupiah', 'pmpro'),
20
  'ILS' => __('Israeli Shekel', 'pmpro'),
21
  'JPY' => __('Japanese Yen (&yen;)', 'pmpro'),
22
  'MYR' => __('Malaysian Ringgits', 'pmpro'),
@@ -26,24 +23,18 @@
26
  'PHP' => __('Philippine Pesos', 'pmpro'),
27
  'PLN' => __('Polish Zloty', 'pmpro'),
28
  'SGD' => __('Singapore Dollar (&#36;)', 'pmpro'),
29
- 'ZAR' => __('South African Rand', 'pmpro'),
30
- 'KRW' => __('South Korean Won', 'pmpro'),
31
  'SEK' => __('Swedish Krona', 'pmpro'),
32
  'CHF' => __('Swiss Franc', 'pmpro'),
33
  'TWD' => __('Taiwan New Dollars', 'pmpro'),
34
- 'THB' => __('Thai Baht', 'pmpro'),
35
- 'TRY' => __('Turkish Lira', 'pmpro'),
36
- 'VND' => __('Vietnamese Dong', 'pmpro')
37
  );
38
 
39
  $pmpro_currencies = apply_filters("pmpro_currencies", $pmpro_currencies);
40
 
41
- //stripe only supports a few (not using this anymore since 1.7.4)
42
  global $pmpro_stripe_currencies;
43
  $pmpro_stripe_currencies = array(
44
  'USD' => __('US Dollars (&#36;)', 'pmpro'),
45
- 'CAD' => __('Canadian Dollars (&#36;)', 'pmpro'),
46
- 'GBP' => __('Pounds Sterling (&pound;)', 'pmpro'),
47
- 'EUR' => __('Euros (&euro;)', 'pmpro')
48
  );
49
  ?>
10
  'AUD' => __('Australian Dollars (&#36;)', 'pmpro'),
11
  'BRL' => __('Brazilian Real (&#36;)', 'pmpro'),
12
  'CAD' => __('Canadian Dollars (&#36;)', 'pmpro'),
 
13
  'CZK' => __('Czech Koruna', 'pmpro'),
14
  'DKK' => __('Danish Krone', 'pmpro'),
15
  'HKD' => __('Hong Kong Dollar (&#36;)', 'pmpro'),
16
  'HUF' => __('Hungarian Forint', 'pmpro'),
 
 
17
  'ILS' => __('Israeli Shekel', 'pmpro'),
18
  'JPY' => __('Japanese Yen (&yen;)', 'pmpro'),
19
  'MYR' => __('Malaysian Ringgits', 'pmpro'),
23
  'PHP' => __('Philippine Pesos', 'pmpro'),
24
  'PLN' => __('Polish Zloty', 'pmpro'),
25
  'SGD' => __('Singapore Dollar (&#36;)', 'pmpro'),
 
 
26
  'SEK' => __('Swedish Krona', 'pmpro'),
27
  'CHF' => __('Swiss Franc', 'pmpro'),
28
  'TWD' => __('Taiwan New Dollars', 'pmpro'),
29
+ 'THB' => __('Thai Baht', 'pmpro')
 
 
30
  );
31
 
32
  $pmpro_currencies = apply_filters("pmpro_currencies", $pmpro_currencies);
33
 
34
+ //stripe only supports a few
35
  global $pmpro_stripe_currencies;
36
  $pmpro_stripe_currencies = array(
37
  'USD' => __('US Dollars (&#36;)', 'pmpro'),
38
+ 'CAD' => __('Canadian Dollars (&#36;)', 'pmpro')
 
 
39
  );
40
  ?>
includes/email.php DELETED
@@ -1,111 +0,0 @@
1
- <?php
2
- /*
3
- Nicer default emails
4
- */
5
- function pmpro_wp_mail_from_name($from_name)
6
- {
7
- $default_from_name = 'WordPress';
8
-
9
- //make sure it's the default from name
10
- if($from_name == $default_from_name)
11
- {
12
- $pmpro_from_name = pmpro_getOption("from_name");
13
- if ($pmpro_from_name)
14
- $from_name = $pmpro_from_name;
15
- }
16
-
17
- return $from_name;
18
- }
19
- function pmpro_wp_mail_from($from_email)
20
- {
21
- // default from email wordpress@sitename
22
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
23
- if ( substr( $sitename, 0, 4 ) == 'www.' ) {
24
- $sitename = substr( $sitename, 4 );
25
- }
26
- $default_from_email = 'wordpress@' . $sitename;
27
-
28
- //make sure it's the default email address
29
- if($from_email == $default_from_email)
30
- {
31
- $pmpro_from_email = pmpro_getOption("from_email");
32
- if ($pmpro_from_email && is_email( $pmpro_from_email ) )
33
- $from_email = $pmpro_from_email;
34
- }
35
-
36
- return $from_email;
37
- }
38
-
39
- $only_filter_pmpro_emails = pmpro_getOption("only_filter_pmpro_emails");
40
- if($only_filter_pmpro_emails)
41
- {
42
- add_filter('pmpro_email_sender_name', 'pmpro_wp_mail_from_name');
43
- add_filter('pmpro_email_sender', 'pmpro_wp_mail_from');
44
- }
45
- else
46
- {
47
- add_filter('wp_mail_from_name', 'pmpro_wp_mail_from_name');
48
- add_filter('wp_mail_from', 'pmpro_wp_mail_from');
49
- }
50
-
51
- /*
52
- If the $email_member_notification option is empty, disable the wp_new_user_notification email at checkout.
53
- */
54
- $email_member_notification = pmpro_getOption("email_member_notification");
55
- if(empty($email_member_notification))
56
- add_filter("pmpro_wp_new_user_notification", "__return_false", 0);
57
-
58
- /*
59
- Adds template files and changes content type to html if using PHPMailer directly.
60
- */
61
- function pmpro_send_html( $phpmailer ) {
62
-
63
- // Set the original plain text message
64
- $phpmailer->AltBody = wp_specialchars_decode($phpmailer->Body, ENT_QUOTES);
65
- // Clean < and > around text links in WP 3.1
66
- $phpmailer->Body = preg_replace('#<(http://[^*]+)>#', '$1', $phpmailer->Body);
67
- // Convert line breaks & make links clickable
68
- $phpmailer->Body = make_clickable ($phpmailer->Body);
69
-
70
- // Add header to message if found
71
- if(file_exists(get_stylesheet_directory() . "/email_header.html"))
72
- $phpmailer->Body = file_get_contents(get_stylesheet_directory() . "/email_header.html") . "\n" . $phpmailer->Body;
73
- elseif(file_exists(get_template_directory() . "/email_header.html"))
74
- $phpmailer->Body = file_get_contents(get_template_directory() . "/email_header.html") . "\n" . $phpmailer->Body;
75
-
76
- // Add footer to message if found
77
- if(file_exists(get_stylesheet_directory() . "/email_footer.html"))
78
- $phpmailer->Body = $phpmailer->Body . "\n" . file_get_contents(get_stylesheet_directory() . "/email_footer.html");
79
- elseif(file_exists(get_template_directory() . "/email_footer.html"))
80
- $phpmailer->Body = $phpmailer->Body . "\n" . file_get_contents(get_template_directory() . "/email_footer.html");
81
-
82
- // Replace variables in email
83
- global $current_user;
84
- $data = array(
85
- "name" => $current_user->display_name,
86
- "sitename" => get_option("blogname"),
87
- "login_link" => pmpro_url("account"),
88
- "display_name" => $current_user->display_name,
89
- "user_email" => $current_user->user_email,
90
- "subject" => $phpmailer->Subject
91
- );
92
- foreach($data as $key => $value)
93
- {
94
- $phpmailer->Body = str_replace("!!" . $key . "!!", $value, $phpmailer->Body);
95
- }
96
-
97
- do_action("pmpro_after_phpmailer_init", $phpmailer);
98
- do_action("pmpro_after_pmpmailer_init", $phpmailer); //typo left in for backwards compatibility
99
- }
100
-
101
- function pmpro_wp_mail_content_type( $content_type ) {
102
- add_action('phpmailer_init', 'pmpro_send_html');
103
-
104
- //change to html if not already
105
- if( $content_type == 'text/plain')
106
- {
107
- $content_type = 'text/html';
108
- }
109
- return $content_type;
110
- }
111
- add_filter('wp_mail_content_type', 'pmpro_wp_mail_content_type');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/filters.php CHANGED
@@ -19,7 +19,7 @@ function pmpro_checkout_level_extend_memberships($level)
19
  $expiration_date = $current_user->membership_level->enddate;
20
 
21
  //calculate days left
22
- $todays_date = current_time('timestamp');
23
  $time_left = $expiration_date - $todays_date;
24
 
25
  //time left?
@@ -62,7 +62,7 @@ function pmpro_ipnhandler_level_extend_memberships($level, $user_id)
62
  $expiration_date = $user_level->enddate;
63
 
64
  //calculate days left
65
- $todays_date = current_time('timestamp');
66
  $time_left = $expiration_date - $todays_date;
67
 
68
  //time left?
@@ -100,7 +100,7 @@ function pmpro_checkout_start_date_keep_startdate($startdate, $user_id, $level)
100
  if(pmpro_hasMembershipLevel($level->id, $user_id))
101
  {
102
  global $wpdb;
103
- $sqlQuery = "SELECT startdate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . esc_sql($user_id) . "' AND membership_id = '" . esc_sql($level->id) . "' AND status = 'active' ORDER BY id DESC LIMIT 1";
104
  $old_startdate = $wpdb->get_var($sqlQuery);
105
 
106
  if(!empty($old_startdate))
@@ -110,41 +110,3 @@ function pmpro_checkout_start_date_keep_startdate($startdate, $user_id, $level)
110
  return $startdate;
111
  }
112
  add_filter("pmpro_checkout_start_date", "pmpro_checkout_start_date_keep_startdate", 10, 3);
113
-
114
- /*
115
- Stripe Lite Pulled into Core Plugin
116
- */
117
- //Stripe Lite, Set the Globals/etc
118
- $stripe_billingaddress = pmpro_getOption("stripe_billingaddress");
119
- if(empty($stripe_billingaddress))
120
- {
121
- global $pmpro_stripe_lite;
122
- $pmpro_stripe_lite = true;
123
- add_filter("pmpro_stripe_lite", "__return_true");
124
- add_filter("pmpro_required_billing_fields", "pmpro_required_billing_fields_stripe_lite");
125
- }
126
-
127
- //Stripe Lite, Don't Require Billing Fields
128
- function pmpro_required_billing_fields_stripe_lite($fields)
129
- {
130
- global $gateway;
131
-
132
- //ignore if not using stripe
133
- if($gateway != "stripe")
134
- return $fields;
135
-
136
- //some fields to remove
137
- $remove = array('bfirstname', 'blastname', 'baddress1', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry', 'CardType');
138
-
139
- //if a user is logged in, don't require bemail either
140
- global $current_user;
141
- if(!empty($current_user->user_email))
142
- $remove[] = 'bemail';
143
-
144
- //remove the fields
145
- foreach($remove as $field)
146
- unset($fields[$field]);
147
-
148
- //ship it!
149
- return $fields;
150
- }
19
  $expiration_date = $current_user->membership_level->enddate;
20
 
21
  //calculate days left
22
+ $todays_date = time();
23
  $time_left = $expiration_date - $todays_date;
24
 
25
  //time left?
62
  $expiration_date = $user_level->enddate;
63
 
64
  //calculate days left
65
+ $todays_date = time();
66
  $time_left = $expiration_date - $todays_date;
67
 
68
  //time left?
100
  if(pmpro_hasMembershipLevel($level->id, $user_id))
101
  {
102
  global $wpdb;
103
+ $sqlQuery = "SELECT startdate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $wpdb->escape($user_id) . "' AND membership_id = '" . $wpdb->escape($level->id) . "' AND status = 'active' ORDER BY id DESC LIMIT 1";
104
  $old_startdate = $wpdb->get_var($sqlQuery);
105
 
106
  if(!empty($old_startdate))
110
  return $startdate;
111
  }
112
  add_filter("pmpro_checkout_start_date", "pmpro_checkout_start_date_keep_startdate", 10, 3);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/functions.php CHANGED
@@ -1,1742 +1,1505 @@
1
- <?php
2
- /****************************************************************
3
-
4
- IMPORTANT. PLEASE READ.
5
-
6
- DO NOT EDIT THIS FILE or any other file in the /wp-content/plugins/paid-memberships-pro/ directory.
7
- Doing so could break the PMPro plugin and/or keep you from upgrading this plugin in the future.
8
- We regularly release updates to the plugin, including important security fixes and new features.
9
- You want to be able to upgrade.
10
-
11
- If you were asked to insert code into "your functions.php file", it was meant that you edit the functions.php
12
- in the root folder of your active theme. e.g. /wp-content/themes/twentytwelve/functions.php
13
- You can also create a custom plugin to place customization code into. Instructions are here:
14
- http://www.paidmembershipspro.com/2012/08/create-a-plugin-for-pmpro-customizations/
15
-
16
- Further documentation for customizing Paid Memberships Pro can be found here:
17
- http://www.paidmembershipspro.com/documentation/
18
-
19
- ****************************************************************/
20
- if(!function_exists("sornot"))
21
- {
22
- function sornot($t, $n)
23
- {
24
- if($n == 1)
25
- return $t;
26
- else
27
- return $t . "s";
28
- }
29
- }
30
-
31
- //setup wpdb for the tables we need
32
- function pmpro_setDBTables()
33
- {
34
- global $table_prefix, $wpdb;
35
- $wpdb->hide_errors();
36
- $wpdb->pmpro_membership_levels = $table_prefix . 'pmpro_membership_levels';
37
- $wpdb->pmpro_memberships_users = $table_prefix . 'pmpro_memberships_users';
38
- $wpdb->pmpro_memberships_categories = $table_prefix . 'pmpro_memberships_categories';
39
- $wpdb->pmpro_memberships_pages = $table_prefix . 'pmpro_memberships_pages';
40
- $wpdb->pmpro_membership_orders = $table_prefix . 'pmpro_membership_orders';
41
- $wpdb->pmpro_discount_codes = $wpdb->prefix . 'pmpro_discount_codes';
42
- $wpdb->pmpro_discount_codes_levels = $wpdb->prefix . 'pmpro_discount_codes_levels';
43
- $wpdb->pmpro_discount_codes_uses = $wpdb->prefix . 'pmpro_discount_codes_uses';
44
- }
45
- pmpro_setDBTables();
46
-
47
- //from: http://stackoverflow.com/questions/5266945/wordpress-how-detect-if-current-page-is-the-login-page/5892694#5892694
48
- function pmpro_is_login_page() {
49
- return (in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php')) || is_page("login"));
50
- }
51
-
52
- //thanks: http://wordpress.org/support/topic/is_plugin_active
53
- function pmpro_is_plugin_active( $plugin ) {
54
- return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
55
- }
56
-
57
- //scraping - override n if you have more than 1 group of matches and don't want the first group
58
- function pmpro_getMatches($p, $s, $firstvalue = FALSE, $n = 1)
59
- {
60
- $ok = preg_match_all($p, $s, $matches);
61
-
62
- if(!$ok)
63
- return false;
64
- else
65
- {
66
- if($firstvalue)
67
- return $matches[$n][0];
68
- else
69
- return $matches[$n];
70
- }
71
- }
72
-
73
- function pmpro_br2nl($text, $tags = "br")
74
- {
75
- if(!is_array($tags))
76
- $tags = explode(" ", $tags);
77
-
78
- foreach($tags as $tag)
79
- {
80
- $text = eregi_replace("<" . $tag . "[^>]*>", "\n", $text);
81
- $text = eregi_replace("</" . $tag . "[^>]*>", "\n", $text);
82
- }
83
-
84
- return($text);
85
- }
86
-
87
- function pmpro_getOption($s, $force = false)
88
- {
89
- if(isset($_REQUEST[$s]) && !$force)
90
- {
91
- if(!is_array($_REQUEST[$s]))
92
- return trim($_REQUEST[$s]);
93
- else
94
- return $_REQUEST[$s];
95
- }
96
- elseif(get_option("pmpro_" . $s))
97
- return get_option("pmpro_" . $s);
98
- else
99
- return "";
100
- }
101
-
102
- function pmpro_setOption($s, $v = NULL)
103
- {
104
- //no value is given, set v to the request var
105
- if($v === NULL && isset($_REQUEST[$s]))
106
- $v = $_REQUEST[$s];
107
-
108
- if(is_array($v))
109
- $v = implode(",", $v);
110
- else
111
- $v = trim($v);
112
-
113
- return update_option("pmpro_" . $s, $v);
114
- }
115
-
116
- function pmpro_get_slug($post_id)
117
- {
118
- global $pmpro_slugs, $wpdb;
119
- if(!$pmpro_slugs[$post_id])
120
- $pmpro_slugs[$post_id] = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE ID = '" . $post_id . "' LIMIT 1");
121
-
122
- return $pmpro_slugs[$post_id];
123
- }
124
-
125
- function pmpro_url($page = NULL, $querystring = "", $scheme = NULL)
126
- {
127
- global $besecure;
128
- $besecure = apply_filters("besecure", $besecure);
129
-
130
- if(!$scheme && $besecure)
131
- $scheme = "https";
132
- elseif(!$scheme)
133
- $scheme = "http";
134
-
135
- if(!$page)
136
- $page = "levels";
137
-
138
- global $pmpro_pages;
139
-
140
- //start with the permalink
141
- $url = get_permalink($pmpro_pages[$page]);
142
-
143
- //WPML/etc support
144
- if(function_exists("icl_object_id") && defined("ICL_LANGUAGE_CODE"))
145
- {
146
- $trans_id = icl_object_id($pmpro_pages[$page], "page", false, ICL_LANGUAGE_CODE);
147
- if(!empty($trans_id))
148
- {
149
- $url = get_permalink($trans_id);
150
- }
151
- }
152
-
153
- //figure out querystring
154
- if(strpos($url, "?"))
155
- $querystring = str_replace("?", "&", $querystring);
156
- $url .= $querystring;
157
-
158
- //figure out scheme
159
- if(is_ssl())
160
- $url = str_replace("http:", "https:", $url);
161
-
162
- return $url;
163
- }
164
-
165
- function pmpro_isLevelFree(&$level)
166
- {
167
- if(!empty($level) && $level->initial_payment <= 0 && $level->billing_amount <= 0 && $level->trial_amount <= 0)
168
- return true;
169
- else
170
- return false;
171
- }
172
-
173
- function pmpro_isLevelRecurring(&$level)
174
- {
175
- if(!empty($level) && ($level->billing_amount > 0 || $level->trial_amount > 0))
176
- return true;
177
- else
178
- return false;
179
- }
180
-
181
- function pmpro_isLevelTrial(&$level)
182
- {
183
- if($level->trial_limit > 0)
184
- {
185
- return true;
186
- }
187
- else
188
- return false;
189
- }
190
-
191
- function pmpro_isLevelExpiring(&$level)
192
- {
193
- if($level->expiration_number > 0)
194
- return true;
195
- else
196
- return false;
197
- }
198
-
199
- function pmpro_getLevelCost(&$level, $tags = true, $short = false)
200
- {
201
- global $pmpro_currency_symbol;
202
- //initial payment
203
- if(!$short)
204
- $r = sprintf(__('The price for membership is <strong>%s</strong> now', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2));
205
- else
206
- $r = sprintf(__('<strong>%s</strong> now', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2));
207
-
208
- //recurring part
209
- if($level->billing_amount != '0.00')
210
- {
211
- if($level->billing_limit > 1)
212
- {
213
- if($level->cycle_number == '1')
214
- {
215
- $r .= sprintf(__(' and then <strong>%s per %s for %d more %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, pmpro_translate_billing_period($level->cycle_period), $level->billing_limit, pmpro_translate_billing_period($level->cycle_period, $level->billing_limit));
216
- }
217
- else
218
- {
219
- $r .= sprintf(__(' and then <strong>%s every %d %s for %d more %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number), $level->billing_limit, pmpro_translate_billing_period($level->cycle_period, $level->billing_limit));
220
- }
221
- }
222
- elseif($level->billing_limit == 1)
223
- {
224
- $r .= sprintf(__(' and then <strong>%s after %d %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number));
225
- }
226
- else
227
- {
228
- if( $level->billing_amount === $level->initial_payment ) {
229
- if($level->cycle_number == '1')
230
- {
231
- $r = sprintf(__('The price for membership is <strong>%s per %s</strong>.', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2), pmpro_translate_billing_period($level->cycle_period) );
232
- }
233
- else
234
- {
235
- $r = sprintf(__('The price for membership is <strong>%s every %d %s</strong>.', 'pmpro'), $pmpro_currency_symbol . number_format($level->initial_payment, 2), $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number) );
236
- }
237
- } else {
238
- if($level->cycle_number == '1')
239
- {
240
- $r .= sprintf(__(' and then <strong>%s per %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, pmpro_translate_billing_period($level->cycle_period));
241
- }
242
- else
243
- {
244
- $r .= sprintf(__(' and then <strong>%s every %d %s</strong>.', 'pmpro'), $pmpro_currency_symbol . $level->billing_amount, $level->cycle_number, pmpro_translate_billing_period($level->cycle_period, $level->cycle_number));
245
- }
246
- }
247
- }
248
- }
249
- else
250
- $r .= '.';
251
-
252
- //add a space
253
- $r .= ' ';
254
-
255
- //trial part
256
- if($level->trial_limit)
257
- {
258
- if($level->trial_amount == '0.00')
259
- {
260
- if($level->trial_limit == '1')
261
- {
262
- $r .= ' ' . __('After your initial payment, your first payment is Free.', 'pmpro');
263
- }
264
- else
265
- {
266
- $r .= ' ' . sprintf(__('After your initial payment, your first %d payments are Free.', 'pmpro'), $level->trial_limit);
267
- }
268
- }
269
- else
270
- {
271
- if($level->trial_limit == '1')
272
- {
273
- $r .= ' ' . sprintf(__('After your initial payment, your first payment will cost %s.', 'pmpro'), $pmpro_currency_symbol . $level->trial_amount);
274
- }
275
- else
276
- {
277
- $r .= ' ' . sprintf(__('After your initial payment, your first %d payments will cost %s.', 'pmpro'), $level->trial_limit, $pmpro_currency_symbol . $level->trial_amount);
278
- }
279
- }
280
- }
281
-
282
- //taxes part
283
- $tax_state = pmpro_getOption("tax_state");
284
- $tax_rate = pmpro_getOption("tax_rate");
285
-
286
- if($tax_state && $tax_rate && !pmpro_isLevelFree($level))
287
- {
288
- $r .= sprintf(__('Customers in %s will be charged %s%% tax.', 'pmpro'), $tax_state, round($tax_rate * 100, 2));
289
- }
290
-
291
- if(!$tags)
292
- $r = strip_tags($r);
293
-
294
- $r = apply_filters("pmpro_level_cost_text", $r, $level);
295
- return $r;
296
- }
297
-
298
- function pmpro_getLevelExpiration(&$level)
299
- {
300
- if($level->expiration_number)
301
- {
302
- $expiration_text = sprintf(__("Membership expires after %d %s.", "pmpro"), $level->expiration_number, pmpro_translate_billing_period($level->expiration_period, $level->expiration_number));
303
- }
304
- else
305
- $expiration_text = "";
306
-
307
- $expiration_text = apply_filters("pmpro_level_expiration_text", $expiration_text, $level);
308
- return $expiration_text;
309
- }
310
-
311
- function pmpro_hideAds()
312
- {
313
- global $pmpro_display_ads;
314
- return !$pmpro_display_ads;
315
- }
316
-
317
- function pmpro_displayAds()
318
- {
319
- global $pmpro_display_ads;
320
- return $pmpro_display_ads;
321
- }
322
-
323
- function pmpro_next_payment($user_id = NULL, $order_status = "success")
324
- {
325
- global $wpdb, $current_user;
326
- if(!$user_id)
327
- $user_id = $current_user->ID;
328
-
329
- if(!$user_id)
330
- return false;
331
-
332
- //get last order
333
- $order = new MemberOrder();
334
- $order->getLastMemberOrder($user_id, $order_status);
335
-
336
- //get current membership level
337
- $level = pmpro_getMembershipLevelForUser($user_id);
338
-
339
- if(!empty($order) && !empty($level) && !empty($level->cycle_number))
340
- {
341
- //last payment date
342
- $lastdate = date("Y-m-d", $order->timestamp);
343
-
344
- //next payment date
345
- $nextdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP('" . $lastdate . "' + INTERVAL " . $level->cycle_number . " " . $level->cycle_period . ")");
346
-
347
- return $nextdate;
348
- }
349
- else
350
- {
351
- //no order or level found, or level was not recurring
352
- return false;
353
- }
354
- }
355
-
356
- if(!function_exists("last4"))
357
- {
358
- function last4($t)
359
- {
360
- return substr($t, strlen($t) - 4, 4);
361
- }
362
- }
363
-
364
- if(!function_exists("hideCardNumber"))
365
- {
366
- function hideCardNumber($c, $dashes = true)
367
- {
368
- if($c)
369
- {
370
- if($dashes)
371
- return "XXXX-XXXX-XXXX-" . substr($c, strlen($c) - 4, 4);
372
- else
373
- return "XXXXXXXXXXXX" . substr($c, strlen($c) - 4, 4);
374
- }
375
- else
376
- {
377
- return "";
378
- }
379
- }
380
- }
381
-
382
- if(!function_exists("cleanPhone"))
383
- {
384
- function cleanPhone($phone)
385
- {
386
- //if a + is passed, just pass it along
387
- if(strpos($phone, "+") !== false)
388
- return $phone;
389
-
390
- //clean the phone
391
- $phone = str_replace("-", "", $phone);
392
- $phone = str_replace(".", "", $phone);
393
- $phone = str_replace("(", "", $phone);
394
- $phone = str_replace(")", "", $phone);
395
- $phone = str_replace(" ", "", $phone);
396
-
397
- return $phone;
398
- }
399
- }
400
-
401
- if(!function_exists("formatPhone"))
402
- {
403
- function formatPhone($phone)
404
- {
405
- $phone = cleanPhone($phone);
406
-
407
- if(strlen($phone) == 11)
408
- return substr($phone, 0, 1) . " (" . substr($phone, 1, 3) . ") " . substr($phone, 4, 3) . "-" . substr($phone, 7, 4);
409
- elseif(strlen($phone) == 10)
410
- return "(" . substr($phone, 0, 3) . ") " . substr($phone, 3, 3) . "-" . substr($phone, 6, 4);
411
- elseif(strlen($phone) == 7)
412
- return substr($phone, 0, 3) . "-" . substr($phone, 3, 4);
413
- else
414
- return $phone;
415
- }
416
- }
417
-
418
- function pmpro_showRequiresMembershipMessage()
419
- {
420
- //get the correct message
421
- if(is_feed())
422
- {
423
- $content = pmpro_getOption("rsstext");
424
- $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
425
- }
426
- elseif($current_user->ID)
427
- {
428
- //not a member
429
- $content = pmpro_getOption("nonmembertext");
430
- $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
431
- }
432
- else
433
- {
434
- //not logged in!
435
- $content = pmpro_getOption("notloggedintext");
436
- $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
437
- }
438
- }
439
-
440
- /* pmpro_hasMembershipLevel() checks if the passed user is a member of the passed level
441
- *
442
- * $level may either be the ID or name of the desired membership_level. (or an array of such)
443
- * If $user_id is omitted, the value will be retrieved from $current_user.
444
- *
445
- * Return values:
446
- * Success returns boolean true.
447
- * Failure returns a string containing the error message.
448
- */
449
- function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
450
- {
451
- global $current_user, $all_membership_levels, $wpdb;
452
-
453
- $return = false;
454
-
455
- if(empty($user_id)) //no user_id passed, check the current user
456
- {
457
- $user_id = $current_user->ID;
458
- $membership_levels = $current_user->membership_levels;
459
- }
460
- else //get membership levels for given user
461
- {
462
- $membership_levels = pmpro_getMembershipLevelsForUser($user_id);
463
- }
464
-
465
- if($levels === "0" || $levels === 0) //if 0 was passed, return true if they have no level and false if they have any
466
- {
467
- $return = empty($membership_levels);
468
- }
469
- elseif(empty($levels)) //if no level var was passed, we're just checking if they have any level
470
- {
471
- $return = !empty($membership_levels);
472
- }
473
- else
474
- {
475
- if(!is_array($levels)) //make an array out of a single element so we can use the same code
476
- {
477
- $levels = array($levels);
478
- }
479
-
480
- if(empty($membership_levels))
481
- {
482
- //user has no levels just check if 0 was sent in one of the levels
483
- if(in_array(0, $levels) || in_array("0", $levels))
484
- $return = true;
485
- }
486
- else
487
- {
488
- foreach($levels as $level)
489
- {
490
- $level_obj = pmpro_getLevel(is_numeric($level) ? abs(intval($level)) : $level); //make sure our level is in a proper format
491
- if(empty($level_obj)){continue;} //invalid level
492
- $found_level = false;
493
- foreach($membership_levels as $membership_level)
494
- {
495
- if($membership_level->id == $level_obj->id) //found a match
496
- {
497
- $found_level = true;
498
- }
499
- }
500
-
501
- if(is_numeric($level) and intval($level) < 0 and !$found_level) //checking for the absence of this level
502
- {
503
- $return = true;
504
- }
505
- else if($found_level) //checking for the presence of this level
506
- {
507
- $return = true;
508
- }
509
- }
510
- }
511
- }
512
-
513
- $return = apply_filters("pmpro_has_membership_level", $return, $user_id, $levels);
514
- return $return;
515
- }
516
-
517
- /* pmpro_changeMembershipLevel() creates or updates the membership level of the given user to the given level.
518
- *
519
- * $level may either be the ID or name of the desired membership_level.
520
- * If $user_id is omitted, the value will be retrieved from $current_user.
521
- *
522
- * Return values:
523
- * Success returns boolean true.
524
- * Failure returns boolean false.
525
- */
526
- function pmpro_changeMembershipLevel($level, $user_id = NULL)
527
- {
528
- global $wpdb;
529
- global $current_user, $pmpro_error;
530
-
531
- if(empty($user_id))
532
- {
533
- $user_id = $current_user->ID;
534
- }
535
-
536
- if(empty($user_id))
537
- {
538
- $pmpro_error = __("User ID not found.", "pmpro");
539
- return false;
540
- }
541
-
542
- if(empty($level)) //cancelling membership
543
- {
544
- $level = 0;
545
- }
546
- else if(is_array($level))
547
- {
548
- //custom level
549
- }
550
- else
551
- {
552
- $level_obj = pmpro_getLevel($level);
553
- if(empty($level_obj))
554
- {
555
- $pmpro_error = __("Invalid level.", "pmpro");
556
- return false;
557
- }
558
- $level = $level_obj->id;
559
- }
560
-
561
- //if it's a custom level, they're changing
562
- if(!is_array($level))
563
- {
564
- //are they even changing?
565
- if(pmpro_hasMembershipLevel($level, $user_id)) {
566
- $pmpro_error = __("not changing?", "pmpro");
567
- return false; //not changing
568
- }
569
- }
570
-
571
- $old_levels = pmpro_getMembershipLevelsForUser($user_id);
572
-
573
- $pmpro_cancel_previous_subscriptions = apply_filters("pmpro_cancel_previous_subscriptions", true);
574
- if($pmpro_cancel_previous_subscriptions)
575
- {
576
- //deactivate old memberships (updates pmpro_memberships_users table)
577
- if(!empty($old_levels))
578
- {
579
- foreach($old_levels as $old_level) {
580
- $sql = "UPDATE $wpdb->pmpro_memberships_users SET `status`='inactive', `enddate`='" . current_time('mysql') . "' WHERE `id`=".$old_level->subscription_id;
581
- if(!$wpdb->query($sql))
582
- {
583
- $pmpro_error = __("Error interacting with database", "pmpro") . ": ".(mysql_errno()?mysql_error():'unavailable');
584
- return false;
585
- }
586
- }
587
- }
588
-
589
- //cancel any other subscriptions they have (updates pmpro_membership_orders table)
590
- $other_order_ids = $wpdb->get_col("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' AND status = 'success' ORDER BY id DESC");
591
-
592
- foreach($other_order_ids as $order_id)
593
- {
594
- $c_order = new MemberOrder($order_id);
595
- $c_order->cancel();
596
-
597
- if(!empty($c_order->error))
598
- $pmpro_error = $c_order->error;
599
- }
600
- }
601
-
602
- //insert current membership
603
- if(!empty($level)) //are we getting a new one or just cancelling the old ones
604
- {
605
- if(is_array($level))
606
- {
607
- //make sure the dates are in good formats
608
- if($level['startdate'] != current_time('mysql') && $level['startdate'] != "NULL" && substr($level['startdate'], 0, 1) != "'")
609
- $level['startdate'] = "'" . $level['startdate'] . "'";
610
-
611
- if($level['enddate'] != current_time('mysql') && $level['enddate'] != "NULL" && substr($level['enddate'], 0, 1) != "'")
612
- $level['enddate'] = "'" . $level['enddate'] . "'";
613
-
614
- //Better support mySQL Strict Mode by passing a proper enum value for cycle_period
615
- if ($level['cycle_period'] == '') $level['cycle_period'] = 0;
616
-
617
- $sql = "INSERT INTO $wpdb->pmpro_memberships_users (user_id, membership_id, code_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, startdate, enddate)
618
- VALUES('" . $level['user_id'] . "',
619
- '" . $level['membership_id'] . "',
620
- '" . intval($level['code_id']) . "',
621
- '" . $level['initial_payment'] . "',
622
- '" . $level['billing_amount'] . "',
623
- '" . $level['cycle_number'] . "',
624
- '" . $level['cycle_period'] . "',
625
- '" . $level['billing_limit'] . "',
626
- '" . $level['trial_amount'] . "',
627
- '" . $level['trial_limit'] . "',
628
- " . $level['startdate'] . ",
629
- " . $level['enddate'] . ")";
630
-
631
- if(!$wpdb->query($sql))
632
- {
633
- $pmpro_error = __("Error interacting with database", "pmpro") . ": ".(mysql_errno()?mysql_error():'unavailable');
634
- return false;
635
- }
636
- }
637
- else
638
- {
639
- $sql = "INSERT INTO $wpdb->pmpro_memberships_users (user_id, membership_id, code_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, startdate, enddate)
640
- VALUES (
641
- '" . $user_id . "',
642
- '" . $level . "',
643
- '0',
644
- '0',
645
- '0',
646
- '0',
647
- '0',
648
- '0',
649
- '0',
650
- '0',
651
- '" . current_time('mysql') . "',
652
- '0000-00-00 00:00:00'
653
- )";
654
-
655
- if(!$wpdb->query($sql))
656
- {
657
- $pmpro_error = __("Error interacting with database", "pmpro") . ": ".(mysql_errno()?mysql_error():'unavailable');
658
- return false;
659
- }
660
- }
661
- }
662
-
663
- //get level id
664
- if(is_array($level))
665
- $level_id = $level['membership_id']; //custom level
666
- else
667
- $level_id = $level; //just id
668
-
669
- //remove cached level
670
- global $all_membership_levels;
671
- unset($all_membership_levels[$user_id]);
672
-
673
- //update user data and call action
674
- pmpro_set_current_user();
675
- do_action("pmpro_after_change_membership_level", $level_id, $user_id); //$level is the $level_id here
676
- return true;
677
- }
678
-
679
- /* pmpro_toggleMembershipCategory() creates or deletes a linking entry between the membership level and post category tables.
680
- *
681
- * $level may either be the ID or name of the desired membership_level.
682
- * $category must be a valid post category ID.
683
- *
684
- * Return values:
685
- * Success returns boolean true.
686
- * Failure returns a string containing the error message.
687
- */
688
- function pmpro_toggleMembershipCategory( $level, $category, $value )
689
- {
690
- global $wpdb;
691
- $category = intval($category);
692
-
693
- if ( ($level = intval($level)) <= 0 )
694
- {
695
- $safe = addslashes($level);
696
- if ( ($level = intval($wpdb->get_var("SELECT id FROM {$wpdb->pmpro_membership_levels} WHERE name = '$safe' LIMIT 1"))) <= 0 )
697
- {
698
- return __("Membership level not found.", "pmpro");
699
- }
700
- }
701
-
702
- if ( $value )
703
- {
704
- $sql = "REPLACE INTO {$wpdb->pmpro_memberships_categories} (`membership_id`,`category_id`) VALUES ('$level','$category')";
705
- $wpdb->query($sql);
706
- if(mysql_errno()) return mysql_error();
707
- }
708
- else
709
- {
710
- $sql = "DELETE FROM {$wpdb->pmpro_memberships_categories} WHERE `membership_id` = '$level' AND `category_id` = '$category' LIMIT 1";
711
- $wpdb->query($sql);
712
- if(mysql_errno()) return mysql_error();
713
- }
714
-
715
- return true;
716
- }
717
-
718
- /* pmpro_updateMembershipCategories() ensures that all those and only those categories given
719
- * are associated with the given membership level.
720
- *
721
- * $level is a valid membership level ID or name
722
- * $categories is an array of post category IDs
723
- *
724
- * Return values:
725
- * Success returns boolean true.
726
- * Failure returns a string containing the error message.
727
- */
728
- function pmpro_updateMembershipCategories($level, $categories)
729
- {
730
- global $wpdb;
731
-
732
- if(!is_numeric($level))
733
- {
734
- $level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE name = '" . esc_sql($level) . "' LIMIT 1");
735
- if(empty($level))
736
- {
737
- return __("Membership level not found.", "pmpro");
738
- }
739
- }
740
-
741
- // remove all existing links...
742
- $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE `membership_id` = '" . esc_sql($level) . "'";
743
- $wpdb->query($sqlQuery);
744
- if(mysql_errno()) return mysql_error();
745
-
746
- // add the given links [back?] in...
747
- foreach($categories as $cat)
748
- {
749
- if(is_string($r = pmpro_toggleMembershipCategory( $level, $cat, true)))
750
- {
751
- //uh oh, error
752
- return $r;
753
- }
754
- }
755
-
756
- //all good
757
- return true;
758
- }
759
-
760
- /* pmpro_getMembershipCategories() returns the categories for a given level
761
- *
762
- * $level_id is a valid membership level ID
763
- *
764
- * Return values:
765
- * Success returns boolean true.
766
- * Failure returns boolean false.
767
- */
768
- function pmpro_getMembershipCategories($level_id)
769
- {
770
- global $wpdb;
771
- $categories = $wpdb->get_col("SELECT c.category_id
772
- FROM {$wpdb->pmpro_memberships_categories} AS c
773
- WHERE c.membership_id = '" . $level_id . "'");
774
-
775
- return $categories;
776
- }
777
-
778
-
779
- function pmpro_isAdmin($user_id = NULL)
780
- {
781
- global $current_user, $wpdb;
782
- if(!$user_id)
783
- $user_id = $current_user->ID;
784
-
785
- if(!$user_id)
786
- return false;
787
-
788
- $admincap = user_can($user_id, "manage_options");
789
- if($admincap)
790
- return true;
791
- else
792
- return false;
793
- }
794
-
795
- function pmpro_replaceUserMeta($user_id, $meta_keys, $meta_values, $prev_values = NULL)
796
- {
797
- //expects all arrays for last 3 params or all strings
798
- if(!is_array($meta_keys))
799
- {
800
- $meta_keys = array($meta_keys);
801
- $meta_values = array($meta_values);
802
- $prev_values = array($prev_values);
803
- }
804
-
805
- for($i = 0; $i < count($meta_values); $i++)
806
- {
807
- if($prev_values[$i])
808
- {
809
- update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $prev_values[$i]);
810
- }
811
- else
812
- {
813
- $old_value = get_user_meta($user_id, $meta_keys[$i], true);
814
- if($old_value)
815
- {
816
- update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $old_value);
817
- }
818
- else
819
- {
820
- update_user_meta($user_id, $meta_keys[$i], $meta_values[$i]);
821
- }
822
- }
823
- }
824
-
825
- return $i;
826
- }
827
-
828
- function pmpro_getMetavalues($query)
829
- {
830
- global $wpdb;
831
-
832
- $results = $wpdb->get_results($query);
833
- $r = new stdClass();
834
- foreach($results as $result)
835
- {
836
- $r->{$result->key} = $result->value;
837
- }
838
-
839
- return $r;
840
- }
841
-
842
- //function to return the pagination string
843
- function pmpro_getPaginationString($page = 1, $totalitems, $limit = 15, $adjacents = 1, $targetpage = "/", $pagestring = "&pn=")
844
- {
845
- //defaults
846
- if(!$adjacents) $adjacents = 1;
847
- if(!$limit) $limit = 15;
848
- if(!$page) $page = 1;
849
- if(!$targetpage) $targetpage = "/";
850
-
851
- //other vars
852
- $prev = $page - 1; //previous page is page - 1
853
- $next = $page + 1; //next page is page + 1
854
- $lastpage = ceil($totalitems / $limit); //lastpage is = total items / items per page, rounded up.
855
- $lpm1 = $lastpage - 1; //last page minus 1
856
-
857
- /*
858
- Now we apply our rules and draw the pagination object.
859
- We're actually saving the code to a variable in case we want to draw it more than once.
860
- */
861
- $pagination = "";
862
- if($lastpage > 1)
863
- {
864
- $pagination .= "<div class=\"pmpro_pagination\"";
865
- if(!empty($margin) || !empty($padding))
866
- {
867
- $pagination .= " style=\"";
868
- if($margin)
869
- $pagination .= "margin: $margin;";
870
- if($padding)
871
- $pagination .= "padding: $padding;";
872
- $pagination .= "\"";
873
- }
874
- $pagination .= ">";
875
-
876
- //previous button
877
- if ($page > 1)
878
- $pagination .= "<a href=\"$targetpage$pagestring$prev\">&laquo; prev</a>";
879
- else
880
- $pagination .= "<span class=\"disabled\">&laquo; prev</span>";
881
-
882
- //pages
883
- if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
884
- {
885
- for ($counter = 1; $counter <= $lastpage; $counter++)
886
- {
887
- if ($counter == $page)
888
- $pagination .= "<span class=\"current\">$counter</span>";
889
- else
890
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
891
- }
892
- }
893
- elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some
894
- {
895
- //close to beginning; only hide later pages
896
- if($page < 1 + ($adjacents * 3))
897
- {
898
- for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
899
- {
900
- if ($counter == $page)
901
- $pagination .= "<span class=\"current\">$counter</span>";
902
- else
903
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
904
- }
905
- $pagination .= "...";
906
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
907
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
908
- }
909
- //in middle; hide some front and some back
910
- elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
911
- {
912
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
913
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
914
- $pagination .= "...";
915
- for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
916
- {
917
- if ($counter == $page)
918
- $pagination .= "<span class=\"current\">$counter</span>";
919
- else
920
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
921
- }
922
- $pagination .= "...";
923
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
924
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
925
- }
926
- //close to end; only hide early pages
927
- else
928
- {
929
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
930
- $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
931
- $pagination .= "...";
932
- for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
933
- {
934
- if ($counter == $page)
935
- $pagination .= "<span class=\"current\">$counter</span>";
936
- else
937
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
938
- }
939
- }
940
- }
941
-
942
- //next button
943
- if ($page < $counter - 1)
944
- $pagination .= "<a href=\"" . $targetpage . $pagestring . $next . "\">next &raquo;</a>";
945
- else
946
- $pagination .= "<span class=\"disabled\">next &raquo;</span>";
947
- $pagination .= "</div>\n";
948
- }
949
-
950
- return $pagination;
951
-
952
- }
953
-
954
- function pmpro_calculateInitialPaymentRevenue($s = NULL, $l = NULL)
955
- {
956
- global $wpdb;
957
-
958
- //if we're limiting users by search
959
- if($s || $l)
960
- {
961
- $user_ids_query = "SELECT u.ID 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 WHERE mu.status = 'active' ";
962
- if($s)
963
- $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
964
- if($l)
965
- $user_ids_query .= "AND mu.membership_id = '$l' ";
966
- }
967
-
968
- //query to sum initial payments
969
- $sqlQuery = "SELECT SUM(initial_payment) FROM $wpdb->pmpro_memberships_users WHERE `status` = 'active' ";
970
- if(!empty($user_ids_query))
971
- $sqlQuery .= "AND user_id IN(" . $user_ids_query . ") ";
972
-
973
- $total = $wpdb->get_var($sqlQuery);
974
-
975
- return (double)$total;
976
- }
977
-
978
- function pmpro_calculateRecurringRevenue($s, $l)
979
- {
980
- global $wpdb;
981
-
982
- //if we're limiting users by search
983
- if($s || $l)
984
- {
985
- $user_ids_query = "AND user_id IN(SELECT u.ID 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 WHERE mu.status = 'active' ";
986
- if($s)
987
- $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
988
- if($l)
989
- $user_ids_query .= "AND mu.membership_id = '$l' ";
990
- $user_ids_query .= ")";
991
- }
992
- else
993
- $user_ids_query = "";
994
-
995
- //4 queries to get annual earnings for each cycle period. currently ignoring trial periods and billing limits.
996
- $sqlQuery = "
997
- SELECT SUM((12/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Month' AND cycle_number <> 12 $user_ids_query
998
- UNION
999
- SELECT SUM((365/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Day' AND cycle_number <> 365 $user_ids_query
1000
- UNION
1001
- SELECT SUM((52/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Week' AND cycle_number <> 52 $user_ids_query
1002
- UNION
1003
- SELECT SUM(billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Year' $user_ids_query
1004
- ";
1005
-
1006
- $annual_revenues = $wpdb->get_col($sqlQuery);
1007
-
1008
- $total = 0;
1009
- foreach($annual_revenues as $r)
1010
- {
1011
- $total += $r;
1012
- }
1013
-
1014
- return $total;
1015
- }
1016
-
1017
- function pmpro_generateUsername($firstname = "", $lastname = "", $email = "")
1018
- {
1019
- global $wpdb;
1020
-
1021
- //try first initial + last name, firstname, lastname
1022
- $firstname = preg_replace("/[^A-Za-z]/", "", $firstname);
1023
- $lastname = preg_replace("/[^A-Za-z]/", "", $lastname);
1024
- if($firstname && $lastname)
1025
- {
1026
- $username = substr($firstname, 0, 1) . $lastname;
1027
- }
1028
- elseif($firstname)
1029
- {
1030
- $username = $firstname;
1031
- }
1032
- elseif($lastname)
1033
- {
1034
- $username = $lastname;
1035
- }
1036
-
1037
- //is it taken?
1038
- $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
1039
-
1040
- if(!$taken)
1041
- return $username;
1042
-
1043
- //try the beginning of the email address
1044
- $emailparts = explode("@", "email");
1045
- if(is_array($emailparts))
1046
- $email = preg_replace("/[^A-Za-z]/", "", $emailparts[0]);
1047
-
1048
- if($email)
1049
- {
1050
- $username = $email;
1051
- }
1052
-
1053
- //is this taken? if not, add numbers until it works
1054
- $taken = true;
1055
- $count = 0;
1056
- while($taken)
1057
- {
1058
- //add a # to the end
1059
- if($count)
1060
- {
1061
- $username = preg_replace("/[0-9]/", "", $username) . $count;
1062
- }
1063
-
1064
- //taken?
1065
- $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
1066
-
1067
- //increment the number
1068
- $count++;
1069
- }
1070
-
1071
- //must have a good username now
1072
- return $username;
1073
- }
1074
-
1075
- //get a new random code for discount codes
1076
- function pmpro_getDiscountCode($seed = NULL)
1077
- {
1078
- global $wpdb;
1079
-
1080
- while(empty($code))
1081
- {
1082
- $scramble = md5(AUTH_KEY . current_time('timestamp') . $seed . SECURE_AUTH_KEY);
1083
- $code = substr($scramble, 0, 10);
1084
- $check = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE code = '$code' LIMIT 1");
1085
- if($check || is_numeric($code))
1086
- $code = NULL;
1087
- }
1088
-
1089
- return strtoupper($code);
1090
- }
1091
-
1092
- //is a discount code valid
1093
- function pmpro_checkDiscountCode($code, $level_id = NULL, $return_errors = false)
1094
- {
1095
- global $wpdb;
1096
-
1097
- $error = false;
1098
-
1099
- //no code, no code
1100
- if(empty($code))
1101
- $error = __("No code was given to check.", "pmpro");
1102
-
1103
- //get code from db
1104
- if(!$error)
1105
- {
1106
- $dbcode = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE code ='" . $code . "' LIMIT 1");
1107
-
1108
- //did we find it?
1109
- if(empty($dbcode->id))
1110
- $error = __("The discount code could not be found.", "pmpro");
1111
- }
1112
-
1113
- //check if the code has started
1114
- if(!$error)
1115
- {
1116
- //fix the date timestamps
1117
- $dbcode->starts = strtotime(date("m/d/Y", $dbcode->starts));
1118
- $dbcode->expires = strtotime(date("m/d/Y", $dbcode->expires));
1119
-
1120
- //today
1121
- $today = strtotime(date("m/d/Y 00:00:00", current_time("timestamp")));
1122
-
1123
- //has this code started yet?
1124
- if(!empty($dbcode->starts) && $dbcode->starts > $today)
1125
- $error = sprintf(__("This discount code goes into effect on %s.", "pmpro"), date(get_option('date_format'), $dbcode->starts));
1126
- }
1127
-
1128
- //check if the code is expired
1129
- if(!$error)
1130
- {
1131
- if(!empty($dbcode->expires) && $dbcode->expires < $today)
1132
- $error = sprintf(__("This discount code expired on %s.", "pmpro"), date(get_option('date_format'), $dbcode->expires));
1133
- }
1134
-
1135
- //have we run out of uses?
1136
- if(!$error)
1137
- {
1138
- if($dbcode->uses > 0)
1139
- {
1140
- $used = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $dbcode->id . "'");
1141
- if($used >= $dbcode->uses)
1142
- $error = __("This discount code is no longer valid.", "pmpro");
1143
- }
1144
- }
1145
-
1146
- //if a level was passed check if this code applies
1147
- if(!$error)
1148
- {
1149
- $pmpro_check_discount_code_levels = apply_filters("pmpro_check_discount_code_levels", true, $dbcode->id);
1150
- if(!empty($level_id) && $pmpro_check_discount_code_levels)
1151
- {
1152
- $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $dbcode->id . "' AND cl.level_id = '" . $level_id . "' LIMIT 1");
1153
-
1154
- if(empty($code_level))
1155
- $error = __("This discount code does not apply to this membership level.", "pmpro");
1156
- }
1157
- }
1158
-
1159
- //allow filter
1160
- $pmpro_check_discount_code = apply_filters("pmpro_check_discount_code", !$error, $dbcode, $level_id, $code);
1161
- if(is_string($pmpro_check_discount_code))
1162
- $error = $pmpro_check_discount_code; //string returned, this is an error
1163
- elseif(!$pmpro_check_discount_code && !$error)
1164
- $error = true; //no error before, but filter returned error
1165
- elseif($pmpro_check_discount_code)
1166
- $error = false; //filter is true, so error false
1167
-
1168
- //return
1169
- if($error)
1170
- {
1171
- //there was an error
1172
- if(!empty($return_errors))
1173
- return array(false, $error);
1174
- else
1175
- return false;
1176
- }
1177
- else
1178
- {
1179
- //guess we're all good
1180
- if(!empty($return_errors))
1181
- return array(true, __("This discount code is okay.", "pmpro"));
1182
- else
1183
- return true;
1184
- }
1185
- }
1186
-
1187
- function pmpro_no_quotes($s, $quotes = array("'", '"'))
1188
- {
1189
- return str_replace($quotes, "", $s);
1190
- }
1191
-
1192
- //from: http://www.php.net/manual/en/function.implode.php#86845
1193
- function pmpro_implodeToEnglish($array)
1194
- {
1195
- // sanity check
1196
- if (!$array || !count ($array))
1197
- return '';
1198
-
1199
- // get last element
1200
- $last = array_pop ($array);
1201
-
1202
- // if it was the only element - return it
1203
- if (!count ($array))
1204
- return $last;
1205
-
1206
- return implode (', ', $array).' ' . __('and', 'pmpro') . ' '.$last;
1207
- }
1208
-
1209
- //from yoast wordpress seo
1210
- function pmpro_text_limit( $text, $limit, $finish = '&hellip;')
1211
- {
1212
- if( strlen( $text ) > $limit ) {
1213
- $text = substr( $text, 0, $limit );
1214
- $text = substr( $text, 0, - ( strlen( strrchr( $text,' ') ) ) );
1215
- $text .= $finish;
1216
- }
1217
- return $text;
1218
- }
1219
-
1220
- /* pmpro_getMembershipLevelForUser() returns the first active membership level for a user
1221
- *
1222
- * If $user_id is omitted, the value will be retrieved from $current_user.
1223
- *
1224
- * Return values:
1225
- * Success returns the level object.
1226
- * Failure returns false.
1227
- */
1228
- function pmpro_getMembershipLevelForUser($user_id = NULL, $force = false)
1229
- {
1230
- if(empty($user_id))
1231
- {
1232
- global $current_user;
1233
- $user_id = $current_user->ID;
1234
- }
1235
-
1236
- if(empty($user_id))
1237
- {
1238
- return false;
1239
- }
1240
-
1241
- global $all_membership_levels;
1242
-
1243
- if(isset($all_membership_levels[$user_id]) && !$force)
1244
- {
1245
- return $all_membership_levels[$user_id];
1246
- }
1247
- else
1248
- {
1249
- global $wpdb;
1250
- $all_membership_levels[$user_id] = $wpdb->get_row("SELECT
1251
- l.id AS ID,
1252
- l.id as id,
1253
- mu.id as subscription_id,
1254
- l.name AS name,
1255
- l.description,
1256
- l.expiration_number,
1257
- l.expiration_period,
1258
- mu.initial_payment,
1259
- mu.billing_amount,
1260
- mu.cycle_number,
1261
- mu.cycle_period,
1262
- mu.billing_limit,
1263
- mu.trial_amount,
1264
- mu.trial_limit,
1265
- mu.code_id as code_id,
1266
- UNIX_TIMESTAMP(startdate) as startdate,
1267
- UNIX_TIMESTAMP(enddate) as enddate
1268
- FROM {$wpdb->pmpro_membership_levels} AS l
1269
- JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1270
- WHERE mu.user_id = $user_id AND mu.status = 'active'
1271
- LIMIT 1");
1272
- return $all_membership_levels[$user_id];
1273
- }
1274
- }
1275
-
1276
- /* pmpro_getMembershipLevelsForUser() returns the membership levels for a user
1277
- *
1278
- * If $user_id is omitted, the value will be retrieved from $current_user.
1279
- * By default it only includes actvie memberships.
1280
- *
1281
- * Return values:
1282
- * Success returns an array of level objects.
1283
- * Failure returns false.
1284
- */
1285
- function pmpro_getMembershipLevelsForUser($user_id = NULL, $include_inactive = false)
1286
- {
1287
- if(empty($user_id))
1288
- {
1289
- global $current_user;
1290
- $user_id = $current_user->ID;
1291
- }
1292
-
1293
- if(empty($user_id))
1294
- {
1295
- return false;
1296
- }
1297
-
1298
- global $wpdb;
1299
- return $wpdb->get_results("SELECT
1300
- l.id AS ID,
1301
- l.id as id,
1302
- mu.id as subscription_id,
1303
- l.name,
1304
- l.description,
1305
- l.expiration_number,
1306
- l.expiration_period,
1307
- mu.initial_payment,
1308
- mu.billing_amount,
1309
- mu.cycle_number,
1310
- mu.cycle_period,
1311
- mu.billing_limit,
1312
- mu.trial_amount,
1313
- mu.trial_limit,
1314
- mu.code_id as code_id,
1315
- UNIX_TIMESTAMP(startdate) as startdate,
1316
- UNIX_TIMESTAMP(enddate) as enddate
1317
- FROM {$wpdb->pmpro_membership_levels} AS l
1318
- JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1319
- WHERE mu.user_id = $user_id".($include_inactive?"":" AND mu.status = 'active'"));
1320
- }
1321
-
1322
- /* pmpro_getLevel() returns the level object for a level
1323
- *
1324
- * $level may be the level id or name
1325
- *
1326
- * Return values:
1327
- * Success returns the level object.
1328
- * Failure returns false.
1329
- */
1330
- function pmpro_getLevel($level)
1331
- {
1332
- global $pmpro_levels;
1333
-
1334
- if(is_object($level) && !empty($level->id))
1335
- $level = $level->id;
1336
-
1337
- //was a name passed? (Todo: make sure level names have at least one non-numeric character.
1338
- if(is_numeric($level))
1339
- {
1340
- $level_id = intval($level);
1341
- if(isset($pmpro_levels[$level_id]))
1342
- {
1343
- return $pmpro_levels[$level_id];
1344
- }
1345
- else
1346
- {
1347
- global $wpdb;
1348
- $pmpro_levels[$level_id] = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1");
1349
- return $pmpro_levels[$level_id];
1350
- }
1351
- }
1352
- else
1353
- {
1354
- global $wpdb;
1355
- $level_obj = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE name = '" . $level . "' LIMIT 1");
1356
- $level_id = $level_obj->id;
1357
- $pmpro_levels[$level_id] = $level_obj;
1358
- return $pmpro_levels[$level_id];
1359
- }
1360
- }
1361
-
1362
- /*
1363
- Function to populate pmpro_levels with all levels. We query the DB every time just to be sure we have the latest.
1364
- This should be called if you want to be sure you get all levels as $pmpro_levels may only have a subset of levels.
1365
- */
1366
- function pmpro_getAllLevels($include_hidden = false, $force = false)
1367
- {
1368
- global $pmpro_levels, $wpdb;
1369
-
1370
- //just use what's cached (doesn't take into account include_hidden setting)
1371
- if(!empty($pmpro_levels) && !$force)
1372
- return $pmpro_levels;
1373
-
1374
- //build query
1375
- $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
1376
- if(!$include_hidden)
1377
- $sqlQuery .= " WHERE allow_signups = 1 ORDER BY id";
1378
-
1379
- //get levels from the DB
1380
- $raw_levels = $wpdb->get_results($sqlQuery);
1381
-
1382
- //lets put them into an array where the key is the id of the level
1383
- $pmpro_levels = array();
1384
- foreach($raw_levels as $raw_level)
1385
- {
1386
- $pmpro_levels[$raw_level->id] = $raw_level;
1387
- }
1388
-
1389
- return $pmpro_levels;
1390
- }
1391
-
1392
- function pmpro_getCheckoutButton($level_id, $button_text = NULL, $classes = NULL)
1393
- {
1394
- if(empty($button_text))
1395
- $button_text = __("Sign Up for !!name!! Now", "pmpro");
1396
-
1397
- if(empty($classes))
1398
- $classes = "btn btn-primary";
1399
-
1400
- if(empty($level_id))
1401
- $r = __("Please specify a level id.", "pmpro");
1402
- else
1403
- {
1404
- //get level
1405
- $level = pmpro_getLevel($level_id);
1406
-
1407
- //replace vars
1408
- $replacements = array(
1409
- "!!id!!" => $level->id,
1410
- "!!name!!" => $level->name,
1411
- "!!description!!" => $level->description,
1412
- "!!confirmation!!" => $level->confirmation,
1413
- "!!initial_payment!!" => $level->initial_payment,
1414
- "!!billing_amount!!" => $level->billing_amount,
1415
- "!!cycle_number!!" => $level->cycle_number,
1416
- "!!cycle_period!!" => $level->cycle_period,
1417
- "!!billing_limit!!" => $level->billing_limit,
1418
- "!!trial_amount!!" => $level->trial_amount,
1419
- "!!trial_limit!!" => $level->trial_limit,
1420
- "!!expiration_number!!" => $level->expiration_number,
1421
- "!!expiration_period!!" => $level->expiration_period
1422
- );
1423
- $button_text = str_replace(array_keys($replacements), $replacements, $button_text);
1424
-
1425
- //button text
1426
- $r = "<a href=\"" . pmpro_url("checkout", "?level=" . $level_id) . "\" class=\"" . $classes . "\">" . $button_text . "</a>";
1427
- }
1428
- return $r;
1429
- }
1430
-
1431
- /**
1432
- * Get the "domain" from a URL. By domain, we mean the host name, minus any subdomains. So just the domain and TLD.
1433
- *
1434
- * @param string $url The URL to parse. (generally pass site_url() in WP)
1435
- * @return string The domain.
1436
- */
1437
- function pmpro_getDomainFromURL($url = NULL)
1438
- {
1439
- $domainparts = parse_url($url);
1440
- $domainparts = explode(".", $domainparts['host']);
1441
- if(count($domainparts) > 1)
1442
- {
1443
- //check for ips
1444
- $isip = true;
1445
- foreach($domainparts as $part)
1446
- {
1447
- if(!is_numeric($part))
1448
- {
1449
- $isip = false;
1450
- break;
1451
- }
1452
- }
1453
-
1454
- if($isip)
1455
- {
1456
- //ip, e.g. 127.1.1.1
1457
- $domain = implode(".", $domainparts);
1458
- }
1459
- else
1460
- {
1461
- //www.something.com, etc.
1462
- $domain = $domainparts[count($domainparts)-2] . "." . $domainparts[count($domainparts)-1];
1463
- }
1464
- }
1465
- else
1466
- {
1467
- //localhost or another single word domain
1468
- $domain = $domainparts[0];
1469
- }
1470
-
1471
- return $domain;
1472
- }
1473
-
1474
- /*
1475
- Get a member's start date... either in general or for a specific level_id.
1476
- */
1477
- if(!function_exists("pmpro_getMemberStartdate"))
1478
- {
1479
- function pmpro_getMemberStartdate($user_id = NULL, $level_id = 0)
1480
- {
1481
- if(empty($user_id))
1482
- {
1483
- global $current_user;
1484
- $user_id = $current_user->ID;
1485
- }
1486
-
1487
- global $pmpro_startdates; //for cache
1488
- if(empty($pmpro_startdates[$user_id][$level_id]))
1489
- {
1490
- global $wpdb;
1491
-
1492
- if(!empty($level_id))
1493
- $sqlQuery = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND membership_id IN(" . esc_sql($level_id) . ") AND user_id = '" . $user_id . "' ORDER BY id LIMIT 1";
1494
- else
1495
- $sqlQuery = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND user_id = '" . $user_id . "' ORDER BY id LIMIT 1";
1496
-
1497
- $startdate = apply_filters("pmpro_member_startdate", $wpdb->get_var($sqlQuery), $user_id, $level_id);
1498
-
1499
- $pmpro_startdates[$user_id][$level_id] = $startdate;
1500
- }
1501
-
1502
- return $pmpro_startdates[$user_id][$level_id];
1503
- }
1504
- }
1505
-
1506
- /*
1507
- How long has this member been a member
1508
- */
1509
- if(!function_exists("pmpro_getMemberDays"))
1510
- {
1511
- function pmpro_getMemberDays($user_id = NULL, $level_id = 0)
1512
- {
1513
- if(empty($user_id))
1514
- {
1515
- global $current_user;
1516
- $user_id = $current_user->ID;
1517
- }
1518
-
1519
- global $pmpro_member_days;
1520
- if(empty($pmpro_member_days[$user_id][$level_id]))
1521
- {
1522
- $startdate = pmpro_getMemberStartdate($user_id, $level_id);
1523
-
1524
- //check that there was a startdate at all
1525
- if(empty($startdate))
1526
- $pmpro_member_days[$user_id][$level_id] = 0;
1527
- else
1528
- {
1529
- $now = current_time('timestamp');
1530
- $days = ($now - $startdate)/3600/24;
1531
-
1532
- $pmpro_member_days[$user_id][$level_id] = $days;
1533
- }
1534
- }
1535
-
1536
- return $pmpro_member_days[$user_id][$level_id];
1537
- }
1538
- }
1539
-
1540
- //the start of a message handling script
1541
- function pmpro_setMessage($message, $type, $force = false)
1542
- {
1543
- global $pmpro_msg, $pmpro_msgt;
1544
-
1545
- //for now, we only show the first message generated
1546
- if($force || empty($pmpro_msg))
1547
- {
1548
- $pmpro_msg = $message;
1549
- $pmpro_msgt = $type;
1550
- }
1551
- }
1552
-
1553
- //used in class definitions for input fields to see if there was an error
1554
- function pmpro_getClassForField($field)
1555
- {
1556
- global $pmpro_error_fields, $pmpro_required_billing_fields, $pmpro_required_user_fields;
1557
- $classes = array();
1558
-
1559
- //error on this field?
1560
- if(in_array($field, $pmpro_error_fields))
1561
- {
1562
- $classes[] = "pmpro_error";
1563
- }
1564
-
1565
- $required_fields = array_merge(array_keys($pmpro_required_billing_fields), array_keys($pmpro_required_user_fields));
1566
-
1567
- //required?
1568
- if(in_array($field, $required_fields))
1569
- {
1570
- $classes[] = "pmpro_required";
1571
- }
1572
-
1573
- $classes = apply_filters("pmpro_field_classes", $classes, $field);
1574
-
1575
- if(!empty($classes))
1576
- return implode(" ", $classes);
1577
- else
1578
- return "";
1579
- }
1580
-
1581
- //get a var from $_GET or $_POST
1582
- function pmpro_getParam($index, $method = "REQUEST", $default = "")
1583
- {
1584
- if($method == "REQUEST")
1585
- {
1586
- if(!empty($_REQUEST[$index]))
1587
- return $_REQUEST[$index];
1588
- }
1589
- elseif($method == "POST")
1590
- {
1591
- if(!empty($_POST[$index]))
1592
- return $_POST[$index];
1593
- }
1594
- elseif($method == "GET")
1595
- {
1596
- if(!empty($_GET[$index]))
1597
- return $_GET[$index];
1598
- }
1599
-
1600
- return $default;
1601
- }
1602
-
1603
- /*
1604
- Format an address from address, city, state, zip, country, and phone
1605
- */
1606
- function pmpro_formatAddress($name, $address1, $address2, $city, $state, $zip, $country, $phone, $nl2br = true)
1607
- {
1608
- $address = "";
1609
-
1610
- if(!empty($name))
1611
- $address .= $name . "\n";
1612
-
1613
- if(!empty($address1))
1614
- $address .= $address1 . "\n";
1615
-
1616
- if(!empty($address2))
1617
- $address .= $address2 . "\n";
1618
-
1619
- if(!empty($city) && !empty($state))
1620
- {
1621
- $address .= $city . ", " . $state;
1622
-
1623
- if(!empty($zip))
1624
- $address .= " " . $zip;
1625
-
1626
- $address .= "\n";
1627
- }
1628
-
1629
- if(!empty($country))
1630
- $address .= $country . "\n";
1631
-
1632
- if(!empty($phone))
1633
- $address .= formatPhone($phone);
1634
-
1635
- if($nl2br)
1636
- $address = nl2br($address);
1637
-
1638
- return $address;
1639
- }
1640
-
1641
- /*
1642
- Checks if all required settings are set.
1643
- */
1644
- function pmpro_is_ready()
1645
- {
1646
- global $wpdb, $pmpro_pages, $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready;
1647
-
1648
- //check if there is at least one level
1649
- $pmpro_level_ready = (bool)$wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels LIMIT 1");
1650
-
1651
- //check if the gateway settings are good. first check if it's needed (is there paid membership level)
1652
- $paid_membership_level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE allow_signups = 1 AND (initial_payment > 0 OR billing_amount > 0 OR trial_amount > 0) LIMIT 1");
1653
- $paid_user_subscription = $wpdb->get_var("SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE initial_payment > 0 OR billing_amount > 0 OR trial_amount > 0 LIMIT 1");
1654
-
1655
- if(empty($paid_membership_level) && empty($paid_user_subscription))
1656
- {
1657
- //no paid membership level now or attached to a user. we don't need the gateway setup
1658
- $pmpro_gateway_ready = true;
1659
- }
1660
- else
1661
- {
1662
- $gateway = pmpro_getOption("gateway");
1663
- if($gateway == "authorizenet")
1664
- {
1665
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("loginname") && pmpro_getOption("transactionkey"))
1666
- $pmpro_gateway_ready = true;
1667
- else
1668
- $pmpro_gateway_ready = false;
1669
- }
1670
- elseif($gateway == "paypal" || $gateway == "paypalexpress")
1671
- {
1672
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("gateway_email") && pmpro_getOption("apiusername") && pmpro_getOption("apipassword") && pmpro_getOption("apisignature"))
1673
- $pmpro_gateway_ready = true;
1674
- else
1675
- $pmpro_gateway_ready = false;
1676
- }
1677
- elseif($gateway == "paypalstandard")
1678
- {
1679
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("gateway_email"))
1680
- $pmpro_gateway_ready = true;
1681
- else
1682
- $pmpro_gateway_ready = false;
1683
- }
1684
- elseif($gateway == "payflowpro")
1685
- {
1686
- if(pmpro_getOption("payflow_partner") && pmpro_getOption("payflow_vendor") && pmpro_getOption("payflow_user") && pmpro_getOption("payflow_pwd"))
1687
- $pmpro_gateway_ready = true;
1688
- else
1689
- $pmpro_gateway_ready = false;
1690
- }
1691
- elseif($gateway == "stripe")
1692
- {
1693
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("stripe_secretkey") && pmpro_getOption("stripe_publishablekey"))
1694
- $pmpro_gateway_ready = true;
1695
- else
1696
- $pmpro_gateway_ready = false;
1697
- }
1698
- elseif($gateway == "braintree")
1699
- {
1700
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("braintree_merchantid") && pmpro_getOption("braintree_publickey") && pmpro_getOption("braintree_privatekey"))
1701
- $pmpro_gateway_ready = true;
1702
- else
1703
- $pmpro_gateway_ready = false;
1704
- }
1705
- elseif($gateway == "twocheckout")
1706
- {
1707
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("twocheckout_apiusername") && pmpro_getOption("twocheckout_apipassword"))
1708
- $pmpro_gateway_ready = true;
1709
- else
1710
- $pmpro_gateway_ready = false;
1711
- }
1712
- elseif($gateway == "cybersource")
1713
- {
1714
- if(pmpro_getOption("gateway_environment") && pmpro_getOption("cybersource_merchantid") && pmpro_getOption("cybersource_securitykey"))
1715
- $pmpro_gateway_ready = true;
1716
- else
1717
- $pmpro_gateway_ready = false;
1718
- }
1719
- else
1720
- {
1721
- $pmpro_gateway_ready = false;
1722
- }
1723
- }
1724
-
1725
- //check if we have all pages
1726
- if($pmpro_pages["account"] &&
1727
- $pmpro_pages["billing"] &&
1728
- $pmpro_pages["cancel"] &&
1729
- $pmpro_pages["checkout"] &&
1730
- $pmpro_pages["confirmation"] &&
1731
- $pmpro_pages["invoice"] &&
1732
- $pmpro_pages["levels"])
1733
- $pmpro_pages_ready = true;
1734
- else
1735
- $pmpro_pages_ready = false;
1736
-
1737
- //now check both
1738
- if($pmpro_gateway_ready && $pmpro_pages_ready)
1739
- return true;
1740
- else
1741
- return false;
1742
- }
1
+ <?php
2
+ if(!function_exists("sornot"))
3
+ {
4
+ function sornot($t, $n)
5
+ {
6
+ if($n == 1)
7
+ return $t;
8
+ else
9
+ return $t . "s";
10
+ }
11
+ }
12
+
13
+ //setup wpdb for the tables we need
14
+ function pmpro_setDBTables()
15
+ {
16
+ global $table_prefix, $wpdb;
17
+ $wpdb->hide_errors();
18
+ $wpdb->pmpro_membership_levels = $table_prefix . 'pmpro_membership_levels';
19
+ $wpdb->pmpro_memberships_users = $table_prefix . 'pmpro_memberships_users';
20
+ $wpdb->pmpro_memberships_categories = $table_prefix . 'pmpro_memberships_categories';
21
+ $wpdb->pmpro_memberships_pages = $table_prefix . 'pmpro_memberships_pages';
22
+ $wpdb->pmpro_membership_orders = $table_prefix . 'pmpro_membership_orders';
23
+ $wpdb->pmpro_discount_codes = $wpdb->prefix . 'pmpro_discount_codes';
24
+ $wpdb->pmpro_discount_codes_levels = $wpdb->prefix . 'pmpro_discount_codes_levels';
25
+ $wpdb->pmpro_discount_codes_uses = $wpdb->prefix . 'pmpro_discount_codes_uses';
26
+ }
27
+ pmpro_setDBTables();
28
+
29
+ //from: http://stackoverflow.com/questions/5266945/wordpress-how-detect-if-current-page-is-the-login-page/5892694#5892694
30
+ function pmpro_is_login_page() {
31
+ return (in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php')) || is_page("login"));
32
+ }
33
+
34
+ //thanks: http://wordpress.org/support/topic/is_plugin_active
35
+ function pmpro_is_plugin_active( $plugin ) {
36
+ return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
37
+ }
38
+
39
+ //scraping - override n if you have more than 1 group of matches and don't want the first group
40
+ function pmpro_getMatches($p, $s, $firstvalue = FALSE, $n = 1)
41
+ {
42
+ $ok = preg_match_all($p, $s, $matches);
43
+
44
+ if(!$ok)
45
+ return false;
46
+ else
47
+ {
48
+ if($firstvalue)
49
+ return $matches[$n][0];
50
+ else
51
+ return $matches[$n];
52
+ }
53
+ }
54
+
55
+ function pmpro_br2nl($text, $tags = "br")
56
+ {
57
+ if(!is_array($tags))
58
+ $tags = explode(" ", $tags);
59
+
60
+ foreach($tags as $tag)
61
+ {
62
+ $text = eregi_replace("<" . $tag . "[^>]*>", "\n", $text);
63
+ $text = eregi_replace("</" . $tag . "[^>]*>", "\n", $text);
64
+ }
65
+
66
+ return($text);
67
+ }
68
+
69
+ function pmpro_getOption($s, $force = false)
70
+ {
71
+ if(isset($_REQUEST[$s]) && !$force)
72
+ return $_REQUEST[$s];
73
+ elseif(get_option("pmpro_" . $s))
74
+ return get_option("pmpro_" . $s);
75
+ else
76
+ return "";
77
+ }
78
+
79
+ function pmpro_setOption($s, $v = NULL)
80
+ {
81
+ //no value is given, set v to the request var
82
+ if($v === NULL && isset($_REQUEST[$s]))
83
+ $v = $_REQUEST[$s];
84
+
85
+ if(is_array($v))
86
+ $v = implode(",", $v);
87
+
88
+ return update_option("pmpro_" . $s, $v);
89
+ }
90
+
91
+ function pmpro_get_slug($post_id)
92
+ {
93
+ global $pmpro_slugs, $wpdb;
94
+ if(!$pmpro_slugs[$post_id])
95
+ $pmpro_slugs[$post_id] = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE ID = '" . $post_id . "' LIMIT 1");
96
+
97
+ return $pmpro_slugs[$post_id];
98
+ }
99
+
100
+ function pmpro_url($page = NULL, $querystring = "", $scheme = NULL)
101
+ {
102
+ global $besecure;
103
+ $besecure = apply_filters("besecure", $besecure);
104
+
105
+ if(!$scheme && $besecure)
106
+ $scheme = "https";
107
+ elseif(!$scheme)
108
+ $scheme = "http";
109
+
110
+ if(!$page)
111
+ $page = "levels";
112
+
113
+ global $pmpro_pages;
114
+
115
+ //? vs &
116
+ if(strpos(get_permalink($pmpro_pages[$page]), "?"))
117
+ return home_url(str_replace(home_url(), "", get_permalink($pmpro_pages[$page])) . str_replace("?", "&", $querystring), $scheme);
118
+ else
119
+ return home_url(str_replace(home_url(), "", get_permalink($pmpro_pages[$page])) . $querystring, $scheme);
120
+ }
121
+
122
+ function pmpro_isLevelFree(&$level)
123
+ {
124
+ if($level->initial_payment <= 0 && $level->billing_amount <= 0 && $level->trial_amount <= 0)
125
+ return true;
126
+ else
127
+ return false;
128
+ }
129
+
130
+ function pmpro_isLevelRecurring(&$level)
131
+ {
132
+ if($level->billing_amount > 0 || $level->trial_amount > 0)
133
+ return true;
134
+ else
135
+ return false;
136
+ }
137
+
138
+ function pmpro_isLevelTrial(&$level)
139
+ {
140
+ if($level->trial_limit > 0)
141
+ {
142
+ return true;
143
+ }
144
+ else
145
+ return false;
146
+ }
147
+
148
+ function pmpro_isLevelExpiring(&$level)
149
+ {
150
+ if($level->expiration_number > 0)
151
+ return true;
152
+ else
153
+ return false;
154
+ }
155
+
156
+ function pmpro_getLevelCost(&$level, $tags = true)
157
+ {
158
+ global $pmpro_currency_symbol;
159
+ $r = '
160
+ The price for membership is <strong>' . $pmpro_currency_symbol . number_format($level->initial_payment, 2) . '</strong> now';
161
+ if($level->billing_amount != '0.00')
162
+ {
163
+ $r .= ' and then <strong>' . $pmpro_currency_symbol . $level->billing_amount;
164
+ if($level->cycle_number == '1')
165
+ {
166
+ $r .= ' per ';
167
+ }
168
+ elseif($level->billing_limit == 1)
169
+ {
170
+ $r .= ' after ' . $level->cycle_number . ' ';
171
+ }
172
+ else
173
+ {
174
+ $r .= ' every ' . $level->cycle_number . ' ';
175
+ }
176
+
177
+ $r .= sornot($level->cycle_period,$level->cycle_number);
178
+
179
+ if($level->billing_limit > 1)
180
+ {
181
+ $r .= ' for ' . $level->billing_limit . ' more ' . sornot("payment",$level->billing_limit) . '.';
182
+ }
183
+ else
184
+ $r .= '.';
185
+
186
+ $r .= '</strong>';
187
+ }
188
+ else
189
+ $r .= '.';
190
+
191
+ if($level->trial_limit)
192
+ {
193
+ $r .= ' After your initial payment, your first ';
194
+ if($level->trial_amount == '0.00')
195
+ {
196
+ if($level->trial_limit == '1')
197
+ {
198
+ $r .= 'payment is Free.';
199
+ }
200
+ else
201
+ {
202
+ $r .= $level->trial_limit . ' payments are Free.';
203
+ }
204
+ }
205
+ else
206
+ {
207
+ $r .= $level->trial_limit.' ' .sornot("payment", $level->trial_limit) . ' will cost ' . $pmpro_currency_symbol . $level->trial_amount . '.';
208
+ }
209
+ }
210
+
211
+ //taxes?
212
+ $tax_state = pmpro_getOption("tax_state");
213
+ $tax_rate = pmpro_getOption("tax_rate");
214
+
215
+ if($tax_state && $tax_rate && !pmpro_isLevelFree($level))
216
+ {
217
+ $r .= " Customers in " . $tax_state . " will be charged " . round($tax_rate * 100, 2) . "% tax.";
218
+ }
219
+
220
+ if(!$tags)
221
+ $r = strip_tags($r);
222
+
223
+ $r = apply_filters("pmpro_level_cost_text", $r, $level);
224
+ return $r;
225
+ }
226
+
227
+ function pmpro_getLevelExpiration(&$level)
228
+ {
229
+ if($level->expiration_number)
230
+ {
231
+ $expiration_text = "Membership expires after " . $level->expiration_number . " " . sornot(strtolower($level->expiration_period), $level->expiration_number) . ".";
232
+ }
233
+ else
234
+ $expiration_text = "";
235
+
236
+ $expiration_text = apply_filters("pmpro_level_expiration_text", $expiration_text, $level);
237
+ return $expiration_text;
238
+ }
239
+
240
+ function pmpro_hideAds()
241
+ {
242
+ global $pmpro_display_ads;
243
+ return !$pmpro_display_ads;
244
+ }
245
+
246
+ function pmpro_displayAds()
247
+ {
248
+ global $pmpro_display_ads;
249
+ return $pmpro_display_ads;
250
+ }
251
+
252
+ function pmpro_next_payment($user_id = NULL)
253
+ {
254
+ global $wpdb, $current_user;
255
+ if(!$user_id)
256
+ $user_id = $current_user->ID;
257
+
258
+ if(!$user_id)
259
+ return false;
260
+
261
+ //when were they last billed
262
+ $lastdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(timestamp) as timestamp FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ORDER BY timestamp DESC LIMIT 1");
263
+
264
+ if($lastdate)
265
+ {
266
+ //next payment will be same day, following month
267
+ $lastmonth = date("n", $lastdate);
268
+ $lastday = date("j", $lastdate);
269
+ $lastyear = date("Y", $lastdate);
270
+
271
+ $nextmonth = ((int)$lastmonth) + 1;
272
+ if($nextmonth == 13)
273
+ {
274
+ $nextmonth = 1;
275
+ $nextyear = ((int)$lastyear) + 1;
276
+ }
277
+ else
278
+ $nextyear = $lastyear;
279
+
280
+ $daysinnextmonth = date("t", strtotime($nextyear . "-" . $nextmonth . "-1"));
281
+
282
+ if($daysinnextmonth < $lastday)
283
+ {
284
+ $nextday = $daysinnextmonth;
285
+ }
286
+ else
287
+ $nextday = $lastday;
288
+
289
+ return strtotime($nextyear . "-" . $nextmonth . "-" . $nextday);
290
+ }
291
+ else
292
+ {
293
+ return false;
294
+ }
295
+
296
+ }
297
+
298
+ if(!function_exists("last4"))
299
+ {
300
+ function last4($t)
301
+ {
302
+ return substr($t, strlen($t) - 4, 4);
303
+ }
304
+ }
305
+
306
+ if(!function_exists("hideCardNumber"))
307
+ {
308
+ function hideCardNumber($c, $dashes = true)
309
+ {
310
+ if($c)
311
+ {
312
+ if($dashes)
313
+ return "XXXX-XXXX-XXXX-" . substr($c, strlen($c) - 4, 4);
314
+ else
315
+ return "XXXXXXXXXXXX" . substr($c, strlen($c) - 4, 4);
316
+ }
317
+ else
318
+ {
319
+ return "";
320
+ }
321
+ }
322
+ }
323
+
324
+ if(!function_exists("cleanPhone"))
325
+ {
326
+ function cleanPhone($phone)
327
+ {
328
+ //if a + is passed, just pass it along
329
+ if(strpos($phone, "+") !== false)
330
+ return $phone;
331
+
332
+ //clean the phone
333
+ $phone = str_replace("-", "", $phone);
334
+ $phone = str_replace(".", "", $phone);
335
+ $phone = str_replace("(", "", $phone);
336
+ $phone = str_replace(")", "", $phone);
337
+ $phone = str_replace(" ", "", $phone);
338
+
339
+ return $phone;
340
+ }
341
+ }
342
+
343
+ if(!function_exists("formatPhone"))
344
+ {
345
+ function formatPhone($phone)
346
+ {
347
+ $phone = cleanPhone($phone);
348
+
349
+ if(strlen($phone) == 11)
350
+ return substr($phone, 0, 1) . " (" . substr($phone, 1, 3) . ") " . substr($phone, 4, 3) . "-" . substr($phone, 7, 4);
351
+ elseif(strlen($phone) == 10)
352
+ return "(" . substr($phone, 0, 3) . ") " . substr($phone, 3, 3) . "-" . substr($phone, 6, 4);
353
+ elseif(strlen($phone) == 7)
354
+ return substr($phone, 0, 3) . "-" . substr($phone, 3, 4);
355
+ else
356
+ return $phone;
357
+ }
358
+ }
359
+
360
+ function pmpro_showRequiresMembershipMessage()
361
+ {
362
+ //get the correct message
363
+ if(is_feed())
364
+ {
365
+ $content = pmpro_getOption("rsstext");
366
+ $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
367
+ }
368
+ elseif($current_user->ID)
369
+ {
370
+ //not a member
371
+ $content = pmpro_getOption("nonmembertext");
372
+ $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
373
+ }
374
+ else
375
+ {
376
+ //not logged in!
377
+ $content = pmpro_getOption("notloggedintext");
378
+ $content = str_replace("!!levels!!", implode(", ", $post_membership_levels_names), $content);
379
+ }
380
+ }
381
+
382
+ /* pmpro_hasMembershipLevel() checks if the passed user is a member of the passed level
383
+ *
384
+ * $level may either be the ID or name of the desired membership_level. (or an array of such)
385
+ * If $user_id is omitted, the value will be retrieved from $current_user.
386
+ *
387
+ * Return values:
388
+ * Success returns boolean true.
389
+ * Failure returns a string containing the error message.
390
+ */
391
+ function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
392
+ {
393
+ global $current_user, $all_membership_levels, $wpdb;
394
+
395
+ $return = false;
396
+
397
+ if(empty($user_id)) //no user_id passed, check the current user
398
+ {
399
+ $user_id = $current_user->ID;
400
+ $membership_levels = $current_user->membership_levels;
401
+ }
402
+ else //get membership levels for given user
403
+ {
404
+ $membership_levels = pmpro_getMembershipLevelsForUser($user_id);
405
+ }
406
+
407
+ if($levels === "0" || $levels === 0) //if 0 was passed, return true if they have no level and false if they have any
408
+ {
409
+ $return = empty($membership_levels);
410
+ }
411
+ elseif(empty($levels)) //if no level var was passed, we're just checking if they have any level
412
+ {
413
+ $return = !empty($membership_levels);
414
+ }
415
+ else
416
+ {
417
+ if(!is_array($levels)) //make an array out of a single element so we can use the same code
418
+ {
419
+ $levels = array($levels);
420
+ }
421
+
422
+ if(empty($membership_levels))
423
+ {
424
+ //user has no levels just check if 0 was sent in one of the levels
425
+ if(in_array(0, $levels) || in_array("0", $levels))
426
+ $return = true;
427
+ }
428
+ else
429
+ {
430
+ foreach($levels as $level)
431
+ {
432
+ $level_obj = pmpro_getLevel(is_numeric($level) ? abs(intval($level)) : $level); //make sure our level is in a proper format
433
+ if(empty($level_obj)){continue;} //invalid level
434
+ $found_level = false;
435
+ foreach($membership_levels as $membership_level)
436
+ {
437
+ if($membership_level->id == $level_obj->id) //found a match
438
+ {
439
+ $found_level = true;
440
+ }
441
+ }
442
+
443
+ if(is_numeric($level) and intval($level) < 0 and !$found_level) //checking for the absence of this level
444
+ {
445
+ $return = true;
446
+ }
447
+ else if($found_level) //checking for the presence of this level
448
+ {
449
+ $return = true;
450
+ }
451
+ }
452
+ }
453
+ }
454
+
455
+ $return = apply_filters("pmpro_has_membership_level", $return, $user_id, $levels);
456
+ return $return;
457
+ }
458
+
459
+ /* pmpro_changeMembershipLevel() creates or updates the membership level of the given user to the given level.
460
+ *
461
+ * $level may either be the ID or name of the desired membership_level.
462
+ * If $user_id is omitted, the value will be retrieved from $current_user.
463
+ *
464
+ * Return values:
465
+ * Success returns boolean true.
466
+ * Failure returns boolean false.
467
+ */
468
+ function pmpro_changeMembershipLevel($level, $user_id = NULL)
469
+ {
470
+ global $wpdb;
471
+ global $current_user, $pmpro_error;
472
+
473
+ if(empty($user_id))
474
+ {
475
+ $user_id = $current_user->ID;
476
+ }
477
+
478
+ if(empty($user_id))
479
+ {
480
+ $pmpro_error = "User ID not found.";
481
+ return false;
482
+ }
483
+
484
+ if(empty($level)) //cancelling membership
485
+ {
486
+ $level = 0;
487
+ }
488
+ else if(is_array($level))
489
+ {
490
+ //custom level
491
+ }
492
+ else
493
+ {
494
+ $level_obj = pmpro_getLevel($level);
495
+ if(empty($level_obj))
496
+ {
497
+ $pmpro_error = "Invalid level.";
498
+ return false;
499
+ }
500
+ $level = $level_obj->id;
501
+ }
502
+
503
+
504
+ //if it's a custom level, they're changing
505
+ if(!is_array($level))
506
+ {
507
+ //are they even changing?
508
+ if(pmpro_hasMembershipLevel($level, $user_id)) {
509
+ $pmpro_error = "not is changing?";
510
+ return false; //not changing
511
+ }
512
+ }
513
+
514
+ $old_levels = pmpro_getMembershipLevelsForUser($user_id);
515
+
516
+ $pmpro_cancel_previous_subscriptions = apply_filters("pmpro_cancel_previous_subscriptions", true);
517
+ if($pmpro_cancel_previous_subscriptions)
518
+ {
519
+ //deactivate old memberships (updates pmpro_memberships_users table)
520
+ if(!empty($old_levels))
521
+ {
522
+ foreach($old_levels as $old_level) {
523
+ $sql = "UPDATE $wpdb->pmpro_memberships_users SET `status`='inactive', `enddate`=NOW() WHERE `id`=".$old_level->subscription_id;
524
+ if(!$wpdb->query($sql))
525
+ {
526
+ $pmpro_error = "Error interacting with database: ".(mysql_errno()?mysql_error():'unavailable');
527
+ return false;
528
+ }
529
+ }
530
+ }
531
+
532
+ //cancel any other subscriptions they have (updates pmpro_membership_orders table)
533
+ $other_order_ids = $wpdb->get_col("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' AND status = 'success' ORDER BY id DESC");
534
+ foreach($other_order_ids as $order_id)
535
+ {
536
+ $c_order = new MemberOrder($order_id);
537
+ $c_order->cancel();
538
+ }
539
+ }
540
+
541
+ //insert current membership
542
+ if(!empty($level)) //are we getting a new one or just cancelling the old ones
543
+ {
544
+ if(is_array($level))
545
+ {
546
+ //make sure the dates are in good formats
547
+ if($level['startdate'] != "NOW()" && $level['startdate'] != "NULL" && substr($level['startdate'], 0, 1) != "'")
548
+ $level['startdate'] = "'" . $level['startdate'] . "'";
549
+
550
+ if($level['enddate'] != "NOW()" && $level['enddate'] != "NULL" && substr($level['enddate'], 0, 1) != "'")
551
+ $level['enddate'] = "'" . $level['enddate'] . "'";
552
+
553
+ $sql = "INSERT INTO $wpdb->pmpro_memberships_users (user_id, membership_id, code_id, initial_payment, billing_amount, cycle_number, cycle_period, billing_limit, trial_amount, trial_limit, startdate, enddate)
554
+ VALUES('" . $level['user_id'] . "',
555
+ '" . $level['membership_id'] . "',
556
+ '" . intval($level['code_id']) . "',
557
+ '" . $level['initial_payment'] . "',
558
+ '" . $level['billing_amount'] . "',
559
+ '" . $level['cycle_number'] . "',
560
+ '" . $level['cycle_period'] . "',
561
+ '" . $level['billing_limit'] . "',
562
+ '" . $level['trial_amount'] . "',
563
+ '" . $level['trial_limit'] . "',
564
+ " . $level['startdate'] . ",
565
+ " . $level['enddate'] . ")";
566
+
567
+ if(!$wpdb->query($sql))
568
+ {
569
+ $pmpro_error = "Error interacting with database: ".(mysql_errno()?mysql_error():'unavailable');
570
+ return false;
571
+ }
572
+ }
573
+ else
574
+ {
575
+ $sql = "INSERT INTO $wpdb->pmpro_memberships_users (`membership_id`,`user_id`) VALUES ('" . $level . "','" . $user_id . "')";
576
+ if(!$wpdb->query($sql))
577
+ {
578
+ $pmpro_error = "Error interacting with database: ".(mysql_errno()?mysql_error():'unavailable');
579
+ return false;
580
+ }
581
+ }
582
+ }
583
+
584
+ //get level id
585
+ if(is_array($level))
586
+ $level_id = $level['membership_id']; //custom level
587
+ else
588
+ $level_id = $level; //just id
589
+
590
+ //update user data and call action
591
+ pmpro_set_current_user();
592
+ do_action("pmpro_after_change_membership_level", $level_id, $user_id); //$level is the $level_id here
593
+ return true;
594
+ }
595
+
596
+ /* pmpro_toggleMembershipCategory() creates or deletes a linking entry between the membership level and post category tables.
597
+ *
598
+ * $level may either be the ID or name of the desired membership_level.
599
+ * $category must be a valid post category ID.
600
+ *
601
+ * Return values:
602
+ * Success returns boolean true.
603
+ * Failure returns a string containing the error message.
604
+ */
605
+ function pmpro_toggleMembershipCategory( $level, $category, $value )
606
+ {
607
+ global $wpdb;
608
+ $category = intval($category);
609
+
610
+ if ( ($level = intval($level)) <= 0 )
611
+ {
612
+ $safe = addslashes($level);
613
+ if ( ($level = intval($wpdb->get_var("SELECT id FROM {$wpdb->pmpro_membership_levels} WHERE name = '$safe' LIMIT 1"))) <= 0 )
614
+ {
615
+ return "Membership level not found.";
616
+ }
617
+ }
618
+
619
+ if ( $value )
620
+ {
621
+ $sql = "REPLACE INTO {$wpdb->pmpro_memberships_categories} (`membership_id`,`category_id`) VALUES ('$level','$category')";
622
+ $wpdb->query($sql);
623
+ if(mysql_errno()) return mysql_error();
624
+ }
625
+ else
626
+ {
627
+ $sql = "DELETE FROM {$wpdb->pmpro_memberships_categories} WHERE `membership_id` = '$level' AND `category_id` = '$category' LIMIT 1";
628
+ $wpdb->query($sql);
629
+ if(mysql_errno()) return mysql_error();
630
+ }
631
+
632
+ return true;
633
+ }
634
+
635
+ /* pmpro_updateMembershipCategories() ensures that all those and only those categories given
636
+ * are associated with the given membership level.
637
+ *
638
+ * $level is a valid membership level ID or name
639
+ * $categories is an array of post category IDs
640
+ *
641
+ * Return values:
642
+ * Success returns boolean true.
643
+ * Failure returns a string containing the error message.
644
+ */
645
+ function pmpro_updateMembershipCategories($level, $categories)
646
+ {
647
+ global $wpdb;
648
+
649
+ if(!is_numeric($level))
650
+ {
651
+ $level = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_levels WHERE name = '" . $wpdb->escape($level) . "' LIMIT 1");
652
+ if(empty($level))
653
+ {
654
+ return "Membership level not found.";
655
+ }
656
+ }
657
+
658
+ // remove all existing links...
659
+ $sqlQuery = "DELETE FROM $wpdb->pmpro_memberships_categories WHERE `membership_id` = '" . $wpdb->escape($level) . "'";
660
+ $wpdb->query($sqlQuery);
661
+ if(mysql_errno()) return mysql_error();
662
+
663
+ // add the given links [back?] in...
664
+ foreach($categories as $cat)
665
+ {
666
+ if(is_string($r = pmpro_toggleMembershipCategory( $level, $cat, true)))
667
+ {
668
+ //uh oh, error
669
+ return $r;
670
+ }
671
+ }
672
+
673
+ //all good
674
+ return true;
675
+ }
676
+
677
+ /* pmpro_getMembershipCategories() returns the categories for a given level
678
+ *
679
+ * $level_id is a valid membership level ID
680
+ *
681
+ * Return values:
682
+ * Success returns boolean true.
683
+ * Failure returns boolean false.
684
+ */
685
+ function pmpro_getMembershipCategories($level_id)
686
+ {
687
+ global $wpdb;
688
+ $categories = $wpdb->get_results("SELECT c.category_id
689
+ FROM {$wpdb->pmpro_memberships_categories} AS c
690
+ WHERE c.membership_id = '" . $level_id . "'", ARRAY_N);
691
+
692
+ $returns = array();
693
+ if(is_array($categories))
694
+ {
695
+ foreach($categories as $cat)
696
+ {
697
+ $returns[] = $cat;
698
+ }
699
+ }
700
+ return $returns;
701
+ }
702
+
703
+ function pmpro_isAdmin($user_id = NULL)
704
+ {
705
+ global $current_user, $wpdb;
706
+ if(!$user_id)
707
+ $user_id = $current_user->ID;
708
+
709
+ if(!$user_id)
710
+ return false;
711
+
712
+ $admincap = user_can($user_id, "manage_options");
713
+ if($admincap)
714
+ return true;
715
+ else
716
+ return false;
717
+ }
718
+
719
+ function pmpro_replaceUserMeta($user_id, $meta_keys, $meta_values, $prev_values = NULL)
720
+ {
721
+ //expects all arrays for last 3 params or all strings
722
+ if(!is_array($meta_keys))
723
+ {
724
+ $meta_keys = array($meta_keys);
725
+ $meta_values = array($meta_values);
726
+ $prev_values = array($prev_values);
727
+ }
728
+
729
+ for($i = 0; $i < count($meta_values); $i++)
730
+ {
731
+ if($prev_values[$i])
732
+ {
733
+ update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $prev_values[$i]);
734
+ }
735
+ else
736
+ {
737
+ $old_value = get_user_meta($user_id, $meta_keys[$i], true);
738
+ if($old_value)
739
+ {
740
+ update_user_meta($user_id, $meta_keys[$i], $meta_values[$i], $old_value);
741
+ }
742
+ else
743
+ {
744
+ update_user_meta($user_id, $meta_keys[$i], $meta_values[$i]);
745
+ }
746
+ }
747
+ }
748
+
749
+ return $i;
750
+ }
751
+
752
+ function pmpro_getMetavalues($query)
753
+ {
754
+ global $wpdb;
755
+
756
+ $results = $wpdb->get_results($query);
757
+ foreach($results as $result)
758
+ {
759
+ $r->{$result->key} = $result->value;
760
+ }
761
+
762
+ return $r;
763
+ }
764
+
765
+ //function to return the pagination string
766
+ function pmpro_getPaginationString($page = 1, $totalitems, $limit = 15, $adjacents = 1, $targetpage = "/", $pagestring = "&pn=")
767
+ {
768
+ //defaults
769
+ if(!$adjacents) $adjacents = 1;
770
+ if(!$limit) $limit = 15;
771
+ if(!$page) $page = 1;
772
+ if(!$targetpage) $targetpage = "/";
773
+
774
+ //other vars
775
+ $prev = $page - 1; //previous page is page - 1
776
+ $next = $page + 1; //next page is page + 1
777
+ $lastpage = ceil($totalitems / $limit); //lastpage is = total items / items per page, rounded up.
778
+ $lpm1 = $lastpage - 1; //last page minus 1
779
+
780
+ /*
781
+ Now we apply our rules and draw the pagination object.
782
+ We're actually saving the code to a variable in case we want to draw it more than once.
783
+ */
784
+ $pagination = "";
785
+ if($lastpage > 1)
786
+ {
787
+ $pagination .= "<div class=\"pmpro_pagination\"";
788
+ if(!empty($margin) || !empty($padding))
789
+ {
790
+ $pagination .= " style=\"";
791
+ if($margin)
792
+ $pagination .= "margin: $margin;";
793
+ if($padding)
794
+ $pagination .= "padding: $padding;";
795
+ $pagination .= "\"";
796
+ }
797
+ $pagination .= ">";
798
+
799
+ //previous button
800
+ if ($page > 1)
801
+ $pagination .= "<a href=\"$targetpage$pagestring$prev\">&laquo; prev</a>";
802
+ else
803
+ $pagination .= "<span class=\"disabled\">&laquo; prev</span>";
804
+
805
+ //pages
806
+ if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
807
+ {
808
+ for ($counter = 1; $counter <= $lastpage; $counter++)
809
+ {
810
+ if ($counter == $page)
811
+ $pagination .= "<span class=\"current\">$counter</span>";
812
+ else
813
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
814
+ }
815
+ }
816
+ elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some
817
+ {
818
+ //close to beginning; only hide later pages
819
+ if($page < 1 + ($adjacents * 3))
820
+ {
821
+ for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
822
+ {
823
+ if ($counter == $page)
824
+ $pagination .= "<span class=\"current\">$counter</span>";
825
+ else
826
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
827
+ }
828
+ $pagination .= "...";
829
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
830
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
831
+ }
832
+ //in middle; hide some front and some back
833
+ elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
834
+ {
835
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
836
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
837
+ $pagination .= "...";
838
+ for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
839
+ {
840
+ if ($counter == $page)
841
+ $pagination .= "<span class=\"current\">$counter</span>";
842
+ else
843
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
844
+ }
845
+ $pagination .= "...";
846
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lpm1 . "\">$lpm1</a>";
847
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $lastpage . "\">$lastpage</a>";
848
+ }
849
+ //close to end; only hide early pages
850
+ else
851
+ {
852
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "1\">1</a>";
853
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . "2\">2</a>";
854
+ $pagination .= "...";
855
+ for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
856
+ {
857
+ if ($counter == $page)
858
+ $pagination .= "<span class=\"current\">$counter</span>";
859
+ else
860
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $counter . "\">$counter</a>";
861
+ }
862
+ }
863
+ }
864
+
865
+ //next button
866
+ if ($page < $counter - 1)
867
+ $pagination .= "<a href=\"" . $targetpage . $pagestring . $next . "\">next &raquo;</a>";
868
+ else
869
+ $pagination .= "<span class=\"disabled\">next &raquo;</span>";
870
+ $pagination .= "</div>\n";
871
+ }
872
+
873
+ return $pagination;
874
+
875
+ }
876
+
877
+ function pmpro_calculateInitialPaymentRevenue($s = NULL, $l = NULL)
878
+ {
879
+ global $wpdb;
880
+
881
+ //if we're limiting users by search
882
+ if($s || $l)
883
+ {
884
+ $user_ids_query = "SELECT u.ID 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 WHERE mu.status = 'active' ";
885
+ if($s)
886
+ $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
887
+ if($l)
888
+ $user_ids_query .= "AND mu.membership_id = '$l' ";
889
+ }
890
+
891
+ //query to sum initial payments
892
+ $sqlQuery = "SELECT SUM(initial_payment) FROM $wpdb->pmpro_memberships_users WHERE `status` = 'active' ";
893
+ if(!empty($user_ids_query))
894
+ $sqlQuery .= "AND user_id IN(" . $user_ids_query . ") ";
895
+
896
+ $total = $wpdb->get_var($sqlQuery);
897
+
898
+ return (double)$total;
899
+ }
900
+
901
+ function pmpro_calculateRecurringRevenue($s, $l)
902
+ {
903
+ global $wpdb;
904
+
905
+ //if we're limiting users by search
906
+ if($s || $l)
907
+ {
908
+ $user_ids_query = "AND user_id IN(SELECT u.ID 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 WHERE mu.status = 'active' ";
909
+ if($s)
910
+ $user_ids_query .= "AND (u.user_login LIKE '%$s%' OR u.user_email LIKE '%$s%' OR um.meta_value LIKE '%$s%') ";
911
+ if($l)
912
+ $user_ids_query .= "AND mu.membership_id = '$l' ";
913
+ $user_ids_query .= ")";
914
+ }
915
+ else
916
+ $user_ids_query = "";
917
+
918
+ //4 queries to get annual earnings for each cycle period. currently ignoring trial periods and billing limits.
919
+ $sqlQuery = "
920
+ SELECT SUM((12/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Month' AND cycle_number <> 12 $user_ids_query
921
+ UNION
922
+ SELECT SUM((365/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Day' AND cycle_number <> 365 $user_ids_query
923
+ UNION
924
+ SELECT SUM((52/cycle_number)*billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Week' AND cycle_number <> 52 $user_ids_query
925
+ UNION
926
+ SELECT SUM(billing_amount) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND cycle_period = 'Year' $user_ids_query
927
+ ";
928
+
929
+ $annual_revenues = $wpdb->get_col($sqlQuery);
930
+
931
+ $total = 0;
932
+ foreach($annual_revenues as $r)
933
+ {
934
+ $total += $r;
935
+ }
936
+
937
+ return $total;
938
+ }
939
+
940
+ function pmpro_generateUsername($firstname = "", $lastname = "", $email = "")
941
+ {
942
+ global $wpdb;
943
+
944
+ //try first initial + last name, firstname, lastname
945
+ $firstname = preg_replace("/[^A-Za-z]/", "", $firstname);
946
+ $lastname = preg_replace("/[^A-Za-z]/", "", $lastname);
947
+ if($firstname && $lastname)
948
+ {
949
+ $username = substr($firstname, 0, 1) . $lastname;
950
+ }
951
+ elseif($firstname)
952
+ {
953
+ $username = $firstname;
954
+ }
955
+ elseif($lastname)
956
+ {
957
+ $username = $lastname;
958
+ }
959
+
960
+ //is it taken?
961
+ $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
962
+
963
+ if(!$taken)
964
+ return $username;
965
+
966
+ //try the beginning of the email address
967
+ $emailparts = explode("@", "email");
968
+ if(is_array($emailparts))
969
+ $email = preg_replace("/[^A-Za-z]/", "", $emailparts[0]);
970
+
971
+ if($email)
972
+ {
973
+ $username = $email;
974
+ }
975
+
976
+ //is this taken? if not, add numbers until it works
977
+ $taken = true;
978
+ $count = 0;
979
+ while($taken)
980
+ {
981
+ //add a # to the end
982
+ if($count)
983
+ {
984
+ $username = preg_replace("/[0-9]/", "", $username) . $count;
985
+ }
986
+
987
+ //taken?
988
+ $taken = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '" . $username . "' LIMIT 1");
989
+
990
+ //increment the number
991
+ $count++;
992
+ }
993
+
994
+ //must have a good username now
995
+ return $username;
996
+ }
997
+
998
+ //get a new random code for discount codes
999
+ function pmpro_getDiscountCode()
1000
+ {
1001
+ global $wpdb;
1002
+
1003
+ while(empty($code))
1004
+ {
1005
+ $scramble = md5(AUTH_KEY . time() . SECURE_AUTH_KEY);
1006
+ $code = substr($scramble, 0, 10);
1007
+ $check = $wpdb->get_var("SELECT code FROM $wpdb->pmpro_discount_codes WHERE code = '$code' LIMIT 1");
1008
+ if($check || is_numeric($code))
1009
+ $code = NULL;
1010
+ }
1011
+
1012
+ return strtoupper($code);
1013
+ }
1014
+
1015
+ //is a discount code valid
1016
+ function pmpro_checkDiscountCode($code, $level_id = NULL, $return_errors = false)
1017
+ {
1018
+ global $wpdb;
1019
+
1020
+ //no code, no code
1021
+ if(empty($code))
1022
+ {
1023
+ if($return_errors)
1024
+ return array(false, "No code was given to check.");
1025
+ else
1026
+ return false;
1027
+ }
1028
+
1029
+ //get code from db
1030
+ $dbcode = $wpdb->get_row("SELECT *, UNIX_TIMESTAMP(starts) as starts, UNIX_TIMESTAMP(expires) as expires FROM $wpdb->pmpro_discount_codes WHERE code ='" . $code . "' LIMIT 1");
1031
+
1032
+ //did we find it?
1033
+ if(empty($dbcode->id))
1034
+ {
1035
+ if($return_errors)
1036
+ return array(false, "The code could not be found.");
1037
+ else
1038
+ return false;
1039
+ }
1040
+
1041
+ //fix the date timestamps
1042
+ $dbcode->starts = strtotime(date("m/d/Y", $dbcode->starts));
1043
+ $dbcode->expires = strtotime(date("m/d/Y", $dbcode->expires));
1044
+
1045
+ //today
1046
+ $today = strtotime(date("m/d/Y 00:00:00"));
1047
+
1048
+ //has this code started yet?
1049
+ if(!empty($dbcode->starts) && $dbcode->starts > $today)
1050
+ {
1051
+ if($return_errors)
1052
+ return array(false, "This discount code goes into effect on " . date(get_option('date_format'), $dbcode->starts) . ".");
1053
+ else
1054
+ return false;
1055
+ }
1056
+
1057
+ //has this code expired?
1058
+ if(!empty($dbcode->expires) && $dbcode->expires < $today)
1059
+ {
1060
+ if($return_errors)
1061
+ return array(false, "This discount code expired on " . date(get_option('date_format'), $dbcode->expires) . ".");
1062
+ else
1063
+ return false;
1064
+ }
1065
+
1066
+ //have we run out of uses?
1067
+ if($dbcode->uses > 0)
1068
+ {
1069
+ $used = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = '" . $dbcode->id . "'");
1070
+ if($used >= $dbcode->uses)
1071
+ {
1072
+ if($return_errors)
1073
+ return array(false, "This discount code is no longer valid.");
1074
+ else
1075
+ return false;
1076
+ }
1077
+ }
1078
+
1079
+ //if a level was passed check if this code applies
1080
+ $pmpro_check_discount_code_levels = apply_filters("pmpro_check_discount_code_levels", true, $dbcode->id);
1081
+ if(!empty($level_id) && $pmpro_check_discount_code_levels)
1082
+ {
1083
+ $code_level = $wpdb->get_row("SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id WHERE cl.code_id = '" . $dbcode->id . "' AND cl.level_id = '" . $level_id . "' LIMIT 1");
1084
+
1085
+ if(empty($code_level))
1086
+ {
1087
+ if(!empty($return_errors))
1088
+ return array(false, "This code does not apply to this membership level.");
1089
+ else
1090
+ return false;
1091
+ }
1092
+ }
1093
+
1094
+ //guess we're all good
1095
+ if(!empty($return_errors))
1096
+ return array(true, "This discount code is okay.");
1097
+ else
1098
+ return true;
1099
+ }
1100
+
1101
+ function pmpro_no_quotes($s, $quotes = array("'", '"'))
1102
+ {
1103
+ return str_replace($quotes, "", $s);
1104
+ }
1105
+
1106
+ //from: http://www.php.net/manual/en/function.implode.php#86845
1107
+ function pmpro_implodeToEnglish($array)
1108
+ {
1109
+ // sanity check
1110
+ if (!$array || !count ($array))
1111
+ return '';
1112
+
1113
+ // get last element
1114
+ $last = array_pop ($array);
1115
+
1116
+ // if it was the only element - return it
1117
+ if (!count ($array))
1118
+ return $last;
1119
+
1120
+ return implode (', ', $array).' and '.$last;
1121
+ }
1122
+
1123
+ //from yoast wordpress seo
1124
+ function pmpro_text_limit( $text, $limit, $finish = '&hellip;')
1125
+ {
1126
+ if( strlen( $text ) > $limit ) {
1127
+ $text = substr( $text, 0, $limit );
1128
+ $text = substr( $text, 0, - ( strlen( strrchr( $text,' ') ) ) );
1129
+ $text .= $finish;
1130
+ }
1131
+ return $text;
1132
+ }
1133
+
1134
+ /* pmpro_getMembershipLevelForUser() returns the first active membership level for a user
1135
+ *
1136
+ * If $user_id is omitted, the value will be retrieved from $current_user.
1137
+ *
1138
+ * Return values:
1139
+ * Success returns the level object.
1140
+ * Failure returns false.
1141
+ */
1142
+ function pmpro_getMembershipLevelForUser($user_id = NULL)
1143
+ {
1144
+ if(empty($user_id))
1145
+ {
1146
+ global $current_user;
1147
+ $user_id = $current_user->ID;
1148
+ }
1149
+
1150
+ if(empty($user_id))
1151
+ {
1152
+ return false;
1153
+ }
1154
+
1155
+ global $all_membership_levels;
1156
+
1157
+ if(isset($all_membership_levels[$user_id]))
1158
+ {
1159
+ return $all_membership_levels[$user_id];
1160
+ }
1161
+ else
1162
+ {
1163
+ global $wpdb;
1164
+ $all_membership_levels[$user_id] = $wpdb->get_row("SELECT
1165
+ l.id AS ID,
1166
+ l.id as id,
1167
+ mu.id as subscription_id,
1168
+ l.name AS name,
1169
+ l.description,
1170
+ l.expiration_number,
1171
+ l.expiration_period,
1172
+ mu.initial_payment,
1173
+ mu.billing_amount,
1174
+ mu.cycle_number,
1175
+ mu.cycle_period,
1176
+ mu.billing_limit,
1177
+ mu.trial_amount,
1178
+ mu.trial_limit,
1179
+ mu.code_id as code_id,
1180
+ UNIX_TIMESTAMP(startdate) as startdate,
1181
+ UNIX_TIMESTAMP(enddate) as enddate
1182
+ FROM {$wpdb->pmpro_membership_levels} AS l
1183
+ JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1184
+ WHERE mu.user_id = $user_id AND mu.status = 'active'
1185
+ LIMIT 1");
1186
+ return $all_membership_levels[$user_id];
1187
+ }
1188
+ }
1189
+
1190
+ /* pmpro_getMembershipLevelsForUser() returns the membership levels for a user
1191
+ *
1192
+ * If $user_id is omitted, the value will be retrieved from $current_user.
1193
+ * By default it only includes actvie memberships.
1194
+ *
1195
+ * Return values:
1196
+ * Success returns an array of level objects.
1197
+ * Failure returns false.
1198
+ */
1199
+ function pmpro_getMembershipLevelsForUser($user_id = NULL, $include_inactive = false)
1200
+ {
1201
+ if(empty($user_id))
1202
+ {
1203
+ global $current_user;
1204
+ $user_id = $current_user->ID;
1205
+ }
1206
+
1207
+ if(empty($user_id))
1208
+ {
1209
+ return false;
1210
+ }
1211
+
1212
+ global $wpdb;
1213
+ return $wpdb->get_results("SELECT
1214
+ l.id AS ID,
1215
+ l.id as id,
1216
+ mu.id as subscription_id,
1217
+ l.name,
1218
+ l.description,
1219
+ l.expiration_number,
1220
+ l.expiration_period,
1221
+ mu.initial_payment,
1222
+ mu.billing_amount,
1223
+ mu.cycle_number,
1224
+ mu.cycle_period,
1225
+ mu.billing_limit,
1226
+ mu.trial_amount,
1227
+ mu.trial_limit,
1228
+ mu.code_id as code_id,
1229
+ UNIX_TIMESTAMP(startdate) as startdate,
1230
+ UNIX_TIMESTAMP(enddate) as enddate
1231
+ FROM {$wpdb->pmpro_membership_levels} AS l
1232
+ JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
1233
+ WHERE mu.user_id = $user_id".($include_inactive?"":" AND mu.status = 'active'"));
1234
+ }
1235
+
1236
+ /* pmpro_getLevel() returns the level object for a level
1237
+ *
1238
+ * $level may be the level id or name
1239
+ *
1240
+ * Return values:
1241
+ * Success returns the level object.
1242
+ * Failure returns false.
1243
+ */
1244
+ function pmpro_getLevel($level)
1245
+ {
1246
+ global $pmpro_levels;
1247
+
1248
+ if(is_object($level) && !empty($level->id))
1249
+ $level = $level->id;
1250
+
1251
+ //was a name passed? (Todo: make sure level names have at least one non-numeric character.
1252
+ if(is_numeric($level))
1253
+ {
1254
+ $level_id = intval($level);
1255
+ if(isset($pmpro_levels[$level_id]))
1256
+ {
1257
+ return $pmpro_levels[$level_id];
1258
+ }
1259
+ else
1260
+ {
1261
+ global $wpdb;
1262
+ $pmpro_levels[$level_id] = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "' LIMIT 1");
1263
+ return $pmpro_levels[$level_id];
1264
+ }
1265
+ }
1266
+ else
1267
+ {
1268
+ global $wpdb;
1269
+ $level_obj = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE name = '" . $level . "' LIMIT 1");
1270
+ $level_id = $level->ID;
1271
+ $pmpro_levels[$level_id] = $level_obj;
1272
+ return $pmpro_levels[$level_id];
1273
+ }
1274
+ }
1275
+
1276
+ /*
1277
+ Function to populate pmpro_levels with all levels. We query the DB every time just to be sure we have the latest.
1278
+ This should be called if you want to be sure you get all levels as $pmpro_levels may only have a subset of levels.
1279
+ */
1280
+ function pmpro_getAllLevels($include_hidden = false)
1281
+ {
1282
+ global $pmpro_levels, $wpdb;
1283
+
1284
+ //build query
1285
+ $sqlQuery = "SELECT * FROM $wpdb->pmpro_membership_levels ";
1286
+ if(!$include_hidden)
1287
+ $sqlQuery .= " WHERE allow_signups = 1 ORDER BY id";
1288
+
1289
+ //get levels from the DB
1290
+ $raw_levels = $wpdb->get_results($sqlQuery);
1291
+
1292
+ //lets put them into an array where the key is the id of the level
1293
+ $pmpro_levels = array();
1294
+ foreach($raw_levels as $raw_level)
1295
+ {
1296
+ $pmpro_levels[$raw_level->id] = $raw_level;
1297
+ }
1298
+
1299
+ return $pmpro_levels;
1300
+ }
1301
+
1302
+ function pmpro_getCheckoutButton($level_id, $button_text = NULL, $classes = NULL)
1303
+ {
1304
+ if(empty($button_text))
1305
+ $button_text = "Sign Up for !!name!! Now";
1306
+
1307
+ if(empty($classes))
1308
+ $classes = "btn btn-primary";
1309
+
1310
+ if(empty($level_id))
1311
+ $r = "Please specify a level id.";
1312
+ else
1313
+ {
1314
+ //get level
1315
+ $level = pmpro_getLevel($level_id);
1316
+
1317
+ //replace vars
1318
+ $replacements = array(
1319
+ "!!id!!" => $level->id,
1320
+ "!!name!!" => $level->name,
1321
+ "!!description!!" => $level->description,
1322
+ "!!confirmation!!" => $level->confirmation,
1323
+ "!!initial_payment!!" => $level->initial_payment,
1324
+ "!!billing_amount!!" => $level->billing_amount,
1325
+ "!!cycle_number!!" => $level->cycle_number,
1326
+ "!!cycle_period!!" => $level->cycle_period,
1327
+ "!!billing_limit!!" => $level->billing_limit,
1328
+ "!!trial_amount!!" => $level->trial_amount,
1329
+ "!!trial_limit!!" => $level->trial_limit,
1330
+ "!!expiration_number!!" => $level->expiration_number,
1331
+ "!!expiration_period!!" => $level->expiration_period
1332
+ );
1333
+ $button_text = str_replace(array_keys($replacements), $replacements, $button_text);
1334
+
1335
+ //button text
1336
+ $r = "<a href=\"" . pmpro_url("checkout", "?level=" . $level_id) . "\" class=\"" . $classes . "\">" . $button_text . "</a>";
1337
+ }
1338
+ return $r;
1339
+ }
1340
+
1341
+ /**
1342
+ * Get the "domain" from a URL. By domain, we mean the host name, minus any subdomains. So just the domain and TLD.
1343
+ *
1344
+ * @param string $url The URL to parse. (generally pass site_url() in WP)
1345
+ * @return string The domain.
1346
+ */
1347
+ function pmpro_getDomainFromURL($url = NULL)
1348
+ {
1349
+ $domainparts = parse_url($url);
1350
+ $domainparts = explode(".", $domainparts['host']);
1351
+ if(count($domainparts) > 1)
1352
+ {
1353
+ //check for ips
1354
+ $isip = true;
1355
+ foreach($domainparts as $part)
1356
+ {
1357
+ if(!is_numeric($part))
1358
+ {
1359
+ $isip = false;
1360
+ break;
1361
+ }
1362
+ }
1363
+
1364
+ if($isip)
1365
+ {
1366
+ //ip, e.g. 127.1.1.1
1367
+ $domain = implode(".", $domainparts);
1368
+ }
1369
+ else
1370
+ {
1371
+ //www.something.com, etc.
1372
+ $domain = $domainparts[count($domainparts)-2] . "." . $domainparts[count($domainparts)-1];
1373
+ }
1374
+ }
1375
+ else
1376
+ {
1377
+ //localhost or another single word domain
1378
+ $domain = $domainparts[0];
1379
+ }
1380
+
1381
+ return $domain;
1382
+ }
1383
+
1384
+ /*
1385
+ Get a member's start date... either in general or for a specific level_id.
1386
+ */
1387
+ if(!function_exists("pmpro_getMemberStartdate"))
1388
+ {
1389
+ function pmpro_getMemberStartdate($user_id = NULL, $level_id = 0)
1390
+ {
1391
+ if(empty($user_id))
1392
+ {
1393
+ global $current_user;
1394
+ $user_id = $current_user->ID;
1395
+ }
1396
+
1397
+ global $pmpro_startdates; //for cache
1398
+ if(empty($pmpro_startdates[$user_id][$level_id]))
1399
+ {
1400
+ global $wpdb;
1401
+
1402
+ if(!empty($level_id))
1403
+ $sqlQuery = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND membership_id IN(" . $wpdb->escape($level_id) . ") AND user_id = '" . $user_id . "' ORDER BY id LIMIT 1";
1404
+ else
1405
+ $sqlQuery = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND user_id = '" . $user_id . "' ORDER BY id LIMIT 1";
1406
+
1407
+ $startdate = $wpdb->get_var($sqlQuery);
1408
+
1409
+ $pmpro_startdates[$user_id][$level_id] = $startdate;
1410
+ }
1411
+
1412
+ return $pmpro_startdates[$user_id][$level_id];
1413
+ }
1414
+ }
1415
+
1416
+ /*
1417
+ How long has this member been a member
1418
+ */
1419
+ if(!function_exists("pmpro_getMemberDays"))
1420
+ {
1421
+ function pmpro_getMemberDays($user_id = NULL, $level_id = 0)
1422
+ {
1423
+ if(empty($user_id))
1424
+ {
1425
+ global $current_user;
1426
+ $user_id = $current_user->ID;
1427
+ }
1428
+
1429
+ global $pmpro_member_days;
1430
+ if(empty($pmpro_member_days[$user_id][$level_id]))
1431
+ {
1432
+ $startdate = pmpro_getMemberStartdate($user_id, $level_id);
1433
+
1434
+ $now = time();
1435
+ $days = ($now - $startdate)/3600/24;
1436
+
1437
+ $pmpro_member_days[$user_id][$level_id] = $days;
1438
+ }
1439
+
1440
+ return $pmpro_member_days[$user_id][$level_id];
1441
+ }
1442
+ }
1443
+
1444
+ //the start of a message handling script
1445
+ function pmpro_setMessage($message, $type, $force = false)
1446
+ {
1447
+ global $pmpro_msg, $pmpro_msgt;
1448
+
1449
+ //for now, we only show the first message generated
1450
+ if($force || empty($pmpro_msg))
1451
+ {
1452
+ $pmpro_msg = $message;
1453
+ $pmpro_msgt = $type;
1454
+ }
1455
+ }
1456
+
1457
+ //used in class definitions for input fields to see if there was an error
1458
+ function pmpro_getClassForField($field)
1459
+ {
1460
+ global $pmpro_error_fields, $pmpro_required_billing_fields, $pmpro_required_user_fields;
1461
+ $classes = array();
1462
+
1463
+ //error on this field?
1464
+ if(in_array($field, $pmpro_error_fields))
1465
+ {
1466
+ $classes[] = "pmpro_error";
1467
+ }
1468
+
1469
+ $required_fields = array_merge(array_keys($pmpro_required_billing_fields), array_keys($pmpro_required_user_fields));
1470
+
1471
+ //required?
1472
+ if(in_array($field, $required_fields))
1473
+ {
1474
+ $classes[] = "pmpro_required";
1475
+ }
1476
+
1477
+ $classes = apply_filters("pmpro_field_classes", $classes, $field);
1478
+
1479
+ if(!empty($classes))
1480
+ return implode(" ", $classes);
1481
+ else
1482
+ return "";
1483
+ }
1484
+
1485
+ //get a var from $_GET or $_POST
1486
+ function pmpro_getParam($index, $method = "REQUEST", $default = "")
1487
+ {
1488
+ if($method == "REQUEST")
1489
+ {
1490
+ if(!empty($_REQUEST[$index]))
1491
+ return $_REQUEST[$index];
1492
+ }
1493
+ elseif($method == "POST")
1494
+ {
1495
+ if(!empty($_POST[$index]))
1496
+ return $_POST[$index];
1497
+ }
1498
+ elseif($method == "GET")
1499
+ {
1500
+ if(!empty($_GET[$index]))
1501
+ return $_GET[$index];
1502
+ }
1503
+
1504
+ return $default;
1505
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/https.php DELETED
@@ -1,185 +0,0 @@
1
- <?php
2
- /*
3
- Code related to HTTPS/SSL
4
- */
5
-
6
- //this function checks if we have set the $isapage variable, and if so prevents WP from sending a 404
7
- function pmpro_status_filter($s)
8
- {
9
- global $isapage;
10
- if($isapage && strpos($s, "404"))
11
- return false; //don't send the 404
12
- else
13
- return $s;
14
- }
15
-
16
- //filters links/etc to add HTTPS to URL if needed
17
- function pmpro_https_filter($s)
18
- {
19
- global $besecure;
20
- $besecure = apply_filters('pmpro_besecure', $besecure);
21
-
22
- if($besecure || is_ssl())
23
- return str_replace("http:", "https:", $s);
24
- else
25
- return str_replace("https:", "http:", $s);
26
- }
27
- add_filter('status_header', 'pmpro_status_filter');
28
- add_filter('bloginfo_url', 'pmpro_https_filter');
29
- add_filter('wp_list_pages', 'pmpro_https_filter');
30
- add_filter('option_home', 'pmpro_https_filter');
31
- add_filter('option_siteurl', 'pmpro_https_filter');
32
- add_filter('logout_url', 'pmpro_https_filter');
33
- add_filter('login_url', 'pmpro_https_filter');
34
- add_filter('home_url', 'pmpro_https_filter');
35
-
36
- //this function sets the besecure global which may be used in early code
37
- /*
38
- function pmpro_besecure_set()
39
- {
40
- global $besecure;
41
- if(force_ssl_admin() || force_ssl_login() || is_ssl())
42
- $besecure = true;
43
-
44
- $besecure = apply_filters("pmpro_besecure", $besecure);
45
- }
46
- add_action('init', 'pmpro_besecure_set', 2);
47
- */
48
-
49
- //this function updates the besecure global with post data and redirects if needed
50
- function pmpro_besecure()
51
- {
52
- global $besecure, $post;
53
-
54
- //check the post option
55
- if(!is_admin() && !empty($post->ID) && !$besecure)
56
- $besecure = get_post_meta($post->ID, "besecure", true);
57
-
58
- //if forcing ssl on admin, be secure in admin and login page
59
- if(!$besecure && force_ssl_admin() && (is_admin() || pmpro_is_login_page()))
60
- $besecure = true;
61
-
62
- //if forcing ssl on login, be secure on the login page
63
- if(!$besecure && force_ssl_login() && pmpro_is_login_page())
64
- $besecure = true;
65
-
66
- $besecure = apply_filters("pmpro_besecure", $besecure);
67
-
68
- $use_ssl = pmpro_getOption("use_ssl");
69
- if($use_ssl == 1)
70
- {
71
- if($besecure && (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off" || $_SERVER['HTTPS'] == "false"))
72
- {
73
- //need to be secure
74
- wp_redirect("https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
75
- exit;
76
- }
77
- elseif(!$besecure && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "off" && $_SERVER['HTTPS'] != "false")
78
- {
79
- //don't need to be secure
80
- wp_redirect("http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
81
- exit;
82
- }
83
- }
84
- }
85
- add_action('wp', 'pmpro_besecure', 2);
86
- add_action('login_init', 'pmpro_besecure', 2);
87
-
88
- //JavaScript SSL redirect
89
- function pmpro_ssl_javascript_redirect()
90
- {
91
- global $besecure;
92
- $use_ssl = pmpro_getOption("use_ssl");
93
- if(!is_admin() && $use_ssl == 2)
94
- {
95
- if($besecure)
96
- {
97
- ?>
98
- <script lang="JavaScript">
99
- //needs to be secure
100
- if (window.location.protocol != "https:")
101
- window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
102
- </script>
103
- <?php
104
- }
105
- else
106
- {
107
- ?>
108
- <script lang="JavaScript">
109
- //should be over http
110
- if (window.location.protocol != "http:")
111
- window.location.href = "http:" + window.location.href.substring(window.location.protocol.length);
112
- </script>
113
- <?php
114
- }
115
- }
116
- }
117
- add_action('wp_print_scripts', 'pmpro_ssl_javascript_redirect');
118
-
119
- //If the site URL starts with https:, then force SSL/besecure to true. (Added 1.5.2)
120
- function pmpro_check_site_url_for_https($besecure)
121
- {
122
- global $wpdb, $pmpro_siteurl;
123
-
124
- //need to get this from the database because we filter get_option
125
- if(empty($pmpro_siteurl))
126
- $pmpro_siteurl = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl' LIMIT 1");
127
-
128
- //entire site is over https?
129
- if(strpos($pmpro_siteurl, "https:") !== false)
130
- $besecure = true;
131
-
132
- return $besecure;
133
- }
134
- add_filter("pmpro_besecure", "pmpro_check_site_url_for_https");
135
-
136
- //capturing case where a user links to https admin without admin over https
137
- function pmpro_admin_https_handler()
138
- {
139
- if(!empty($_SERVER['HTTPS']))
140
- {
141
- if($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off" && $_SERVER['HTTPS'] != "false" && is_admin())
142
- {
143
- if(substr(get_option("siteurl"), 0, 5) == "http:" && !force_ssl_admin())
144
- {
145
- //need to redirect to non https
146
- wp_redirect("http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
147
- exit;
148
- }
149
- }
150
- }
151
- }
152
- add_action('init', 'pmpro_admin_https_handler');
153
-
154
- /*
155
- This code is for the "nuke" option to make URLs secure on secure pages.
156
- */
157
- function pmpro_NuclearHTTPS()
158
- {
159
- //did they choose the option?
160
- $nuking = pmpro_getOption("nuclear_HTTPS");
161
- if(!empty($nuking))
162
- {
163
- ob_start("pmpro_replaceURLsInBuffer");
164
- }
165
- }
166
- add_action("init", "pmpro_NuclearHTTPS");
167
-
168
- function pmpro_replaceURLsInBuffer($buffer)
169
- {
170
- global $besecure;
171
-
172
- //only swap URLs if this page is secure
173
- if($besecure)
174
- {
175
- /*
176
- okay swap out all links like these:
177
- * http://domain.com
178
- * http://anysubdomain.domain.com
179
- * http://any.number.of.sub.domains.domain.com
180
- */
181
- $buffer = preg_replace("/http\:\/\/([a-zA-Z0-9\.\-]*" . str_replace(".", "\.", PMPRO_DOMAIN) . ")/i", "https://$1", $buffer);
182
- }
183
-
184
- return $buffer;
185
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/init.php DELETED
@@ -1,240 +0,0 @@
1
- <?php
2
- /*
3
- Code that runs on the init, set_current_user, or wp hooks to setup PMPro
4
- */
5
- //init code
6
- function pmpro_init()
7
- {
8
- require_once(PMPRO_DIR . "/includes/countries.php");
9
- require_once(PMPRO_DIR . "/includes/states.php");
10
- require_once(PMPRO_DIR . "/includes/currencies.php");
11
-
12
- wp_enqueue_script('ssmemberships_js', plugins_url('js/paid-memberships-pro.js',dirname(__FILE__) ), array('jquery'));
13
-
14
- if(is_admin())
15
- {
16
- $admin_css_rtl = false;
17
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin.css")) {
18
- $admin_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin.css";
19
- if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
20
- $admin_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
21
- }
22
- } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/admin.css")) {
23
- $admin_css = get_template_directory_uri() . "/paid-memberships-pro/admin.css";
24
- if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/admin-rtl.css") ) {
25
- $admin_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/admin-rtl.css";
26
- }
27
- } else {
28
- $admin_css = plugins_url('css/admin.css',dirname(__FILE__) );
29
- if( is_rtl() ) {
30
- $admin_css_rtl = plugins_url('css/admin-rtl.css',dirname(__FILE__) );
31
- }
32
- }
33
- wp_enqueue_style('pmpro_admin', $admin_css, array(), PMPRO_VERSION, "screen");
34
- if( $admin_css_rtl ) {
35
- wp_enqueue_style('pmpro_admin_rtl', $admin_css_rtl, array(), PMPRO_VERSION, "screen");
36
- }
37
- }
38
- else
39
- {
40
- $frontend_css_rtl = false;
41
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend.css")) {
42
- $frontend_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend.css";
43
- if( is_rtl() && file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
44
- $frontend_css_rtl = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
45
- }
46
- } elseif(file_exists(get_template_directory() . "/paid-memberships-pro/frontend.css")) {
47
- $frontend_css = get_template_directory_uri() . "/paid-memberships-pro/frontend.css";
48
- if( is_rtl() && file_exists(get_template_directory() . "/paid-memberships-pro/css/frontend-rtl.css") ) {
49
- $frontend_css_rtl = get_template_directory_uri() . "/paid-memberships-pro/css/frontend-rtl.css";
50
- }
51
- } else {
52
- $frontend_css = plugins_url('css/frontend.css',dirname(__FILE__) );
53
- if( is_rtl() ) {
54
- $frontend_css_rtl = plugins_url('css/frontend-rtl.css',dirname(__FILE__) );
55
- }
56
- }
57
- wp_enqueue_style('pmpro_frontend', $frontend_css, array(), PMPRO_VERSION, "screen");
58
- if( $frontend_css_rtl ) {
59
- wp_enqueue_style('pmpro_frontend_rtl', $frontend_css_rtl, array(), PMPRO_VERSION, "screen");
60
- }
61
-
62
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/css/print.css"))
63
- $print_css = get_stylesheet_directory_uri() . "/paid-memberships-pro/css/print.css";
64
- elseif(file_exists(get_template_directory() . "/paid-memberships-pro/print.css"))
65
- $print_css = get_template_directory_uri() . "/paid-memberships-pro/print.css";
66
- else
67
- $print_css = plugins_url('css/print.css',dirname(__FILE__) );
68
- wp_enqueue_style('pmpro_print', $print_css, array(), PMPRO_VERSION, "print");
69
- }
70
-
71
- global $pmpro_pages, $pmpro_ready, $pmpro_currency, $pmpro_currency_symbol;
72
- $pmpro_pages = array();
73
- $pmpro_pages["account"] = pmpro_getOption("account_page_id");
74
- $pmpro_pages["billing"] = pmpro_getOption("billing_page_id");
75
- $pmpro_pages["cancel"] = pmpro_getOption("cancel_page_id");
76
- $pmpro_pages["checkout"] = pmpro_getOption("checkout_page_id");
77
- $pmpro_pages["confirmation"] = pmpro_getOption("confirmation_page_id");
78
- $pmpro_pages["invoice"] = pmpro_getOption("invoice_page_id");
79
- $pmpro_pages["levels"] = pmpro_getOption("levels_page_id");
80
-
81
- $pmpro_ready = pmpro_is_ready();
82
-
83
- //set currency
84
- $pmpro_currency = pmpro_getOption("currency");
85
- if(!$pmpro_currency)
86
- {
87
- global $pmpro_default_currency;
88
- $pmpro_currency = $pmpro_default_currency;
89
- }
90
-
91
- //figure out what symbol to show for currency
92
- if(in_array($pmpro_currency, array("USD", "AUD", "BRL", "CAD", "HKD", "MXN", "NZD", "SGD")))
93
- $pmpro_currency_symbol = "&#36;";
94
- elseif($pmpro_currency == "EUR")
95
- $pmpro_currency_symbol = "&euro;";
96
- elseif($pmpro_currency == "GBP")
97
- $pmpro_currency_symbol = "&pound;";
98
- elseif($pmpro_currency == "JPY")
99
- $pmpro_currency_symbol = "&yen;";
100
- else
101
- $pmpro_currency_symbol = $pmpro_currency . " "; //just use the code
102
- }
103
- add_action("init", "pmpro_init");
104
-
105
- //this code runs after $post is set, but before template output
106
- function pmpro_wp()
107
- {
108
- if(!is_admin())
109
- {
110
- global $post, $pmpro_pages, $pmpro_page_name, $pmpro_page_id, $pmpro_body_classes;
111
-
112
- //run the appropriate preheader function
113
- foreach($pmpro_pages as $pmpro_page_name => $pmpro_page_id)
114
- {
115
- if(!empty($post->post_content) && strpos($post->post_content, "[pmpro_" . $pmpro_page_name . "]") !== false)
116
- {
117
- //preheader
118
- require_once(PMPRO_DIR . "/preheaders/" . $pmpro_page_name . ".php");
119
-
120
- //add class to body
121
- $pmpro_body_classes[] = "pmpro-" . str_replace("_", "-", $pmpro_page_name);
122
-
123
- //shortcode
124
- function pmpro_pages_shortcode($atts, $content=null, $code="")
125
- {
126
- global $pmpro_page_name;
127
- ob_start();
128
- if(file_exists(get_stylesheet_directory() . "/paid-memberships-pro/pages/" . $pmpro_page_name . ".php"))
129
- include(get_stylesheet_directory() . "/paid-memberships-pro/pages/" . $pmpro_page_name . ".php");
130
- else
131
- include(PMPRO_DIR . "/pages/" . $pmpro_page_name . ".php");
132
-
133
- $temp_content = ob_get_contents();
134
- ob_end_clean();
135
- return apply_filters("pmpro_pages_shortcode_" . $pmpro_page_name, $temp_content);
136
- }
137
- add_shortcode("pmpro_" . $pmpro_page_name, "pmpro_pages_shortcode");
138
- break; //only the first page found gets a shortcode replacement
139
- }
140
- }
141
- }
142
- }
143
- add_action("wp", "pmpro_wp", 1);
144
-
145
- /*
146
- Add PMPro page names to the BODY class.
147
- */
148
- function pmpro_body_class($classes)
149
- {
150
- global $pmpro_body_classes;
151
-
152
- if(is_array($pmpro_body_classes))
153
- $classes = array_merge($pmpro_body_classes, $classes);
154
-
155
- return $classes;
156
- }
157
- add_filter("body_class", "pmpro_body_class");
158
-
159
- //add membership level to current user object
160
- function pmpro_set_current_user()
161
- {
162
- //this code runs at the beginning of the plugin
163
- global $current_user, $wpdb;
164
- get_currentuserinfo();
165
- $id = intval($current_user->ID);
166
- if($id)
167
- {
168
- $current_user->membership_level = pmpro_getMembershipLevelForUser($current_user->ID);
169
- if(!empty($current_user->membership_level))
170
- {
171
- $current_user->membership_level->categories = pmpro_getMembershipCategories($current_user->membership_level->ID);
172
- }
173
- $current_user->membership_levels = pmpro_getMembershipLevelsForUser($current_user->ID);
174
- }
175
-
176
- //hiding ads?
177
- $hideads = pmpro_getOption("hideads");
178
- $hideadslevels = pmpro_getOption("hideadslevels");
179
- if(!is_array($hideadslevels))
180
- $hideadslevels = explode(",", $hideadslevels);
181
- if($hideads == 1 && pmpro_hasMembershipLevel() || $hideads == 2 && pmpro_hasMembershipLevel($hideadslevels))
182
- {
183
- //disable ads in ezAdsense
184
- if(class_exists("ezAdSense"))
185
- {
186
- global $ezCount, $urCount;
187
- $ezCount = 100;
188
- $urCount = 100;
189
- }
190
-
191
- //disable ads in Easy Adsense (newer versions)
192
- if(class_exists("EzAdSense"))
193
- {
194
- global $ezAdSense;
195
- $ezAdSense->ezCount = 100;
196
- $ezAdSense->urCount = 100;
197
- }
198
-
199
- //set a global variable to hide ads
200
- global $pmpro_display_ads;
201
- $pmpro_display_ads = false;
202
- }
203
- else
204
- {
205
- global $pmpro_display_ads;
206
- $pmpro_display_ads = true;
207
- }
208
-
209
- do_action("pmpro_after_set_current_user");
210
- }
211
- add_action('set_current_user', 'pmpro_set_current_user');
212
- add_action('init', 'pmpro_set_current_user');
213
-
214
- /*
215
- * Add Membership Level to Users page in WordPress dashboard.
216
- */
217
- function pmpro_manage_users_columns($columns) {
218
- $columns['pmpro_membership_level'] = __('Membership Level', 'pmpro');
219
- return $columns;
220
- }
221
-
222
- function pmpro_manage_users_custom_column($column_data, $column_name, $user_id) {
223
-
224
- if($column_name == 'pmpro_membership_level') {
225
- $levels = pmpro_getMembershipLevelsForUser($user_id);
226
- $level_names = array();
227
- if(!empty($levels)) {
228
- foreach($levels as $key => $level)
229
- $level_names[] = $level->name;
230
- $column_data = implode(',', $level_names);
231
- }
232
- else
233
- $column_data = __('None', 'pmpro');
234
- }
235
- return $column_data;
236
- }
237
-
238
- add_filter('manage_users_columns', 'pmpro_manage_users_columns');
239
- add_filter('manage_users_custom_column', 'pmpro_manage_users_custom_column', 10, 3);
240
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/CyberSource/cyber_source_soap_client.php DELETED
@@ -1,87 +0,0 @@
1
- <?php
2
- /**
3
- * CyberSource version of SoapClient.
4
- *
5
- * An extension of PHP's own SoapClient library that includes the security
6
- * header required by CyberSource. To enable SOAP support, PHP must be
7
- * configured with --enable-soap.
8
- *
9
- * @author joe bartlett (xo@jdbartlett.com)
10
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
11
- * @package CyberSource
12
- * @subpackage CyberSource.libs
13
- * @github https://github.com/jdbartlett/CyberSource/blob/master/libs/cyber_source_soap_client.php
14
- */
15
- class CyberSourceSoapClient extends SoapClient {
16
-
17
- /**
18
- * Instance-specific array to contain CyberSource-specific configuration
19
- * settings.
20
- *
21
- * @var array
22
- * @access protected
23
- */
24
- protected $_cyberSourceOptions = null;
25
-
26
- /**
27
- * Constructor.
28
- *
29
- * The WSDL is generated by CyberSourceSource::_buildWsdl, in accordance with
30
- * the DataSource settings.
31
- *
32
- * The CyberSource Options array should contain a 'merchantID' key and a
33
- * 'transactionKey' key, with appropriate string values.
34
- *
35
- * The SOAP options array (the standard options array for PHP's SoapClient
36
- * class) can be empty for CyberSource transactions.
37
- *
38
- * @param mixed $wsdl
39
- * @param array $cyberSourceOptions
40
- * @param array $soapOptions
41
- * @access private
42
- */
43
- public function __construct($wsdl, $cyberSourceOptions = null, $soapOptions = array()) {
44
- parent::__construct($wsdl, $soapOptions);
45
-
46
- $this->_cyberSourceOptions = array_merge(array(
47
- 'merchantID' => '',
48
- 'transactionKey' => '',
49
- ), is_array($cyberSourceOptions) ? $cyberSourceOptions : array());
50
- }
51
-
52
- /**
53
- * Transport layer for SOAP request.
54
- *
55
- * This is a straightforward wrapper for the standard SoapClient::__doRequest
56
- * method; its parameters are identical.
57
- *
58
- * @param string $request
59
- * @param string $location
60
- * @param string $action
61
- * @param string $version
62
- * @param integer $one_way
63
- * @return string XML SOAP response
64
- * @access private
65
- */
66
- public function __doRequest($request, $location, $action, $version, $one_way = 0) {
67
- $soapHeader = sprintf("<SOAP-ENV:Header xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><wsse:Security SOAP-ENV:mustUnderstand=\"1\"><wsse:UsernameToken><wsse:Username>%s</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">%s</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header>", $this->_cyberSourceOptions['merchantID'], $this->_cyberSourceOptions['transactionKey']);
68
-
69
- $requestDOM = new DOMDocument('1.0');
70
- $soapHeaderDOM = new DOMDocument('1.0');
71
-
72
- try {
73
- $requestDOM->loadXML($request);
74
- $soapHeaderDOM->loadXML($soapHeader);
75
- $node = $requestDOM->importNode($soapHeaderDOM->firstChild, true);
76
- $requestDOM->firstChild->insertBefore(
77
- $node, $requestDOM->firstChild->firstChild);
78
-
79
- $request = $requestDOM->saveXML();
80
- } catch (DOMException $e) {
81
- trigger_error("CybserSource Error: Couldn't add token: " . $e->code, E_USER_WARNING);
82
- }
83
-
84
- return parent::__doRequest($request, $location, $action, $version);
85
- }
86
-
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe.php CHANGED
@@ -9,9 +9,6 @@ if (!function_exists('curl_init')) {
9
  if (!function_exists('json_decode')) {
10
  throw new Exception('Stripe needs the JSON PHP extension.');
11
  }
12
- if (!function_exists('mb_detect_encoding')) {
13
- throw new Exception('Stripe needs the Multibyte String PHP extension.');
14
- }
15
 
16
  // Stripe singleton
17
  require(dirname(__FILE__) . '/Stripe/Stripe.php');
@@ -33,23 +30,16 @@ require(dirname(__FILE__) . '/Stripe/Object.php');
33
  require(dirname(__FILE__) . '/Stripe/ApiRequestor.php');
34
  require(dirname(__FILE__) . '/Stripe/ApiResource.php');
35
  require(dirname(__FILE__) . '/Stripe/SingletonApiResource.php');
36
- require(dirname(__FILE__) . '/Stripe/AttachedObject.php');
37
  require(dirname(__FILE__) . '/Stripe/List.php');
38
 
39
  // Stripe API Resources
40
  require(dirname(__FILE__) . '/Stripe/Account.php');
41
- require(dirname(__FILE__) . '/Stripe/Card.php');
42
- require(dirname(__FILE__) . '/Stripe/Balance.php');
43
- require(dirname(__FILE__) . '/Stripe/BalanceTransaction.php');
44
  require(dirname(__FILE__) . '/Stripe/Charge.php');
45
  require(dirname(__FILE__) . '/Stripe/Customer.php');
46
  require(dirname(__FILE__) . '/Stripe/Invoice.php');
47
  require(dirname(__FILE__) . '/Stripe/InvoiceItem.php');
48
  require(dirname(__FILE__) . '/Stripe/Plan.php');
49
- require(dirname(__FILE__) . '/Stripe/Subscription.php');
50
  require(dirname(__FILE__) . '/Stripe/Token.php');
51
  require(dirname(__FILE__) . '/Stripe/Coupon.php');
52
  require(dirname(__FILE__) . '/Stripe/Event.php');
53
  require(dirname(__FILE__) . '/Stripe/Transfer.php');
54
- require(dirname(__FILE__) . '/Stripe/Recipient.php');
55
- require(dirname(__FILE__) . '/Stripe/ApplicationFee.php');
9
  if (!function_exists('json_decode')) {
10
  throw new Exception('Stripe needs the JSON PHP extension.');
11
  }
 
 
 
12
 
13
  // Stripe singleton
14
  require(dirname(__FILE__) . '/Stripe/Stripe.php');
30
  require(dirname(__FILE__) . '/Stripe/ApiRequestor.php');
31
  require(dirname(__FILE__) . '/Stripe/ApiResource.php');
32
  require(dirname(__FILE__) . '/Stripe/SingletonApiResource.php');
 
33
  require(dirname(__FILE__) . '/Stripe/List.php');
34
 
35
  // Stripe API Resources
36
  require(dirname(__FILE__) . '/Stripe/Account.php');
 
 
 
37
  require(dirname(__FILE__) . '/Stripe/Charge.php');
38
  require(dirname(__FILE__) . '/Stripe/Customer.php');
39
  require(dirname(__FILE__) . '/Stripe/Invoice.php');
40
  require(dirname(__FILE__) . '/Stripe/InvoiceItem.php');
41
  require(dirname(__FILE__) . '/Stripe/Plan.php');
 
42
  require(dirname(__FILE__) . '/Stripe/Token.php');
43
  require(dirname(__FILE__) . '/Stripe/Coupon.php');
44
  require(dirname(__FILE__) . '/Stripe/Event.php');
45
  require(dirname(__FILE__) . '/Stripe/Transfer.php');
 
 
includes/lib/Stripe/Stripe/Account.php CHANGED
@@ -2,11 +2,12 @@
2
 
3
  class Stripe_Account extends Stripe_SingletonApiResource
4
  {
5
- /**
6
- * @param string|null $apiKey
7
- *
8
- * @return Stripe_Account
9
- */
 
10
  public static function retrieve($apiKey=null)
11
  {
12
  $class = get_class();
2
 
3
  class Stripe_Account extends Stripe_SingletonApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($apiKey=null)
12
  {
13
  $class = get_class();
includes/lib/Stripe/Stripe/ApiRequestor.php CHANGED
@@ -2,9 +2,6 @@
2
 
3
  class Stripe_ApiRequestor
4
  {
5
- /**
6
- * @var string $apiKey The API key that's to be used to make requests.
7
- */
8
  public $apiKey;
9
 
10
  public function __construct($apiKey=null)
@@ -12,37 +9,24 @@ class Stripe_ApiRequestor
12
  $this->_apiKey = $apiKey;
13
  }
14
 
15
- /**
16
- * @param string $url The path to the API endpoint.
17
- *
18
- * @returns string The full path.
19
- */
20
  public static function apiUrl($url='')
21
  {
22
  $apiBase = Stripe::$apiBase;
23
  return "$apiBase$url";
24
  }
25
 
26
- /**
27
- * @param string|mixed $value A string to UTF8-encode.
28
- *
29
- * @returns string|mixed The UTF8-encoded string, or the object passed in if
30
- * it wasn't a string.
31
- */
32
  public static function utf8($value)
33
  {
34
- if (is_string($value)
35
- && mb_detect_encoding($value, "UTF-8", TRUE) != "UTF-8") {
36
  return utf8_encode($value);
37
- } else {
38
  return $value;
39
- }
40
  }
41
 
42
  private static function _encodeObjects($d)
43
  {
44
  if ($d instanceof Stripe_ApiResource) {
45
- return self::utf8($d->id);
46
  } else if ($d === true) {
47
  return 'true';
48
  } else if ($d === false) {
@@ -50,136 +34,71 @@ class Stripe_ApiRequestor
50
  } else if (is_array($d)) {
51
  $res = array();
52
  foreach ($d as $k => $v)
53
- $res[$k] = self::_encodeObjects($v);
54
  return $res;
55
  } else {
56
- return self::utf8($d);
57
  }
58
  }
59
 
60
- /**
61
- * @param array $arr An map of param keys to values.
62
- * @param string|null $prefix (It doesn't look like we ever use $prefix...)
63
- *
64
- * @returns string A querystring, essentially.
65
- */
66
- public static function encode($arr, $prefix=null)
67
  {
68
- if (!is_array($arr))
69
- return $arr;
70
-
71
- $r = array();
72
- foreach ($arr as $k => $v) {
73
- if (is_null($v))
74
- continue;
75
-
76
- if ($prefix && $k && !is_int($k))
77
- $k = $prefix."[".$k."]";
78
- else if ($prefix)
79
- $k = $prefix."[]";
80
-
81
- if (is_array($v)) {
82
- $r[] = self::encode($v, $k, true);
83
- } else {
84
- $r[] = urlencode($k)."=".urlencode($v);
85
- }
86
- }
87
-
88
- return implode("&", $r);
89
  }
90
 
91
- /**
92
- * @param string $method
93
- * @param string $url
94
- * @param array|null $params
95
- *
96
- * @return array An array whose first element is the response and second
97
- * element is the API key used to make the request.
98
- */
99
- public function request($method, $url, $params=null)
100
  {
101
  if (!$params)
102
  $params = array();
103
- list($rbody, $rcode, $myApiKey) = $this->_requestRaw($method, $url, $params);
104
  $resp = $this->_interpretResponse($rbody, $rcode);
105
  return array($resp, $myApiKey);
106
  }
107
 
108
-
109
- /**
110
- * @param string $rbody A JSON string.
111
- * @param int $rcode
112
- * @param array $resp
113
- *
114
- * @throws Stripe_InvalidRequestError if the error is caused by the user.
115
- * @throws Stripe_AuthenticationError if the error is caused by a lack of
116
- * permissions.
117
- * @throws Stripe_CardError if the error is the error code is 402 (payment
118
- * required)
119
- * @throws Stripe_ApiError otherwise.
120
- */
121
  public function handleApiError($rbody, $rcode, $resp)
122
  {
123
- if (!is_array($resp) || !isset($resp['error'])) {
124
- $msg = "Invalid response object from API: $rbody "
125
- ."(HTTP response code was $rcode)";
126
- throw new Stripe_ApiError($msg, $rcode, $rbody, $resp);
127
- }
128
-
129
  $error = $resp['error'];
130
- $msg = isset($error['message']) ? $error['message'] : null;
131
- $param = isset($error['param']) ? $error['param'] : null;
132
- $code = isset($error['code']) ? $error['code'] : null;
133
-
134
  switch ($rcode) {
135
  case 400:
136
  case 404:
137
- throw new Stripe_InvalidRequestError(
138
- $msg, $param, $rcode, $rbody, $resp
139
- );
140
  case 401:
141
- throw new Stripe_AuthenticationError($msg, $rcode, $rbody, $resp);
142
  case 402:
143
- throw new Stripe_CardError($msg, $param, $code, $rcode, $rbody, $resp);
 
 
 
144
  default:
145
- throw new Stripe_ApiError($msg, $rcode, $rbody, $resp);
146
  }
147
  }
148
 
149
- private function _requestRaw($method, $url, $params)
150
  {
151
  $myApiKey = $this->_apiKey;
152
  if (!$myApiKey)
153
  $myApiKey = Stripe::$apiKey;
154
-
155
- if (!$myApiKey) {
156
- $msg = 'No API key provided. (HINT: set your API key using '
157
- . '"Stripe::setApiKey(<API-KEY>)". You can generate API keys from '
158
- . 'the Stripe web interface. See https://stripe.com/api for '
159
- . 'details, or email support@stripe.com if you have any questions.';
160
- throw new Stripe_AuthenticationError($msg);
161
- }
162
 
163
  $absUrl = $this->apiUrl($url);
164
  $params = self::_encodeObjects($params);
165
  $langVersion = phpversion();
166
  $uname = php_uname();
167
  $ua = array('bindings_version' => Stripe::VERSION,
168
- 'lang' => 'php',
169
- 'lang_version' => $langVersion,
170
- 'publisher' => 'stripe',
171
- 'uname' => $uname);
172
  $headers = array('X-Stripe-Client-User-Agent: ' . json_encode($ua),
173
- 'User-Agent: Stripe/v1 PhpBindings/' . Stripe::VERSION,
174
  'Authorization: Bearer ' . $myApiKey);
175
- if (Stripe::$apiVersion)
176
- $headers[] = 'Stripe-Version: ' . Stripe::$apiVersion;
177
- list($rbody, $rcode) = $this->_curlRequest(
178
- $method,
179
- $absUrl,
180
- $headers,
181
- $params
182
- );
183
  return array($rbody, $rcode, $myApiKey);
184
  }
185
 
@@ -188,9 +107,7 @@ class Stripe_ApiRequestor
188
  try {
189
  $resp = json_decode($rbody, true);
190
  } catch (Exception $e) {
191
- $msg = "Invalid response body from API: $rbody "
192
- . "(HTTP response code was $rcode)";
193
- throw new Stripe_ApiError($msg, $rcode, $rbody);
194
  }
195
 
196
  if ($rcode < 200 || $rcode >= 300) {
@@ -199,28 +116,28 @@ class Stripe_ApiRequestor
199
  return $resp;
200
  }
201
 
202
- private function _curlRequest($method, $absUrl, $headers, $params)
203
  {
204
  $curl = curl_init();
205
- $method = strtolower($method);
206
  $opts = array();
207
- if ($method == 'get') {
208
  $opts[CURLOPT_HTTPGET] = 1;
209
  if (count($params) > 0) {
210
- $encoded = self::encode($params);
211
- $absUrl = "$absUrl?$encoded";
212
  }
213
- } else if ($method == 'post') {
214
  $opts[CURLOPT_POST] = 1;
215
  $opts[CURLOPT_POSTFIELDS] = self::encode($params);
216
- } else if ($method == 'delete') {
217
  $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
218
  if (count($params) > 0) {
219
- $encoded = self::encode($params);
220
- $absUrl = "$absUrl?$encoded";
221
  }
222
  } else {
223
- throw new Stripe_ApiError("Unrecognized method $method");
224
  }
225
 
226
  $absUrl = self::utf8($absUrl);
@@ -236,21 +153,15 @@ class Stripe_ApiRequestor
236
  curl_setopt_array($curl, $opts);
237
  $rbody = curl_exec($curl);
238
 
239
- if (!defined('CURLE_SSL_CACERT_BADFILE')) {
240
- define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP
241
- }
242
-
243
  $errno = curl_errno($curl);
244
  if ($errno == CURLE_SSL_CACERT ||
245
- $errno == CURLE_SSL_PEER_CERTIFICATE ||
246
- $errno == CURLE_SSL_CACERT_BADFILE) {
247
- array_push(
248
- $headers,
249
- 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}'
250
- );
251
- $cert = dirname(__FILE__) . '/../data/ca-certificates.crt';
252
  curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
253
- curl_setopt($curl, CURLOPT_CAINFO, $cert);
 
254
  $rbody = curl_exec($curl);
255
  }
256
 
@@ -266,11 +177,6 @@ class Stripe_ApiRequestor
266
  return array($rbody, $rcode);
267
  }
268
 
269
- /**
270
- * @param number $errno
271
- * @param string $message
272
- * @throws Stripe_ApiConnectionError
273
- */
274
  public function handleCurlError($errno, $message)
275
  {
276
  $apiBase = Stripe::$apiBase;
@@ -278,23 +184,15 @@ class Stripe_ApiRequestor
278
  case CURLE_COULDNT_CONNECT:
279
  case CURLE_COULDNT_RESOLVE_HOST:
280
  case CURLE_OPERATION_TIMEOUTED:
281
- $msg = "Could not connect to Stripe ($apiBase). Please check your "
282
- . "internet connection and try again. If this problem persists, "
283
- . "you should check Stripe's service status at "
284
- . "https://twitter.com/stripestatus, or";
285
- break;
286
  case CURLE_SSL_CACERT:
287
  case CURLE_SSL_PEER_CERTIFICATE:
288
- $msg = "Could not verify Stripe's SSL certificate. Please make sure "
289
- . "that your network is not intercepting certificates. "
290
- . "(Try going to $apiBase in your browser.) "
291
- . "If this problem persists,";
292
- break;
293
  default:
294
- $msg = "Unexpected error communicating with Stripe. "
295
- . "If this problem persists,";
296
  }
297
- $msg .= " let us know at support@stripe.com.";
298
 
299
  $msg .= "\n\n(Network error [errno $errno]: $message)";
300
  throw new Stripe_ApiConnectionError($msg);
2
 
3
  class Stripe_ApiRequestor
4
  {
 
 
 
5
  public $apiKey;
6
 
7
  public function __construct($apiKey=null)
9
  $this->_apiKey = $apiKey;
10
  }
11
 
 
 
 
 
 
12
  public static function apiUrl($url='')
13
  {
14
  $apiBase = Stripe::$apiBase;
15
  return "$apiBase$url";
16
  }
17
 
 
 
 
 
 
 
18
  public static function utf8($value)
19
  {
20
+ if (is_string($value))
 
21
  return utf8_encode($value);
22
+ else
23
  return $value;
 
24
  }
25
 
26
  private static function _encodeObjects($d)
27
  {
28
  if ($d instanceof Stripe_ApiResource) {
29
+ return $d->id;
30
  } else if ($d === true) {
31
  return 'true';
32
  } else if ($d === false) {
34
  } else if (is_array($d)) {
35
  $res = array();
36
  foreach ($d as $k => $v)
37
+ $res[$k] = self::_encodeObjects($v);
38
  return $res;
39
  } else {
40
+ return $d;
41
  }
42
  }
43
 
44
+ public static function encode($d)
 
 
 
 
 
 
45
  {
46
+ return http_build_query($d, null, '&');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
 
49
+ public function request($meth, $url, $params=null)
 
 
 
 
 
 
 
 
50
  {
51
  if (!$params)
52
  $params = array();
53
+ list($rbody, $rcode, $myApiKey) = $this->_requestRaw($meth, $url, $params);
54
  $resp = $this->_interpretResponse($rbody, $rcode);
55
  return array($resp, $myApiKey);
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  public function handleApiError($rbody, $rcode, $resp)
59
  {
60
+ if (!is_array($resp) || !isset($resp['error']))
61
+ throw new Stripe_ApiError("Invalid response object from API: $rbody (HTTP response code was $rcode)", $rcode, $rbody, $resp);
 
 
 
 
62
  $error = $resp['error'];
 
 
 
 
63
  switch ($rcode) {
64
  case 400:
65
  case 404:
66
+ throw new Stripe_InvalidRequestError(isset($error['message']) ? $error['message'] : null,
67
+ isset($error['param']) ? $error['param'] : null,
68
+ $rcode, $rbody, $resp);
69
  case 401:
70
+ throw new Stripe_AuthenticationError(isset($error['message']) ? $error['message'] : null, $rcode, $rbody, $resp);
71
  case 402:
72
+ throw new Stripe_CardError(isset($error['message']) ? $error['message'] : null,
73
+ isset($error['param']) ? $error['param'] : null,
74
+ isset($error['code']) ? $error['code'] : null,
75
+ $rcode, $rbody, $resp);
76
  default:
77
+ throw new Stripe_ApiError(isset($error['message']) ? $error['message'] : null, $rcode, $rbody, $resp);
78
  }
79
  }
80
 
81
+ private function _requestRaw($meth, $url, $params)
82
  {
83
  $myApiKey = $this->_apiKey;
84
  if (!$myApiKey)
85
  $myApiKey = Stripe::$apiKey;
86
+ if (!$myApiKey)
87
+ throw new Stripe_AuthenticationError('No API key provided. (HINT: set your API key using "Stripe::setApiKey(<API-KEY>)". You can generate API keys from the Stripe web interface. See https://stripe.com/api for details, or email support@stripe.com if you have any questions.');
 
 
 
 
 
 
88
 
89
  $absUrl = $this->apiUrl($url);
90
  $params = self::_encodeObjects($params);
91
  $langVersion = phpversion();
92
  $uname = php_uname();
93
  $ua = array('bindings_version' => Stripe::VERSION,
94
+ 'lang' => 'php',
95
+ 'lang_version' => $langVersion,
96
+ 'publisher' => 'stripe',
97
+ 'uname' => $uname);
98
  $headers = array('X-Stripe-Client-User-Agent: ' . json_encode($ua),
99
+ 'User-Agent: Stripe/v1 PhpBindings/' . Stripe::VERSION,
100
  'Authorization: Bearer ' . $myApiKey);
101
+ list($rbody, $rcode) = $this->_curlRequest($meth, $absUrl, $headers, $params);
 
 
 
 
 
 
 
102
  return array($rbody, $rcode, $myApiKey);
103
  }
104
 
107
  try {
108
  $resp = json_decode($rbody, true);
109
  } catch (Exception $e) {
110
+ throw new Stripe_ApiError("Invalid response body from API: $rbody (HTTP response code was $rcode)", $rcode, $rbody);
 
 
111
  }
112
 
113
  if ($rcode < 200 || $rcode >= 300) {
116
  return $resp;
117
  }
118
 
119
+ private function _curlRequest($meth, $absUrl, $headers, $params)
120
  {
121
  $curl = curl_init();
122
+ $meth = strtolower($meth);
123
  $opts = array();
124
+ if ($meth == 'get') {
125
  $opts[CURLOPT_HTTPGET] = 1;
126
  if (count($params) > 0) {
127
+ $encoded = self::encode($params);
128
+ $absUrl = "$absUrl?$encoded";
129
  }
130
+ } else if ($meth == 'post') {
131
  $opts[CURLOPT_POST] = 1;
132
  $opts[CURLOPT_POSTFIELDS] = self::encode($params);
133
+ } else if ($meth == 'delete') {
134
  $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
135
  if (count($params) > 0) {
136
+ $encoded = self::encode($params);
137
+ $absUrl = "$absUrl?$encoded";
138
  }
139
  } else {
140
+ throw new Stripe_ApiError("Unrecognized method $meth");
141
  }
142
 
143
  $absUrl = self::utf8($absUrl);
153
  curl_setopt_array($curl, $opts);
154
  $rbody = curl_exec($curl);
155
 
 
 
 
 
156
  $errno = curl_errno($curl);
157
  if ($errno == CURLE_SSL_CACERT ||
158
+ $errno == CURLE_SSL_PEER_CERTIFICATE ||
159
+ $errno == 77 // CURLE_SSL_CACERT_BADFILE (constant not defined in PHP though)
160
+ ) {
161
+ array_push($headers, 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}');
 
 
 
162
  curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
163
+ curl_setopt($curl, CURLOPT_CAINFO,
164
+ dirname(__FILE__) . '/../data/ca-certificates.crt');
165
  $rbody = curl_exec($curl);
166
  }
167
 
177
  return array($rbody, $rcode);
178
  }
179
 
 
 
 
 
 
180
  public function handleCurlError($errno, $message)
181
  {
182
  $apiBase = Stripe::$apiBase;
184
  case CURLE_COULDNT_CONNECT:
185
  case CURLE_COULDNT_RESOLVE_HOST:
186
  case CURLE_OPERATION_TIMEOUTED:
187
+ $msg = "Could not connect to Stripe ($apiBase). Please check your internet connection and try again. If this problem persists, you should check Stripe's service status at https://twitter.com/stripestatus, or let us know at support@stripe.com.";
188
+ break;
 
 
 
189
  case CURLE_SSL_CACERT:
190
  case CURLE_SSL_PEER_CERTIFICATE:
191
+ $msg = "Could not verify Stripe's SSL certificate. Please make sure that your network is not intercepting certificates. (Try going to $apiBase in your browser.) If this problem persists, let us know at support@stripe.com.";
192
+ break;
 
 
 
193
  default:
194
+ $msg = "Unexpected error communicating with Stripe. If this problem persists, let us know at support@stripe.com.";
 
195
  }
 
196
 
197
  $msg .= "\n\n(Network error [errno $errno]: $message)";
198
  throw new Stripe_ApiConnectionError($msg);
includes/lib/Stripe/Stripe/ApiResource.php CHANGED
@@ -9,29 +9,16 @@ abstract class Stripe_ApiResource extends Stripe_Object
9
  return $instance;
10
  }
11
 
12
- /**
13
- * @returns Stripe_ApiResource The refreshed resource.
14
- */
15
  public function refresh()
16
  {
17
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
18
  $url = $this->instanceUrl();
19
 
20
- list($response, $apiKey) = $requestor->request(
21
- 'get',
22
- $url,
23
- $this->_retrieveOptions
24
- );
25
  $this->refreshFrom($response, $apiKey);
26
  return $this;
27
- }
28
 
29
- /**
30
- * @param string $class
31
- *
32
- * @returns string The name of the class, with namespacing and underscores
33
- * stripped.
34
- */
35
  public static function className($class)
36
  {
37
  // Useful for namespaces: Foo\Stripe_Charge
@@ -45,60 +32,38 @@ abstract class Stripe_ApiResource extends Stripe_Object
45
  return $name;
46
  }
47
 
48
- /**
49
- * @param string $class
50
- *
51
- * @returns string The endpoint URL for the given class.
52
- */
53
  public static function classUrl($class)
54
  {
55
- $base = self::_scopedLsb($class, 'className', $class);
56
  return "/v1/${base}s";
57
  }
58
 
59
- /**
60
- * @returns string The full API URL for this API resource.
61
- */
62
  public function instanceUrl()
63
  {
64
  $id = $this['id'];
65
  $class = get_class($this);
66
  if (!$id) {
67
- $message = "Could not determine which URL to request: "
68
- . "$class instance has invalid ID: $id";
69
- throw new Stripe_InvalidRequestError($message, null);
70
  }
71
  $id = Stripe_ApiRequestor::utf8($id);
72
- $base = $this->_lsb('classUrl', $class);
73
  $extn = urlencode($id);
74
  return "$base/$extn";
75
  }
76
 
77
  private static function _validateCall($method, $params=null, $apiKey=null)
78
  {
79
- if ($params && !is_array($params)) {
80
- $message = "You must pass an array as the first argument to Stripe API "
81
- . "method calls. (HINT: an example call to create a charge "
82
- . "would be: \"StripeCharge::create(array('amount' => 100, "
83
- . "'currency' => 'usd', 'card' => array('number' => "
84
- . "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")";
85
- throw new Stripe_Error($message);
86
- }
87
-
88
- if ($apiKey && !is_string($apiKey)) {
89
- $message = 'The second argument to Stripe API method calls is an '
90
- . 'optional per-request apiKey, which must be a string. '
91
- . '(HINT: you can set a global apiKey by '
92
- . '"Stripe::setApiKey(<apiKey>)")';
93
- throw new Stripe_Error($message);
94
- }
95
  }
96
 
97
  protected static function _scopedAll($class, $params=null, $apiKey=null)
98
  {
99
  self::_validateCall('all', $params, $apiKey);
100
  $requestor = new Stripe_ApiRequestor($apiKey);
101
- $url = self::_scopedLsb($class, 'classUrl', $class);
102
  list($response, $apiKey) = $requestor->request('get', $url, $params);
103
  return Stripe_Util::convertToStripeObject($response, $apiKey);
104
  }
@@ -107,18 +72,19 @@ abstract class Stripe_ApiResource extends Stripe_Object
107
  {
108
  self::_validateCall('create', $params, $apiKey);
109
  $requestor = new Stripe_ApiRequestor($apiKey);
110
- $url = self::_scopedLsb($class, 'classUrl', $class);
111
  list($response, $apiKey) = $requestor->request('post', $url, $params);
112
  return Stripe_Util::convertToStripeObject($response, $apiKey);
113
  }
114
 
115
- protected function _scopedSave($class, $apiKey=null)
116
  {
117
  self::_validateCall('save');
118
- $requestor = new Stripe_ApiRequestor($apiKey);
119
- $params = $this->serializeParameters();
120
-
121
- if (count($params) > 0) {
 
122
  $url = $this->instanceUrl();
123
  list($response, $apiKey) = $requestor->request('post', $url, $params);
124
  $this->refreshFrom($response, $apiKey);
9
  return $instance;
10
  }
11
 
 
 
 
12
  public function refresh()
13
  {
14
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
15
  $url = $this->instanceUrl();
16
 
17
+ list($response, $apiKey) = $requestor->request('get', $url);
 
 
 
 
18
  $this->refreshFrom($response, $apiKey);
19
  return $this;
20
+ }
21
 
 
 
 
 
 
 
22
  public static function className($class)
23
  {
24
  // Useful for namespaces: Foo\Stripe_Charge
32
  return $name;
33
  }
34
 
 
 
 
 
 
35
  public static function classUrl($class)
36
  {
37
+ $base = self::className($class);
38
  return "/v1/${base}s";
39
  }
40
 
 
 
 
41
  public function instanceUrl()
42
  {
43
  $id = $this['id'];
44
  $class = get_class($this);
45
  if (!$id) {
46
+ throw new Stripe_InvalidRequestError("Could not determine which URL to request: $class instance has invalid ID: $id", null);
 
 
47
  }
48
  $id = Stripe_ApiRequestor::utf8($id);
49
+ $base = self::classUrl($class);
50
  $extn = urlencode($id);
51
  return "$base/$extn";
52
  }
53
 
54
  private static function _validateCall($method, $params=null, $apiKey=null)
55
  {
56
+ if ($params && !is_array($params))
57
+ throw new Stripe_Error("You must pass an array as the first argument to Stripe API method calls. (HINT: an example call to create a charge would be: \"StripeCharge::create(array('amount' => 100, 'currency' => 'usd', 'card' => array('number' => 4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")");
58
+ if ($apiKey && !is_string($apiKey))
59
+ throw new Stripe_Error('The second argument to Stripe API method calls is an optional per-request apiKey, which must be a string. (HINT: you can set a global apiKey by "Stripe::setApiKey(<apiKey>)")');
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
61
 
62
  protected static function _scopedAll($class, $params=null, $apiKey=null)
63
  {
64
  self::_validateCall('all', $params, $apiKey);
65
  $requestor = new Stripe_ApiRequestor($apiKey);
66
+ $url = self::classUrl($class);
67
  list($response, $apiKey) = $requestor->request('get', $url, $params);
68
  return Stripe_Util::convertToStripeObject($response, $apiKey);
69
  }
72
  {
73
  self::_validateCall('create', $params, $apiKey);
74
  $requestor = new Stripe_ApiRequestor($apiKey);
75
+ $url = self::classUrl($class);
76
  list($response, $apiKey) = $requestor->request('post', $url, $params);
77
  return Stripe_Util::convertToStripeObject($response, $apiKey);
78
  }
79
 
80
+ protected function _scopedSave($class)
81
  {
82
  self::_validateCall('save');
83
+ if ($this->_unsavedValues) {
84
+ $requestor = new Stripe_ApiRequestor($this->_apiKey);
85
+ $params = array();
86
+ foreach ($this->_unsavedValues->toArray() as $k)
87
+ $params[$k] = $this->$k;
88
  $url = $this->instanceUrl();
89
  list($response, $apiKey) = $requestor->request('post', $url, $params);
90
  $this->refreshFrom($response, $apiKey);
includes/lib/Stripe/Stripe/ApplicationFee.php DELETED
@@ -1,53 +0,0 @@
1
- <?php
2
-
3
- class Stripe_ApplicationFee extends Stripe_ApiResource
4
- {
5
- /**
6
- * This is a special case because the application fee endpoint has an
7
- * underscore in it. The parent `className` function strips underscores.
8
- *
9
- * @return string The name of the class.
10
- */
11
- public static function className($class)
12
- {
13
- return 'application_fee';
14
- }
15
-
16
- /**
17
- * @param string $id The ID of the application fee to retrieve.
18
- * @param string|null $apiKey
19
- *
20
- * @return Stripe_ApplicationFee
21
- */
22
- public static function retrieve($id, $apiKey=null)
23
- {
24
- $class = get_class();
25
- return self::_scopedRetrieve($class, $id, $apiKey);
26
- }
27
-
28
- /**
29
- * @param string|null $params
30
- * @param string|null $apiKey
31
- *
32
- * @return array An array of application fees.
33
- */
34
- public static function all($params=null, $apiKey=null)
35
- {
36
- $class = get_class();
37
- return self::_scopedAll($class, $params, $apiKey);
38
- }
39
-
40
- /**
41
- * @param string|null $params
42
- *
43
- * @return Stripe_ApplicationFee The refunded application fee.
44
- */
45
- public function refund($params=null)
46
- {
47
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
48
- $url = $this->instanceUrl() . '/refund';
49
- list($response, $apiKey) = $requestor->request('post', $url, $params);
50
- $this->refreshFrom($response, $apiKey);
51
- return $this;
52
- }
53
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/AttachedObject.php DELETED
@@ -1,23 +0,0 @@
1
- <?php
2
-
3
- // e.g. metadata on Stripe objects.
4
- class Stripe_AttachedObject extends Stripe_Object
5
- {
6
- /**
7
- * Updates this object.
8
- *
9
- * @param array $properties A mapping of properties to update on this object.
10
- */
11
- public function replaceWith($properties)
12
- {
13
- $removed = array_diff(array_keys($this->_values), array_keys($properties));
14
- // Don't unset, but rather set to null so we send up '' for deletion.
15
- foreach ($removed as $k) {
16
- $this->$k = null;
17
- }
18
-
19
- foreach ($properties as $k => $v) {
20
- $this->$k = $v;
21
- }
22
- }
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Balance.php DELETED
@@ -1,15 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Balance extends Stripe_SingletonApiResource
4
- {
5
- /**
6
- * @param string|null $apiKey
7
- *
8
- * @return Stripe_Balance
9
- */
10
- public static function retrieve($apiKey=null)
11
- {
12
- $class = get_class();
13
- return self::_scopedSingletonRetrieve($class, $apiKey);
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/BalanceTransaction.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
-
3
- class Stripe_BalanceTransaction extends Stripe_ApiResource
4
- {
5
- /**
6
- * @param string $class Ignored.
7
- *
8
- * @return string The class URL for this resource. It needs to be special
9
- * cased because it doesn't fit into the standard resource pattern.
10
- */
11
- public static function classUrl($class)
12
- {
13
- return "/v1/balance/history";
14
- }
15
-
16
- /**
17
- * @param string $id The ID of the balance transaction to retrieve.
18
- * @param string|null $apiKey
19
- *
20
- * @return Stripe_BalanceTransaction
21
- */
22
- public static function retrieve($id, $apiKey=null)
23
- {
24
- $class = get_class();
25
- return self::_scopedRetrieve($class, $id, $apiKey);
26
- }
27
-
28
- /**
29
- * @param array|null $params
30
- * @param string|null $apiKey
31
- *
32
- * @return array An array of Stripe_BalanceTransactions.
33
- */
34
- public static function all($params=null, $apiKey=null)
35
- {
36
- $class = get_class();
37
- return self::_scopedAll($class, $params, $apiKey);
38
- }
39
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Card.php DELETED
@@ -1,54 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Card extends Stripe_ApiResource
4
- {
5
- public static function constructFrom($values, $apiKey=null)
6
- {
7
- $class = get_class();
8
- return self::scopedConstructFrom($class, $values, $apiKey);
9
- }
10
-
11
- /**
12
- * @return string The instance URL for this resource. It needs to be special
13
- * cased because it doesn't fit into the standard resource pattern.
14
- */
15
- public function instanceUrl()
16
- {
17
- $id = $this['id'];
18
- $customer = $this['customer'];
19
- $class = get_class($this);
20
- if (!$id) {
21
- $msg = "Could not determine which URL to request: $class instance "
22
- . "has invalid ID: $id";
23
- throw new Stripe_InvalidRequestError($msg, null);
24
- }
25
- $id = Stripe_ApiRequestor::utf8($id);
26
- $customer = Stripe_ApiRequestor::utf8($customer);
27
-
28
- $base = self::classUrl('Stripe_Customer');
29
- $customerExtn = urlencode($customer);
30
- $extn = urlencode($id);
31
- return "$base/$customerExtn/cards/$extn";
32
- }
33
-
34
- /**
35
- * @param array|null $params
36
- *
37
- * @return Stripe_Card The deleted card.
38
- */
39
- public function delete($params=null)
40
- {
41
- $class = get_class();
42
- return self::_scopedDelete($class, $params);
43
- }
44
-
45
- /**
46
- * @return Stripe_Card The saved card.
47
- */
48
- public function save()
49
- {
50
- $class = get_class();
51
- return self::_scopedSave($class);
52
- }
53
- }
54
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/CardError.php CHANGED
@@ -2,11 +2,9 @@
2
 
3
  class Stripe_CardError extends Stripe_Error
4
  {
5
- public function __construct($message, $param, $code, $httpStatus,
6
- $httpBody, $jsonBody
7
- )
8
  {
9
- parent::__construct($message, $httpStatus, $httpBody, $jsonBody);
10
  $this->param = $param;
11
  $this->code = $code;
12
  }
2
 
3
  class Stripe_CardError extends Stripe_Error
4
  {
5
+ public function __construct($message, $param, $code, $http_status=null, $http_body=null, $json_body=null)
 
 
6
  {
7
+ parent::__construct($message, $http_status, $http_body, $json_body);
8
  $this->param = $param;
9
  $this->code = $code;
10
  }
includes/lib/Stripe/Stripe/Charge.php CHANGED
@@ -2,56 +2,30 @@
2
 
3
  class Stripe_Charge extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the charge to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Charge
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Charges.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_Charge The created charge.
34
- */
35
  public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @return Stripe_Charge The saved charge.
43
- */
44
- public function save()
45
- {
46
- $class = get_class();
47
- return self::_scopedSave($class);
48
- }
49
-
50
- /**
51
- * @param array|null $params
52
- *
53
- * @return Stripe_Charge The refunded charge.
54
- */
55
  public function refund($params=null)
56
  {
57
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -61,11 +35,6 @@ class Stripe_Charge extends Stripe_ApiResource
61
  return $this;
62
  }
63
 
64
- /**
65
- * @param array|null $params
66
- *
67
- * @return Stripe_Charge The captured charge.
68
- */
69
  public function capture($params=null)
70
  {
71
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -75,11 +44,6 @@ class Stripe_Charge extends Stripe_ApiResource
75
  return $this;
76
  }
77
 
78
- /**
79
- * @param array|null $params
80
- *
81
- * @return array The updated dispute.
82
- */
83
  public function updateDispute($params=null)
84
  {
85
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -88,16 +52,4 @@ class Stripe_Charge extends Stripe_ApiResource
88
  $this->refreshFrom(array('dispute' => $response), $apiKey, true);
89
  return $this->dispute;
90
  }
91
-
92
- /**
93
- * @return Stripe_Charge The updated charge.
94
- */
95
- public function closeDispute()
96
- {
97
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
98
- $url = $this->instanceUrl() . '/dispute/close';
99
- list($response, $apiKey) = $requestor->request('post', $url);
100
- $this->refreshFrom($response, $apiKey);
101
- return $this;
102
- }
103
- }
2
 
3
  class Stripe_Charge extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  public function refund($params=null)
30
  {
31
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
35
  return $this;
36
  }
37
 
 
 
 
 
 
38
  public function capture($params=null)
39
  {
40
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
44
  return $this;
45
  }
46
 
 
 
 
 
 
47
  public function updateDispute($params=null)
48
  {
49
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
52
  $this->refreshFrom(array('dispute' => $response), $apiKey, true);
53
  return $this->dispute;
54
  }
55
+ }
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Coupon.php CHANGED
@@ -2,47 +2,30 @@
2
 
3
  class Stripe_Coupon extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the coupon to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Coupon
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Coupon The created coupon.
22
- */
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- *
32
- * @return Stripe_Coupon The deleted coupon.
33
- */
34
  public function delete($params=null)
35
  {
36
  $class = get_class();
37
  return self::_scopedDelete($class, $params);
38
  }
39
-
40
- /**
41
- * @param array|null $params
42
- * @param string|null $apiKey
43
- *
44
- * @return array An array of Stripe_Coupons.
45
- */
46
  public static function all($params=null, $apiKey=null)
47
  {
48
  $class = get_class();
2
 
3
  class Stripe_Coupon extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function create($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedCreate($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
23
  public function delete($params=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedDelete($class, $params);
27
  }
28
+
 
 
 
 
 
 
29
  public static function all($params=null, $apiKey=null)
30
  {
31
  $class = get_class();
includes/lib/Stripe/Stripe/Customer.php CHANGED
@@ -2,67 +2,42 @@
2
 
3
  class Stripe_Customer extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the customer to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Customer
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Customers.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_Customer The created customer.
34
- */
35
  public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @returns Stripe_Customer The saved customer.
43
- */
44
  public function save()
45
  {
46
  $class = get_class();
47
  return self::_scopedSave($class);
48
  }
49
 
50
- /**
51
- * @param array|null $params
52
- *
53
- * @returns Stripe_Customer The deleted customer.
54
- */
55
  public function delete($params=null)
56
  {
57
  $class = get_class();
58
  return self::_scopedDelete($class, $params);
59
  }
60
 
61
- /**
62
- * @param array|null $params
63
- *
64
- * @returns Stripe_InvoiceItem The resulting invoice item.
65
- */
66
  public function addInvoiceItem($params=null)
67
  {
68
  if (!$params)
@@ -72,11 +47,6 @@ class Stripe_Customer extends Stripe_ApiResource
72
  return $ii;
73
  }
74
 
75
- /**
76
- * @param array|null $params
77
- *
78
- * @returns array An array of the customer's Stripe_Invoices.
79
- */
80
  public function invoices($params=null)
81
  {
82
  if (!$params)
@@ -86,11 +56,6 @@ class Stripe_Customer extends Stripe_ApiResource
86
  return $invoices;
87
  }
88
 
89
- /**
90
- * @param array|null $params
91
- *
92
- * @returns array An array of the customer's Stripe_InvoiceItems.
93
- */
94
  public function invoiceItems($params=null)
95
  {
96
  if (!$params)
@@ -100,11 +65,6 @@ class Stripe_Customer extends Stripe_ApiResource
100
  return $iis;
101
  }
102
 
103
- /**
104
- * @param array|null $params
105
- *
106
- * @returns array An array of the customer's Stripe_Charges.
107
- */
108
  public function charges($params=null)
109
  {
110
  if (!$params)
@@ -114,11 +74,6 @@ class Stripe_Customer extends Stripe_ApiResource
114
  return $charges;
115
  }
116
 
117
- /**
118
- * @param array|null $params
119
- *
120
- * @returns Stripe_Subscription The updated subscription.
121
- */
122
  public function updateSubscription($params=null)
123
  {
124
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -128,11 +83,6 @@ class Stripe_Customer extends Stripe_ApiResource
128
  return $this->subscription;
129
  }
130
 
131
- /**
132
- * @param array|null $params
133
- *
134
- * @returns Stripe_Subscription The cancelled subscription.
135
- */
136
  public function cancelSubscription($params=null)
137
  {
138
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
@@ -142,11 +92,6 @@ class Stripe_Customer extends Stripe_ApiResource
142
  return $this->subscription;
143
  }
144
 
145
- /**
146
- * @param array|null $params
147
- *
148
- * @returns Stripe_Customer The updated customer.
149
- */
150
  public function deleteDiscount()
151
  {
152
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
2
 
3
  class Stripe_Customer extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
 
 
 
29
  public function save()
30
  {
31
  $class = get_class();
32
  return self::_scopedSave($class);
33
  }
34
 
 
 
 
 
 
35
  public function delete($params=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedDelete($class, $params);
39
  }
40
 
 
 
 
 
 
41
  public function addInvoiceItem($params=null)
42
  {
43
  if (!$params)
47
  return $ii;
48
  }
49
 
 
 
 
 
 
50
  public function invoices($params=null)
51
  {
52
  if (!$params)
56
  return $invoices;
57
  }
58
 
 
 
 
 
 
59
  public function invoiceItems($params=null)
60
  {
61
  if (!$params)
65
  return $iis;
66
  }
67
 
 
 
 
 
 
68
  public function charges($params=null)
69
  {
70
  if (!$params)
74
  return $charges;
75
  }
76
 
 
 
 
 
 
77
  public function updateSubscription($params=null)
78
  {
79
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
83
  return $this->subscription;
84
  }
85
 
 
 
 
 
 
86
  public function cancelSubscription($params=null)
87
  {
88
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
92
  return $this->subscription;
93
  }
94
 
 
 
 
 
 
95
  public function deleteDiscount()
96
  {
97
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
includes/lib/Stripe/Stripe/Error.php CHANGED
@@ -2,28 +2,26 @@
2
 
3
  class Stripe_Error extends Exception
4
  {
5
- public function __construct($message, $httpStatus=null,
6
- $httpBody=null, $jsonBody=null
7
- )
8
  {
9
  parent::__construct($message);
10
- $this->httpStatus = $httpStatus;
11
- $this->httpBody = $httpBody;
12
- $this->jsonBody = $jsonBody;
13
  }
14
 
15
  public function getHttpStatus()
16
  {
17
- return $this->httpStatus;
18
  }
19
 
20
  public function getHttpBody()
21
  {
22
- return $this->httpBody;
23
  }
24
 
25
  public function getJsonBody()
26
  {
27
- return $this->jsonBody;
28
  }
29
  }
2
 
3
  class Stripe_Error extends Exception
4
  {
5
+ public function __construct($message=null, $http_status=null, $http_body=null, $json_body=null)
 
 
6
  {
7
  parent::__construct($message);
8
+ $this->http_status = $http_status;
9
+ $this->http_body = $http_body;
10
+ $this->json_body = $json_body;
11
  }
12
 
13
  public function getHttpStatus()
14
  {
15
+ return $this->http_status;
16
  }
17
 
18
  public function getHttpBody()
19
  {
20
+ return $this->http_body;
21
  }
22
 
23
  public function getJsonBody()
24
  {
25
+ return $this->json_body;
26
  }
27
  }
includes/lib/Stripe/Stripe/Event.php CHANGED
@@ -2,24 +2,18 @@
2
 
3
  class Stripe_Event extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the event to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Event
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Events.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
2
 
3
  class Stripe_Event extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
includes/lib/Stripe/Stripe/InvalidRequestError.php CHANGED
@@ -2,11 +2,9 @@
2
 
3
  class Stripe_InvalidRequestError extends Stripe_Error
4
  {
5
- public function __construct($message, $param, $httpStatus=null,
6
- $httpBody=null, $jsonBody=null
7
- )
8
  {
9
- parent::__construct($message, $httpStatus, $httpBody, $jsonBody);
10
  $this->param = $param;
11
  }
12
  }
2
 
3
  class Stripe_InvalidRequestError extends Stripe_Error
4
  {
5
+ public function __construct($message, $param, $http_status=null, $http_body=null, $json_body=null)
 
 
6
  {
7
+ parent::__construct($message, $http_status, $http_body, $json_body);
8
  $this->param = $param;
9
  }
10
  }
includes/lib/Stripe/Stripe/Invoice.php CHANGED
@@ -2,48 +2,30 @@
2
 
3
  class Stripe_Invoice extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param array|null $params
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Invoice The created invoice.
10
- */
11
  public static function create($params=null, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedCreate($class, $params, $apiKey);
15
  }
16
 
17
- /**
18
- * @param string $id The ID of the invoice to retrieve.
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Invoice
22
- */
23
  public static function retrieve($id, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedRetrieve($class, $id, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return array An array of Stripe_Invoices.
34
- */
35
  public static function all($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedAll($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @param array|null $params
43
- * @param string|null $apiKey
44
- *
45
- * @return Stripe_Invoice The upcoming invoice.
46
- */
47
  public static function upcoming($params=null, $apiKey=null)
48
  {
49
  $requestor = new Stripe_ApiRequestor($apiKey);
@@ -52,18 +34,12 @@ class Stripe_Invoice extends Stripe_ApiResource
52
  return Stripe_Util::convertToStripeObject($response, $apiKey);
53
  }
54
 
55
- /**
56
- * @return Stripe_Invoice The saved invoice.
57
- */
58
  public function save()
59
  {
60
  $class = get_class();
61
  return self::_scopedSave($class);
62
  }
63
 
64
- /**
65
- * @return Stripe_Invoice The paid invoice.
66
- */
67
  public function pay()
68
  {
69
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
2
 
3
  class Stripe_Invoice extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function create($params=null, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedCreate($class, $params, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function retrieve($id, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedRetrieve($class, $id, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
 
 
 
 
 
 
29
  public static function upcoming($params=null, $apiKey=null)
30
  {
31
  $requestor = new Stripe_ApiRequestor($apiKey);
34
  return Stripe_Util::convertToStripeObject($response, $apiKey);
35
  }
36
 
 
 
 
37
  public function save()
38
  {
39
  $class = get_class();
40
  return self::_scopedSave($class);
41
  }
42
 
 
 
 
43
  public function pay()
44
  {
45
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
includes/lib/Stripe/Stripe/InvoiceItem.php CHANGED
@@ -2,54 +2,36 @@
2
 
3
  class Stripe_InvoiceItem extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the invoice item to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_InvoiceItem
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_InvoiceItems.
22
- */
23
  public static function all($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedAll($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_InvoiceItem The created invoice item.
34
- */
35
  public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
  return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @return Stripe_InvoiceItem The saved invoice item.
43
- */
44
  public function save()
45
  {
46
  $class = get_class();
47
  return self::_scopedSave($class);
48
  }
49
 
50
- /**
51
- * @return Stripe_InvoiceItem The deleted invoice item.
52
- */
53
  public function delete($params=null)
54
  {
55
  $class = get_class();
2
 
3
  class Stripe_InvoiceItem extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function all($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedAll($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
 
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
 
 
 
29
  public function save()
30
  {
31
  $class = get_class();
32
  return self::_scopedSave($class);
33
  }
34
 
 
 
 
35
  public function delete($params=null)
36
  {
37
  $class = get_class();
includes/lib/Stripe/Stripe/List.php CHANGED
@@ -2,36 +2,16 @@
2
 
3
  class Stripe_List extends Stripe_Object
4
  {
5
- public function all($params=null)
6
- {
7
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
8
- list($response, $apiKey) = $requestor->request(
9
- 'get',
10
- $this['url'],
11
- $params
12
- );
13
- return Stripe_Util::convertToStripeObject($response, $apiKey);
14
- }
15
-
16
- public function create($params=null)
17
  {
18
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
19
- list($response, $apiKey) = $requestor->request(
20
- 'post', $this['url'], $params
21
- );
22
- return Stripe_Util::convertToStripeObject($response, $apiKey);
23
  }
24
 
25
- public function retrieve($id, $params=null)
26
  {
27
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
28
- $base = $this['url'];
29
- $id = Stripe_ApiRequestor::utf8($id);
30
- $extn = urlencode($id);
31
- list($response, $apiKey) = $requestor->request(
32
- 'get', "$base/$extn", $params
33
- );
34
  return Stripe_Util::convertToStripeObject($response, $apiKey);
35
  }
36
-
37
  }
2
 
3
  class Stripe_List extends Stripe_Object
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
 
 
 
 
 
 
 
 
 
 
 
6
  {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
 
 
 
9
  }
10
 
11
+ public function all($params=null)
12
  {
13
  $requestor = new Stripe_ApiRequestor($this->_apiKey);
14
+ list($response, $apiKey) = $requestor->request('get', $this['url'], $params);
 
 
 
 
 
15
  return Stripe_Util::convertToStripeObject($response, $apiKey);
16
  }
 
17
  }
includes/lib/Stripe/Stripe/Object.php CHANGED
@@ -2,28 +2,17 @@
2
 
3
  class Stripe_Object implements ArrayAccess
4
  {
5
- /**
6
- * @var array Attributes that should not be sent to the API because they're
7
- * not updatable (e.g. API key, ID).
8
- */
9
- public static $permanentAttributes;
10
- /**
11
- * @var array Attributes that are nested but still updatable from the parent
12
- * class's URL (e.g. metadata).
13
- */
14
- public static $nestedUpdatableAttributes;
15
 
16
  public static function init()
17
  {
18
- self::$permanentAttributes = new Stripe_Util_Set(array('_apiKey', 'id'));
19
- self::$nestedUpdatableAttributes = new Stripe_Util_Set(array('metadata'));
20
  }
21
 
22
  protected $_apiKey;
23
  protected $_values;
24
  protected $_unsavedValues;
25
  protected $_transientValues;
26
- protected $_retrieveOptions;
27
 
28
  public function __construct($id=null, $apiKey=null)
29
  {
@@ -31,16 +20,6 @@ class Stripe_Object implements ArrayAccess
31
  $this->_values = array();
32
  $this->_unsavedValues = new Stripe_Util_Set();
33
  $this->_transientValues = new Stripe_Util_Set();
34
-
35
- $this->_retrieveOptions = array();
36
- if (is_array($id)) {
37
- foreach ($id as $key => $value) {
38
- if ($key != 'id')
39
- $this->_retrieveOptions[$key] = $value;
40
- }
41
- $id = $id['id'];
42
- }
43
-
44
  if ($id)
45
  $this->id = $id;
46
  }
@@ -48,21 +27,9 @@ class Stripe_Object implements ArrayAccess
48
  // Standard accessor magic methods
49
  public function __set($k, $v)
50
  {
51
- if ($v === "") {
52
- throw new InvalidArgumentException(
53
- 'You cannot set \''.$k.'\'to an empty string. '
54
- .'We interpret empty strings as NULL in requests. '
55
- .'You may set obj->'.$k.' = NULL to delete the property'
56
- );
57
- }
58
-
59
- if (self::$nestedUpdatableAttributes->includes($k) && isset($this->$k) && is_array($v)) {
60
- $this->$k->replaceWith($v);
61
- } else {
62
- // TODO: may want to clear from $_transientValues. (Won't be user-visible.)
63
- $this->_values[$k] = $v;
64
- }
65
- if (!self::$permanentAttributes->includes($k))
66
  $this->_unsavedValues->add($k);
67
  }
68
  public function __isset($k)
@@ -82,13 +49,7 @@ class Stripe_Object implements ArrayAccess
82
  } else if ($this->_transientValues->includes($k)) {
83
  $class = get_class($this);
84
  $attrs = join(', ', array_keys($this->_values));
85
- $message = "Stripe Notice: Undefined property of $class instance: $k. "
86
- . "HINT: The $k attribute was set in the past, however. "
87
- . "It was then wiped when refreshing the object "
88
- . "with the result returned by Stripe's API, "
89
- . "probably as a result of a save(). The attributes currently "
90
- . "available on this object are: $attrs";
91
- error_log($message);
92
  return null;
93
  } else {
94
  $class = get_class($this);
@@ -102,7 +63,7 @@ class Stripe_Object implements ArrayAccess
102
  {
103
  $this->$k = $v;
104
  }
105
-
106
  public function offsetExists($k)
107
  {
108
  return array_key_exists($k, $this->_values);
@@ -117,20 +78,7 @@ class Stripe_Object implements ArrayAccess
117
  return array_key_exists($k, $this->_values) ? $this->_values[$k] : null;
118
  }
119
 
120
- public function keys()
121
- {
122
- return array_keys($this->_values);
123
- }
124
-
125
- /**
126
- * This unfortunately needs to be public to be used in Util.php
127
- *
128
- * @param Stripe_Object $class
129
- * @param array $values
130
- * @param string|null $apiKey
131
- *
132
- * @return Stripe_Object The object constructed from the given values.
133
- */
134
  public static function scopedConstructFrom($class, $values, $apiKey=null)
135
  {
136
  $obj = new $class(isset($values['id']) ? $values['id'] : null, $apiKey);
@@ -138,30 +86,15 @@ class Stripe_Object implements ArrayAccess
138
  return $obj;
139
  }
140
 
141
- /**
142
- * @param array $values
143
- * @param string|null $apiKey
144
- *
145
- * @return Stripe_Object The object of the same class as $this constructed
146
- * from the given values.
147
- */
148
  public static function constructFrom($values, $apiKey=null)
149
  {
150
- $class = get_class($this);
151
  return self::scopedConstructFrom($class, $values, $apiKey);
152
  }
153
 
154
- /**
155
- * Refreshes this object using the provided values.
156
- *
157
- * @param array $values
158
- * @param string $apiKey
159
- * @param boolean $partial Defaults to false.
160
- */
161
  public function refreshFrom($values, $apiKey, $partial=false)
162
  {
163
  $this->_apiKey = $apiKey;
164
-
165
  // Wipe old state before setting new. This is useful for e.g. updating a
166
  // customer, where there is no persistent card parameter. Mark those values
167
  // which don't persist as transient
@@ -171,64 +104,20 @@ class Stripe_Object implements ArrayAccess
171
  $removed = array_diff(array_keys($this->_values), array_keys($values));
172
 
173
  foreach ($removed as $k) {
174
- if (self::$permanentAttributes->includes($k))
175
  continue;
176
  unset($this->$k);
177
  }
178
 
179
  foreach ($values as $k => $v) {
180
- if (self::$permanentAttributes->includes($k))
181
  continue;
182
-
183
- if (self::$nestedUpdatableAttributes->includes($k) && is_array($v))
184
- $this->_values[$k] = Stripe_Object::scopedConstructFrom('Stripe_AttachedObject', $v, $apiKey);
185
- else
186
- $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey);
187
-
188
  $this->_transientValues->discard($k);
189
  $this->_unsavedValues->discard($k);
190
  }
191
  }
192
 
193
- /**
194
- * @return array A recursive mapping of attributes to values for this object,
195
- * including the proper value for deleted attributes.
196
- */
197
- public function serializeParameters()
198
- {
199
- $params = array();
200
- if ($this->_unsavedValues) {
201
- foreach ($this->_unsavedValues->toArray() as $k) {
202
- $v = $this->$k;
203
- if ($v === NULL) {
204
- $v = '';
205
- }
206
- $params[$k] = $v;
207
- }
208
- }
209
-
210
- // Get nested updates.
211
- foreach (self::$nestedUpdatableAttributes->toArray() as $property) {
212
- if (isset($this->$property) && $this->$property instanceOf Stripe_Object) {
213
- $params[$property] = $this->$property->serializeParameters();
214
- }
215
- }
216
- return $params;
217
- }
218
-
219
- // Pretend to have late static bindings, even in PHP 5.2
220
- protected function _lsb($method)
221
- {
222
- $class = get_class($this);
223
- $args = array_slice(func_get_args(), 1);
224
- return call_user_func_array(array($class, $method), $args);
225
- }
226
- protected static function _scopedLsb($class, $method)
227
- {
228
- $args = array_slice(func_get_args(), 2);
229
- return call_user_func_array(array($class, $method), $args);
230
- }
231
-
232
  public function __toJSON()
233
  {
234
  if (defined('JSON_PRETTY_PRINT'))
2
 
3
  class Stripe_Object implements ArrayAccess
4
  {
5
+ public static $_permanentAttributes;
 
 
 
 
 
 
 
 
 
6
 
7
  public static function init()
8
  {
9
+ self::$_permanentAttributes = new Stripe_Util_Set(array('_apiKey'));
 
10
  }
11
 
12
  protected $_apiKey;
13
  protected $_values;
14
  protected $_unsavedValues;
15
  protected $_transientValues;
 
16
 
17
  public function __construct($id=null, $apiKey=null)
18
  {
20
  $this->_values = array();
21
  $this->_unsavedValues = new Stripe_Util_Set();
22
  $this->_transientValues = new Stripe_Util_Set();
 
 
 
 
 
 
 
 
 
 
23
  if ($id)
24
  $this->id = $id;
25
  }
27
  // Standard accessor magic methods
28
  public function __set($k, $v)
29
  {
30
+ // TODO: may want to clear from $_transientValues. (Won't be user-visible.)
31
+ $this->_values[$k] = $v;
32
+ if (!self::$_permanentAttributes->includes($k))
 
 
 
 
 
 
 
 
 
 
 
 
33
  $this->_unsavedValues->add($k);
34
  }
35
  public function __isset($k)
49
  } else if ($this->_transientValues->includes($k)) {
50
  $class = get_class($this);
51
  $attrs = join(', ', array_keys($this->_values));
52
+ error_log("Stripe Notice: Undefined property of $class instance: $k. HINT: The $k attribute was set in the past, however. It was then wiped when refreshing the object with the result returned by Stripe's API, probably as a result of a save(). The attributes currently available on this object are: $attrs");
 
 
 
 
 
 
53
  return null;
54
  } else {
55
  $class = get_class($this);
63
  {
64
  $this->$k = $v;
65
  }
66
+
67
  public function offsetExists($k)
68
  {
69
  return array_key_exists($k, $this->_values);
78
  return array_key_exists($k, $this->_values) ? $this->_values[$k] : null;
79
  }
80
 
81
+ // This unfortunately needs to be public to be used in Util.php
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  public static function scopedConstructFrom($class, $values, $apiKey=null)
83
  {
84
  $obj = new $class(isset($values['id']) ? $values['id'] : null, $apiKey);
86
  return $obj;
87
  }
88
 
 
 
 
 
 
 
 
89
  public static function constructFrom($values, $apiKey=null)
90
  {
91
+ $class = get_class();
92
  return self::scopedConstructFrom($class, $values, $apiKey);
93
  }
94
 
 
 
 
 
 
 
 
95
  public function refreshFrom($values, $apiKey, $partial=false)
96
  {
97
  $this->_apiKey = $apiKey;
 
98
  // Wipe old state before setting new. This is useful for e.g. updating a
99
  // customer, where there is no persistent card parameter. Mark those values
100
  // which don't persist as transient
104
  $removed = array_diff(array_keys($this->_values), array_keys($values));
105
 
106
  foreach ($removed as $k) {
107
+ if (self::$_permanentAttributes->includes($k))
108
  continue;
109
  unset($this->$k);
110
  }
111
 
112
  foreach ($values as $k => $v) {
113
+ if (self::$_permanentAttributes->includes($k))
114
  continue;
115
+ $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey);
 
 
 
 
 
116
  $this->_transientValues->discard($k);
117
  $this->_unsavedValues->discard($k);
118
  }
119
  }
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  public function __toJSON()
122
  {
123
  if (defined('JSON_PRETTY_PRINT'))
includes/lib/Stripe/Stripe/Plan.php CHANGED
@@ -2,56 +2,36 @@
2
 
3
  class Stripe_Plan extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the plan to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Plan
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Plan The created plan.
22
- */
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedCreate($class, $params, $apiKey);
27
  }
28
 
29
- /**
30
- * @param array|null $params
31
- *
32
- * @return Stripe_Plan The deleted plan.
33
- */
34
  public function delete($params=null)
35
  {
36
  $class = get_class();
37
  return self::_scopedDelete($class, $params);
38
  }
39
 
40
- /**
41
- * @return Stripe_Plan The saved plan.
42
- */
43
  public function save()
44
  {
45
  $class = get_class();
46
  return self::_scopedSave($class);
47
  }
48
 
49
- /**
50
- * @param array|null $params
51
- * @param string|null $apiKey
52
- *
53
- * @return array An array of Stripe_Plans.
54
- */
55
  public static function all($params=null, $apiKey=null)
56
  {
57
  $class = get_class();
2
 
3
  class Stripe_Plan extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function create($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
20
  return self::_scopedCreate($class, $params, $apiKey);
21
  }
22
 
 
 
 
 
 
23
  public function delete($params=null)
24
  {
25
  $class = get_class();
26
  return self::_scopedDelete($class, $params);
27
  }
28
 
 
 
 
29
  public function save()
30
  {
31
  $class = get_class();
32
  return self::_scopedSave($class);
33
  }
34
 
 
 
 
 
 
 
35
  public static function all($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
includes/lib/Stripe/Stripe/Recipient.php DELETED
@@ -1,75 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Recipient extends Stripe_ApiResource
4
- {
5
- /**
6
- * @param string $id The ID of the recipient to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Recipient
10
- */
11
- public static function retrieve($id, $apiKey=null)
12
- {
13
- $class = get_class();
14
- return self::_scopedRetrieve($class, $id, $apiKey);
15
- }
16
-
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Recipients.
22
- */
23
- public static function all($params=null, $apiKey=null)
24
- {
25
- $class = get_class();
26
- return self::_scopedAll($class, $params, $apiKey);
27
- }
28
-
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_Recipient The created recipient.
34
- */
35
- public static function create($params=null, $apiKey=null)
36
- {
37
- $class = get_class();
38
- return self::_scopedCreate($class, $params, $apiKey);
39
- }
40
-
41
- /**
42
- * @return Stripe_Recipient The saved recipient.
43
- */
44
- public function save()
45
- {
46
- $class = get_class();
47
- return self::_scopedSave($class);
48
- }
49
-
50
- /**
51
- * @param array|null $params
52
- *
53
- * @return Stripe_Recipient The deleted recipient.
54
- */
55
- public function delete($params=null)
56
- {
57
- $class = get_class();
58
- return self::_scopedDelete($class, $params);
59
- }
60
-
61
-
62
- /**
63
- * @param array|null $params
64
- *
65
- * @return array An array of the recipient's Stripe_Transfers.
66
- */
67
- public function transfers($params=null)
68
- {
69
- if (!$params)
70
- $params = array();
71
- $params['recipient'] = $this->id;
72
- $transfers = Stripe_Transfer::all($params, $this->_apiKey);
73
- return $transfers;
74
- }
75
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/SingletonApiResource.php CHANGED
@@ -9,19 +9,12 @@ abstract class Stripe_SingletonApiResource extends Stripe_ApiResource
9
  return $instance;
10
  }
11
 
12
- /**
13
- * @param Stripe_SingletonApiResource $class
14
- * @return string The endpoint associated with this singleton class.
15
- */
16
  public static function classUrl($class)
17
  {
18
  $base = self::className($class);
19
  return "/v1/${base}";
20
  }
21
 
22
- /**
23
- * @return string The endpoint associated with this singleton API resource.
24
- */
25
  public function instanceUrl()
26
  {
27
  $class = get_class($this);
9
  return $instance;
10
  }
11
 
 
 
 
 
12
  public static function classUrl($class)
13
  {
14
  $base = self::className($class);
15
  return "/v1/${base}";
16
  }
17
 
 
 
 
18
  public function instanceUrl()
19
  {
20
  $class = get_class($this);
includes/lib/Stripe/Stripe/Stripe.php CHANGED
@@ -2,72 +2,26 @@
2
 
3
  abstract class Stripe
4
  {
5
- /**
6
- * @var string The Stripe API key to be used for requests.
7
- */
8
  public static $apiKey;
9
- /**
10
- * @var string The base URL for the Stripe API.
11
- */
12
  public static $apiBase = 'https://api.stripe.com';
13
- /**
14
- * @var string|null The version of the Stripe API to use for requests.
15
- */
16
- public static $apiVersion = null;
17
- /**
18
- * @var boolean Defaults to true.
19
- */
20
  public static $verifySslCerts = true;
21
- const VERSION = '1.11.0';
22
 
23
- /**
24
- * @return string The API key used for requests.
25
- */
26
  public static function getApiKey()
27
  {
28
  return self::$apiKey;
29
  }
30
 
31
- /**
32
- * Sets the API key to be used for requests.
33
- *
34
- * @param string $apiKey
35
- */
36
  public static function setApiKey($apiKey)
37
  {
38
  self::$apiKey = $apiKey;
39
  }
40
 
41
- /**
42
- * @return string The API version used for requests. null if we're using the
43
- * latest version.
44
- */
45
- public static function getApiVersion()
46
- {
47
- return self::$apiVersion;
48
- }
49
-
50
- /**
51
- * @param string $apiVersion The API version to use for requests.
52
- */
53
- public static function setApiVersion($apiVersion)
54
- {
55
- self::$apiVersion = $apiVersion;
56
- }
57
-
58
- /**
59
- * @return boolean
60
- */
61
- public static function getVerifySslCerts()
62
- {
63
  return self::$verifySslCerts;
64
  }
65
 
66
- /**
67
- * @param boolean $verify
68
- */
69
- public static function setVerifySslCerts($verify)
70
- {
71
  self::$verifySslCerts = $verify;
72
  }
73
  }
2
 
3
  abstract class Stripe
4
  {
 
 
 
5
  public static $apiKey;
 
 
 
6
  public static $apiBase = 'https://api.stripe.com';
 
 
 
 
 
 
 
7
  public static $verifySslCerts = true;
8
+ const VERSION = '1.7.9';
9
 
 
 
 
10
  public static function getApiKey()
11
  {
12
  return self::$apiKey;
13
  }
14
 
 
 
 
 
 
15
  public static function setApiKey($apiKey)
16
  {
17
  self::$apiKey = $apiKey;
18
  }
19
 
20
+ public static function getVerifySslCerts() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  return self::$verifySslCerts;
22
  }
23
 
24
+ public static function setVerifySslCerts($verify) {
 
 
 
 
25
  self::$verifySslCerts = $verify;
26
  }
27
  }
includes/lib/Stripe/Stripe/Subscription.php DELETED
@@ -1,58 +0,0 @@
1
- <?php
2
-
3
- class Stripe_Subscription extends Stripe_ApiResource
4
- {
5
- /**
6
- * @return string The API URL for this Stripe subscription.
7
- */
8
- public function instanceUrl()
9
- {
10
- $id = $this['id'];
11
- $customer = $this['customer'];
12
- $class = get_class($this);
13
- if (!$id) {
14
- throw new Stripe_InvalidRequestError(
15
- "Could not determine which URL to request: " .
16
- "class instance has invalid ID: $id",
17
- null
18
- );
19
- }
20
- $id = Stripe_ApiRequestor::utf8($id);
21
- $customer = Stripe_ApiRequestor::utf8($customer);
22
-
23
- $base = self::classUrl('Stripe_Customer');
24
- $customerExtn = urlencode($customer);
25
- $extn = urlencode($id);
26
- return "$base/$customerExtn/subscriptions/$extn";
27
- }
28
-
29
- /**
30
- * @param array|null $params
31
- * @return Stripe_Subscription The deleted subscription.
32
- */
33
- public function cancel($params=null)
34
- {
35
- $class = get_class();
36
- return self::_scopedDelete($class, $params);
37
- }
38
-
39
- /**
40
- * @return Stripe_Subscription The saved subscription.
41
- */
42
- public function save()
43
- {
44
- $class = get_class();
45
- return self::_scopedSave($class);
46
- }
47
-
48
- /**
49
- * @return Stripe_Subscription The updated subscription.
50
- */
51
- public function deleteDiscount()
52
- {
53
- $requestor = new Stripe_ApiRequestor($this->_apiKey);
54
- $url = $this->instanceUrl() . '/discount';
55
- list($response, $apiKey) = $requestor->request('delete', $url);
56
- $this->refreshFrom(array('discount' => null), $apiKey, true);
57
- }
58
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Stripe/Stripe/Token.php CHANGED
@@ -2,24 +2,18 @@
2
 
3
  class Stripe_Token extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the token to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Token
10
- */
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return Stripe_Coupon The created token.
22
- */
23
  public static function create($params=null, $apiKey=null)
24
  {
25
  $class = get_class();
2
 
3
  class Stripe_Token extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
6
+ {
7
+ $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
+ }
10
+
11
  public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
  return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
 
 
 
 
 
 
17
  public static function create($params=null, $apiKey=null)
18
  {
19
  $class = get_class();
includes/lib/Stripe/Stripe/Transfer.php CHANGED
@@ -2,49 +2,21 @@
2
 
3
  class Stripe_Transfer extends Stripe_ApiResource
4
  {
5
- /**
6
- * @param string $id The ID of the transfer to retrieve.
7
- * @param string|null $apiKey
8
- *
9
- * @return Stripe_Transfer
10
- */
11
- public static function retrieve($id, $apiKey=null)
12
  {
13
  $class = get_class();
14
- return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
- /**
18
- * @param array|null $params
19
- * @param string|null $apiKey
20
- *
21
- * @return array An array of Stripe_Transfers.
22
- */
23
- public static function all($params=null, $apiKey=null)
24
- {
25
- $class = get_class();
26
- return self::_scopedAll($class, $params, $apiKey);
27
- }
28
-
29
- /**
30
- * @param array|null $params
31
- * @param string|null $apiKey
32
- *
33
- * @return Stripe_Transfer The created transfer.
34
- */
35
- public static function create($params=null, $apiKey=null)
36
  {
37
  $class = get_class();
38
- return self::_scopedCreate($class, $params, $apiKey);
39
  }
40
 
41
- /**
42
- * @return Stripe_Transfer The saved transfer.
43
- */
44
- public function save()
45
  {
46
  $class = get_class();
47
- return self::_scopedSave($class);
48
  }
49
-
50
  }
2
 
3
  class Stripe_Transfer extends Stripe_ApiResource
4
  {
5
+ public static function constructFrom($values, $apiKey=null)
 
 
 
 
 
 
6
  {
7
  $class = get_class();
8
+ return self::scopedConstructFrom($class, $values, $apiKey);
9
  }
10
 
11
+ public static function retrieve($id, $apiKey=null)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  {
13
  $class = get_class();
14
+ return self::_scopedRetrieve($class, $id, $apiKey);
15
  }
16
 
17
+ public static function all($params=null, $apiKey=null)
 
 
 
18
  {
19
  $class = get_class();
20
+ return self::_scopedAll($class, $params, $apiKey);
21
  }
 
22
  }
includes/lib/Stripe/Stripe/Util.php CHANGED
@@ -2,18 +2,11 @@
2
 
3
  abstract class Stripe_Util
4
  {
5
- /**
6
- * Whether the provided array (or other) is a list rather than a dictionary.
7
- *
8
- * @param array|mixed $array
9
- * @return boolean True if the given object is a list.
10
- */
11
  public static function isList($array)
12
  {
13
  if (!is_array($array))
14
  return false;
15
-
16
- // TODO: generally incorrect, but it's correct given Stripe's response
17
  foreach (array_keys($array) as $k) {
18
  if (!is_numeric($k))
19
  return false;
@@ -21,66 +14,45 @@ abstract class Stripe_Util
21
  return true;
22
  }
23
 
24
- /**
25
- * Recursively converts the PHP Stripe object to an array.
26
- *
27
- * @param array $values The PHP Stripe object to convert.
28
- * @return array
29
- */
30
  public static function convertStripeObjectToArray($values)
31
  {
32
  $results = array();
33
  foreach ($values as $k => $v) {
34
  // FIXME: this is an encapsulation violation
35
- if ($k[0] == '_') {
36
  continue;
37
  }
38
  if ($v instanceof Stripe_Object) {
39
  $results[$k] = $v->__toArray(true);
40
- } else if (is_array($v)) {
 
41
  $results[$k] = self::convertStripeObjectToArray($v);
42
- } else {
 
43
  $results[$k] = $v;
44
  }
45
  }
46
  return $results;
47
  }
48
 
49
- /**
50
- * Converts a response from the Stripe API to the corresponding PHP object.
51
- *
52
- * @param array $resp The response from the Stripe API.
53
- * @param string $apiKey
54
- * @return Stripe_Object|array
55
- */
56
  public static function convertToStripeObject($resp, $apiKey)
57
  {
58
- $types = array(
59
- 'card' => 'Stripe_Card',
60
- 'charge' => 'Stripe_Charge',
61
- 'customer' => 'Stripe_Customer',
62
- 'list' => 'Stripe_List',
63
- 'invoice' => 'Stripe_Invoice',
64
- 'invoiceitem' => 'Stripe_InvoiceItem',
65
- 'event' => 'Stripe_Event',
66
- 'transfer' => 'Stripe_Transfer',
67
- 'plan' => 'Stripe_Plan',
68
- 'recipient' => 'Stripe_Recipient',
69
- 'subscription' => 'Stripe_Subscription'
70
- );
71
  if (self::isList($resp)) {
72
  $mapped = array();
73
  foreach ($resp as $i)
74
  array_push($mapped, self::convertToStripeObject($i, $apiKey));
75
  return $mapped;
76
  } else if (is_array($resp)) {
77
- if (isset($resp['object'])
78
- && is_string($resp['object'])
79
- && isset($types[$resp['object']])) {
80
  $class = $types[$resp['object']];
81
- } else {
82
  $class = 'Stripe_Object';
83
- }
84
  return Stripe_Object::scopedConstructFrom($class, $resp, $apiKey);
85
  } else {
86
  return $resp;
2
 
3
  abstract class Stripe_Util
4
  {
 
 
 
 
 
 
5
  public static function isList($array)
6
  {
7
  if (!is_array($array))
8
  return false;
9
+ // TODO: this isn't actually correct in general, but it's correct given Stripe's responses
 
10
  foreach (array_keys($array) as $k) {
11
  if (!is_numeric($k))
12
  return false;
14
  return true;
15
  }
16
 
 
 
 
 
 
 
17
  public static function convertStripeObjectToArray($values)
18
  {
19
  $results = array();
20
  foreach ($values as $k => $v) {
21
  // FIXME: this is an encapsulation violation
22
+ if (Stripe_Object::$_permanentAttributes->includes($k)) {
23
  continue;
24
  }
25
  if ($v instanceof Stripe_Object) {
26
  $results[$k] = $v->__toArray(true);
27
+ }
28
+ else if (is_array($v)) {
29
  $results[$k] = self::convertStripeObjectToArray($v);
30
+ }
31
+ else {
32
  $results[$k] = $v;
33
  }
34
  }
35
  return $results;
36
  }
37
 
 
 
 
 
 
 
 
38
  public static function convertToStripeObject($resp, $apiKey)
39
  {
40
+ $types = array('charge' => 'Stripe_Charge',
41
+ 'customer' => 'Stripe_Customer',
42
+ 'list' => 'Stripe_List',
43
+ 'invoice' => 'Stripe_Invoice',
44
+ 'invoiceitem' => 'Stripe_InvoiceItem', 'event' => 'Stripe_Event',
45
+ 'transfer' => 'Stripe_Transfer');
 
 
 
 
 
 
 
46
  if (self::isList($resp)) {
47
  $mapped = array();
48
  foreach ($resp as $i)
49
  array_push($mapped, self::convertToStripeObject($i, $apiKey));
50
  return $mapped;
51
  } else if (is_array($resp)) {
52
+ if (isset($resp['object']) && is_string($resp['object']) && isset($types[$resp['object']]))
 
 
53
  $class = $types[$resp['object']];
54
+ else
55
  $class = 'Stripe_Object';
 
56
  return Stripe_Object::scopedConstructFrom($class, $resp, $apiKey);
57
  } else {
58
  return $resp;
includes/lib/Twocheckout/Twocheckout.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
-
3
- abstract class Twocheckout
4
- {
5
- public static $user;
6
- public static $pass;
7
- public static $format = "json";
8
- public static $apiBaseUrl = "https://www.2checkout.com/api/";
9
- public static $error;
10
- const VERSION = '0.1.2';
11
-
12
- static function setCredentials($user, $pass)
13
- {
14
- self::$user = $user;
15
- self::$pass = $pass;
16
- }
17
- }
18
-
19
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutAccount.php');
20
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutPayment.php');
21
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutApi.php');
22
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutSale.php');
23
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutProduct.php');
24
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutCoupon.php');
25
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutOption.php');
26
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutUtil.php');
27
- require(dirname(__FILE__) . '/Twocheckout/Api/TwocheckoutError.php');
28
- require(dirname(__FILE__) . '/Twocheckout/TwocheckoutReturn.php');
29
- require(dirname(__FILE__) . '/Twocheckout/TwocheckoutNotification.php');
30
- require(dirname(__FILE__) . '/Twocheckout/TwocheckoutCharge.php');
31
- require(dirname(__FILE__) . '/Twocheckout/TwocheckoutMessage.php');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutAccount.php DELETED
@@ -1,25 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Company extends Twocheckout
4
- {
5
-
6
- public static function retrieve($format='json')
7
- {
8
- $request = new Twocheckout_Api_Requester();
9
- $urlSuffix = 'acct/detail_company_info';
10
- $result = $request->do_call($urlSuffix);
11
- return Twocheckout_Util::return_resp($result, $format);
12
- }
13
- }
14
-
15
- class Twocheckout_Contact extends Twocheckout
16
- {
17
-
18
- public static function retrieve($format='json')
19
- {
20
- $request = new Twocheckout_Api_Requester();
21
- $urlSuffix = 'acct/detail_contact_info';
22
- $result = $request->do_call($urlSuffix);
23
- return Twocheckout_Util::return_resp($result, $format);
24
- }
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutApi.php DELETED
@@ -1,33 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Api_Requester
4
- {
5
- public $apiBaseUrl;
6
- private $user;
7
- private $pass;
8
-
9
- function __construct() {
10
- $this->user = Twocheckout::$user;
11
- $this->pass = Twocheckout::$pass;
12
- $this->apiBaseUrl = Twocheckout::$apiBaseUrl;
13
- }
14
-
15
- function do_call($urlSuffix, $data=array())
16
- {
17
- $url = $this->apiBaseUrl . $urlSuffix;
18
- $ch = curl_init($url);
19
- curl_setopt($ch, CURLOPT_HEADER, 0);
20
- curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
21
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
22
- curl_setopt($ch, CURLOPT_USERAGENT, "2Checkout PHP/0.1.0%s");
23
- curl_setopt($ch, CURLOPT_POST, 0);
24
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
25
- curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
26
- curl_setopt($ch, CURLOPT_USERPWD, "{$this->user}:{$this->pass}");
27
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
28
- $resp = curl_exec($ch);
29
- curl_close($ch);
30
- return $resp;
31
- }
32
-
33
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutCoupon.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Coupon extends Twocheckout
4
- {
5
-
6
- public static function create($params=array(), $format='json')
7
- {
8
- $request = new Twocheckout_Api_Requester();
9
- $urlSuffix = 'products/create_coupon';
10
- $result = $request->do_call($urlSuffix, $params);
11
- return Twocheckout_Util::return_resp($result, $format);
12
- }
13
-
14
- public static function retrieve($params=array(), $format='json')
15
- {
16
- $request = new Twocheckout_Api_Requester();
17
- if(array_key_exists("coupon_code",$params)) {
18
- $urlSuffix = 'products/detail_coupon';
19
- } else {
20
- $urlSuffix = 'products/list_coupons';
21
- }
22
- $result = $request->do_call($urlSuffix, $params);
23
- return Twocheckout_Util::return_resp($result, $format);
24
- }
25
-
26
- public static function update($params=array(), $format='json')
27
- {
28
- $request = new Twocheckout_Api_Requester();
29
- $urlSuffix = 'products/update_coupon';
30
- $result = $request->do_call($urlSuffix, $params);
31
- return Twocheckout_Util::return_resp($result, $format);
32
- }
33
-
34
- public static function delete($params=array(), $format='json')
35
- {
36
- $request = new Twocheckout_Api_Requester();
37
- $urlSuffix = 'products/delete_coupon';
38
- $result = $request->do_call($urlSuffix, $params);
39
- return Twocheckout_Util::return_resp($result, $format);
40
- }
41
-
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutError.php DELETED
@@ -1,14 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Error extends Exception
4
- {
5
- public function __construct($message, $code = 0, Exception $previous = null)
6
- {
7
- parent::__construct($message, $code, $previous);
8
- }
9
-
10
- public function __toString()
11
- {
12
- return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
13
- }
14
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutOption.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Option extends Twocheckout
4
- {
5
-
6
- public static function create($params=array(), $format='json')
7
- {
8
- $request = new Twocheckout_Api_Requester();
9
- $urlSuffix = 'products/create_option';
10
- $result = $request->do_call($urlSuffix, $params);
11
- return Twocheckout_Util::return_resp($result, $format);
12
- }
13
-
14
- public static function retrieve($params=array(), $format='json')
15
- {
16
- $request = new Twocheckout_Api_Requester();
17
- if(array_key_exists("option_id",$params)) {
18
- $urlSuffix = 'products/detail_option';
19
- } else {
20
- $urlSuffix = 'products/list_options';
21
- }
22
- $result = $request->do_call($urlSuffix, $params);
23
- return Twocheckout_Util::return_resp($result, $format);
24
- }
25
-
26
- public static function update($params=array(), $format='json')
27
- {
28
- $request = new Twocheckout_Api_Requester();
29
- $urlSuffix = 'products/update_option';
30
- $result = $request->do_call($urlSuffix, $params);
31
- return Twocheckout_Util::return_resp($result, $format);
32
- }
33
-
34
- public static function delete($params=array(), $format='json')
35
- {
36
- $request = new Twocheckout_Api_Requester();
37
- $urlSuffix = 'products/delete_option';
38
- $result = $request->do_call($urlSuffix, $params);
39
- return Twocheckout_Util::return_resp($result, $format);
40
- }
41
-
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutPayment.php DELETED
@@ -1,24 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Payment extends Twocheckout
4
- {
5
-
6
- public static function retrieve($format='json')
7
- {
8
- $request = new Twocheckout_Api_Requester();
9
- $urlSuffix = 'acct/list_payments';
10
- $result = $request->do_call($urlSuffix);
11
- $response = Twocheckout_Util::return_resp($result, $format);
12
- return $response;
13
- }
14
-
15
- public static function pending($format='json')
16
- {
17
- $request = new Twocheckout_Api_Requester();
18
- $urlSuffix = 'acct/detail_pending_payment';
19
- $result = $request->do_call($urlSuffix);
20
- $response = Twocheckout_Util::return_resp($result, $format);
21
- return $response;
22
- }
23
-
24
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutProduct.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Product extends Twocheckout
4
- {
5
-
6
- public static function create($params=array(), $format='json')
7
- {
8
- $request = new Twocheckout_Api_Requester();
9
- $urlSuffix = 'products/create_product';
10
- $result = $request->do_call($urlSuffix, $params);
11
- return Twocheckout_Util::return_resp($result, $format);
12
- }
13
-
14
- public static function retrieve($params=array(), $format='json')
15
- {
16
- $request = new Twocheckout_Api_Requester();
17
- if(array_key_exists("product_id",$params)) {
18
- $urlSuffix = 'products/detail_product';
19
- } else {
20
- $urlSuffix = 'products/list_products';
21
- }
22
- $result = $request->do_call($urlSuffix, $params);
23
- return Twocheckout_Util::return_resp($result, $format);
24
- }
25
-
26
- public static function update($params=array(), $format='json')
27
- {
28
- $request = new Twocheckout_Api_Requester();
29
- $urlSuffix = 'products/update_product';
30
- $result = $request->do_call($urlSuffix, $params);
31
- return Twocheckout_Util::return_resp($result, $format);
32
- }
33
-
34
- public static function delete($params=array(), $format='json')
35
- {
36
- $request = new Twocheckout_Api_Requester();
37
- $urlSuffix = 'products/delete_product';
38
- $result = $request->do_call($urlSuffix, $params);
39
- return Twocheckout_Util::return_resp($result, $format);
40
- }
41
-
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutSale.php DELETED
@@ -1,104 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Sale extends Twocheckout
4
- {
5
-
6
- public static function retrieve($params=array(), $format='json')
7
- {
8
- $request = new Twocheckout_Api_Requester();
9
- if(array_key_exists("sale_id",$params) || array_key_exists("invoice_id",$params)) {
10
- $urlSuffix = 'sales/detail_sale';
11
- } else {
12
- $urlSuffix = 'sales/list_sales';
13
- }
14
- $result = $request->do_call($urlSuffix, $params);
15
- return Twocheckout_Util::return_resp($result, $format);
16
- }
17
-
18
- public static function refund($params=array(), $format='json') {
19
- $request = new Twocheckout_Api_Requester();
20
- if(array_key_exists("lineitem_id",$params)) {
21
- $urlSuffix ='sales/refund_lineitem';
22
- $result = $request->do_call($urlSuffix, $params);
23
- } elseif(array_key_exists("invoice_id",$params) || array_key_exists("sale_id",$params)) {
24
- $urlSuffix ='sales/refund_invoice';
25
- $result = $request->do_call($urlSuffix, $params);
26
- } else {
27
- $result = Twocheckout_Message::message('Error', 'You must pass a sale_id, invoice_id or lineitem_id to use this method.');
28
- }
29
- return Twocheckout_Util::return_resp($result, $format);
30
- }
31
-
32
- public static function stop($params=array(), $format='json') {
33
- $request = new Twocheckout_Api_Requester();
34
- $urlSuffix ='sales/stop_lineitem_recurring';
35
- if(array_key_exists("lineitem_id",$params)) {
36
- $result = $request->do_call($urlSuffix, $params);
37
- } elseif(array_key_exists("sale_id",$params)) {
38
- $result = Twocheckout_Sale::retrieve($params, 'array');
39
- $lineitemData = Twocheckout_Util::get_recurring_lineitems($result);
40
- if (isset($lineitemData[0])) {
41
- $i = 0;
42
- $stoppedLineitems = array();
43
- foreach( $lineitemData as $value )
44
- {
45
- $params = array('lineitem_id' => $value);
46
- $result = $request->do_call($urlSuffix, $params);
47
- $result = json_decode($result, true);
48
- if ($result['response_code'] == "OK") {
49
- $stoppedLineitems[$i] = $value;
50
- }
51
- $i++;
52
- }
53
- $result = Twocheckout_Message::message('OK', $stoppedLineitems);
54
- } else {
55
- throw new Twocheckout_Error("No recurring lineitems to stop.");
56
- }
57
- } else {
58
- throw new Twocheckout_Error('You must pass a sale_id or lineitem_id to use this method.');
59
- }
60
- return Twocheckout_Util::return_resp($result, $format);
61
- }
62
-
63
- public static function active($params=array(), $format='json') {
64
- if(array_key_exists("sale_id",$params)) {
65
- $result = Twocheckout_Sale::retrieve($params);
66
- $array = Twocheckout_Util::return_resp($result, 'array');
67
- $lineitemData = Twocheckout_Util::get_recurring_lineitems($array);
68
- if (isset($lineitemData[0])) {
69
- $result = Twocheckout_Message::message('OK', $lineitemData);
70
- if ($format == 'array') {
71
- return Twocheckout_Util::return_resp($result, $format);
72
- } else {
73
- return Twocheckout_Util::return_resp($result, 'force_json');
74
- }
75
- } else {
76
- throw new Twocheckout_Error("No active recurring lineitems.");
77
- }
78
- } else {
79
- throw new Twocheckout_Error("You must pass a sale_id to use this method.");
80
- }
81
- }
82
-
83
- public static function comment($params=array(), $format='json') {
84
- $request = new Twocheckout_Api_Requester();
85
- $urlSuffix ='sales/create_comment';
86
- $result = $request->do_call($urlSuffix, $params);
87
- return Twocheckout_Util::return_resp($result, $format);
88
- }
89
-
90
- public static function ship($params=array(), $format='json') {
91
- $request = new Twocheckout_Api_Requester();
92
- $urlSuffix ='sales/mark_shipped';
93
- $result = $request->do_call($urlSuffix, $params);
94
- return Twocheckout_Util::return_resp($result, $format);
95
- }
96
-
97
- public static function reauth($params=array(), $format='json') {
98
- $request = new Twocheckout_Api_Requester();
99
- $urlSuffix ='sales/reauth';
100
- $result = $request->do_call($urlSuffix, $params);
101
- return Twocheckout_Util::return_resp($result, $format);
102
- }
103
-
104
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/Api/TwocheckoutUtil.php DELETED
@@ -1,72 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Util
4
- {
5
-
6
- static function return_resp($contents, $format) {
7
- switch ($format) {
8
- case "array":
9
- $arrayObject = self::objectToArray($contents);
10
- self::checkError($arrayObject);
11
- return $arrayObject;
12
- break;
13
- case "force_json":
14
- $arrayObject = self::objectToJson($contents);
15
- return $arrayObject;
16
- break;
17
- default:
18
- $arrayObject = self::objectToArray($contents);
19
- self::checkError($arrayObject);
20
- $jsonData = json_encode($contents);
21
- return json_decode($jsonData);
22
- }
23
- }
24
-
25
- public static function objectToArray($object)
26
- {
27
- $object = json_decode($object, true);
28
- $array=array();
29
- foreach($object as $member=>$data)
30
- {
31
- $array[$member]=$data;
32
- }
33
- return $array;
34
- }
35
-
36
- public static function objectToJson($object)
37
- {
38
- return json_encode($object);
39
- }
40
-
41
- public static function get_recurring_lineitems($saleDetail) {
42
- $i = 0;
43
- $invoiceData = array();
44
-
45
- while (isset($saleDetail['sale']['invoices'][$i])) {
46
- $invoiceData[$i] = $saleDetail['sale']['invoices'][$i];
47
- $i++;
48
- }
49
-
50
- $invoice = max($invoiceData);
51
- $i = 0;
52
- $lineitemData = array();
53
-
54
- while (isset($invoice['lineitems'][$i])) {
55
- if ($invoice['lineitems'][$i]['billing']['recurring_status'] == "active") {
56
- $lineitemData[$i] = $invoice['lineitems'][$i]['billing']['lineitem_id'];
57
- }
58
- $i++;
59
- };
60
-
61
- return $lineitemData;
62
-
63
- }
64
-
65
- public static function checkError($contents)
66
- {
67
- if (isset($contents['errors'])) {
68
- throw new Twocheckout_Error($contents['errors'][0]['message']);
69
- }
70
- }
71
-
72
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/TwocheckoutCharge.php DELETED
@@ -1,61 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Charge extends Twocheckout
4
- {
5
-
6
- public static function form($params, $type='Checkout')
7
- {
8
- echo '<form id="2checkout" action="https://www.2checkout.com/checkout/purchase" method="post">';
9
-
10
- foreach ($params as $key => $value)
11
- {
12
- echo '<input type="hidden" name="'.$key.'" value="'.$value.'"/>';
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
- }
22
-
23
- public static function direct($params, $type='Checkout')
24
- {
25
- echo '<form id="2checkout" action="https://www.2checkout.com/checkout/purchase" method="post">';
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";
37
- document.getElementById("2checkout").submit();
38
- }
39
- setTimeout("submitForm()", 2000);
40
- </script>';
41
- } else {
42
- echo '<input type="submit" value="'.$type.'" />';
43
- echo '</form>';
44
- }
45
-
46
- echo '<script src="https://www.2checkout.com/static/checkout/javascript/direct.min.js"></script>';
47
- }
48
-
49
- public static function link($params)
50
- {
51
- $url = 'https://www.2checkout.com/checkout/purchase?'.http_build_query($params, '', '&amp;');
52
- return $url;
53
- }
54
-
55
- public static function redirect($params)
56
- {
57
- $url = 'https://www.2checkout.com/checkout/purchase?'.http_build_query($params, '', '&amp;');
58
- header("Location: $url");
59
- }
60
-
61
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/TwocheckoutMessage.php DELETED
@@ -1,13 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Message
4
- {
5
- public static function message($code, $message)
6
- {
7
- $response = array();
8
- $response['response_code'] = $code;
9
- $response['response_message'] = $message;
10
- $response = json_encode($response);
11
- return $response;
12
- }
13
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/TwocheckoutNotification.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Notification extends Twocheckout
4
- {
5
-
6
- public static function check($insMessage, $secretWord, $format='json')
7
- {
8
- $hashSid = $insMessage['vendor_id'];
9
- $hashOrder = $insMessage['sale_id'];
10
- $hashInvoice = $insMessage['invoice_id'];
11
- $StringToHash = strtoupper(md5($hashOrder . $hashSid . $hashInvoice . $secretWord));
12
- if ($StringToHash != $insMessage['md5_hash']) {
13
- $result = Twocheckout_Message::message('Fail', 'Hash Mismatch');
14
- } else {
15
- $result = Twocheckout_Message::message('Success', 'Hash Matched');
16
- }
17
- return Twocheckout_Util::return_resp($result, $format);
18
- }
19
-
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/Twocheckout/Twocheckout/TwocheckoutReturn.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
-
3
- class Twocheckout_Return extends Twocheckout
4
- {
5
-
6
- public static function check($params=array(), $secretWord, $format='json')
7
- {
8
- $hashSecretWord = $secretWord;
9
- $hashSid = $params['sid'];
10
- $hashTotal = $params['total'];
11
- $hashOrder = $params['order_number'];
12
- $StringToHash = strtoupper(md5($hashSecretWord . $hashSid . $hashOrder . $hashTotal));
13
- if ($StringToHash != $params['key']) {
14
- $result = Twocheckout_Message::message('Fail', 'Hash Mismatch');
15
- } else {
16
- $result = Twocheckout_Message::message('Success', 'Hash Matched');
17
- }
18
- return Twocheckout_Util::return_resp($result, $format);
19
- }
20
-
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/localization.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- function pmpro_load_textdomain()
3
- {
4
- //get the locale
5
- $locale = apply_filters("plugin_locale", get_locale(), "pmpro");
6
- $mofile = "pmpro-" . $locale . ".mo";
7
-
8
- //paths to local (plugin) and global (WP) language files
9
- $mofile_local = dirname(__FILE__)."/../languages/" . $mofile;
10
- $mofile_global = WP_LANG_DIR . '/pmpro/' . $mofile;
11
-
12
- //load global first
13
- load_textdomain("pmpro", $mofile_global);
14
-
15
- //load local second
16
- load_textdomain("pmpro", $mofile_local);
17
- }
18
- add_action("init", "pmpro_load_textdomain", 1);
19
-
20
- function pmpro_translate_billing_period($period, $number = 1)
21
- {
22
- if($period == "Day")
23
- return _n("Day", "Days", $number, "pmpro");
24
- elseif($period == "Week")
25
- return _n("Week", "Weeks", $number, "pmpro");
26
- elseif($period == "Month")
27
- return _n("Month", "Months", $number, "pmpro");
28
- elseif($period == "Year")
29
- return _n("Year", "Years", $number, "pmpro");
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/login.php DELETED
@@ -1,158 +0,0 @@
1
- <?php
2
- //redirect control
3
- function pmpro_login_redirect($redirect_to, $request, $user)
4
- {
5
- global $wpdb;
6
-
7
- //is a user logging in?
8
- if(!empty($user->ID))
9
- {
10
- //logging in, let's figure out where to send them
11
- if(pmpro_isAdmin($user->ID))
12
- {
13
- //admins go to dashboard
14
- $redirect_to = get_bloginfo("url") . "/wp-admin/";
15
- }
16
- elseif(strpos($redirect_to, "checkout") !== false)
17
- {
18
- //if the redirect url includes the word checkout, leave it alone
19
- }
20
- elseif($wpdb->get_var("SELECT membership_id FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND user_id = '" . $user->ID . "' LIMIT 1"))
21
- {
22
- //if logged in and a member, send to wherever they were going
23
- }
24
- else
25
- {
26
- //not a member, send to subscription page
27
- $redirect_to = pmpro_url("levels");
28
- }
29
- }
30
- else
31
- {
32
- //not logging in (login form) so return what was given
33
- }
34
-
35
- //let's strip the https if force_ssl_login is set, but force_ssl_admin is not
36
- if(force_ssl_login() && !force_ssl_admin())
37
- $redirect_to = str_replace("https:", "http:", $redirect_to);
38
-
39
- return apply_filters("pmpro_login_redirect_url", $redirect_to, $request, $user);
40
- }
41
- add_filter('login_redirect','pmpro_login_redirect', 10, 3);
42
-
43
- //Where is the sign page? Levels page or default multisite page.
44
- function pmpro_wp_signup_location($location)
45
- {
46
- if(is_multisite() && pmpro_getOption("redirecttosubscription"))
47
- {
48
- return pmpro_url("levels");
49
- }
50
- else
51
- return $location;
52
- }
53
- add_filter('wp_signup_location', 'pmpro_wp_signup_location');
54
-
55
- //redirect from default login pages to PMPro
56
- function pmpro_login_head()
57
- {
58
- $login_redirect = apply_filters("pmpro_login_redirect", true);
59
-
60
- if((pmpro_is_login_page() || is_page("login") ||
61
- class_exists("Theme_My_Login") && defined('Theme_My_Login::version') && version_compare(Theme_My_Login::version, "6.3") >= 0 && (Theme_My_Login::is_tml_page("register") || Theme_My_Login::is_tml_page("login"))
62
- )
63
- && $login_redirect
64
- )
65
- {
66
- //redirect registration page to levels page
67
- if( isset($_REQUEST['action']) && $_REQUEST['action'] == "register" ||
68
- isset($_REQUEST['registration']) && $_REQUEST['registration'] == "disabled" ||
69
- !is_admin() && class_exists("Theme_My_Login") && defined('Theme_My_Login::version') && version_compare(Theme_My_Login::version, "6.3") >= 0 && Theme_My_Login::is_tml_page("register")
70
- )
71
- {
72
- //redirect to levels page unless filter is set.
73
- $link = apply_filters("pmpro_register_redirect", pmpro_url("levels"));
74
- if(!empty($link))
75
- {
76
- wp_redirect($link);
77
- exit;
78
- }
79
- else
80
- return; //don't redirect if pmpro_register_redirect filter returns false or a blank URL
81
- }
82
-
83
- //if theme my login is installed, redirect all logins to the login page
84
- if(pmpro_is_plugin_active("theme-my-login/theme-my-login.php"))
85
- {
86
- //check for the login page id and redirect there if we're not there already
87
- global $post;
88
-
89
- if(!empty($GLOBALS['theme_my_login']) && is_array($GLOBALS['theme_my_login']->options))
90
- {
91
- //an older version of TML stores it this way
92
- if($GLOBALS['theme_my_login']->options['page_id'] !== $post->ID)
93
- {
94
- //redirect to the real login page
95
- $link = get_permalink($GLOBALS['theme_my_login']->options['page_id']);
96
- if($_SERVER['QUERY_STRING'])
97
- $link .= "?" . $_SERVER['QUERY_STRING'];
98
- wp_redirect($link);
99
- exit;
100
- }
101
- }
102
- elseif(!empty($GLOBALS['theme_my_login']->options))
103
- {
104
- //another older version of TML stores it this way
105
- if($GLOBALS['theme_my_login']->options->options['page_id'] !== $post->ID)
106
- {
107
- //redirect to the real login page
108
- $link = get_permalink($GLOBALS['theme_my_login']->options->options['page_id']);
109
- if($_SERVER['QUERY_STRING'])
110
- $link .= "?" . $_SERVER['QUERY_STRING'];
111
- wp_redirect($link);
112
- exit;
113
- }
114
- }
115
- elseif(class_exists("Theme_My_Login") && defined('Theme_My_Login::version') && version_compare(Theme_My_Login::version, "6.3") >= 0)
116
- {
117
- //TML > 6.3
118
- $link = Theme_My_Login::get_page_link("login");
119
- if(!empty($link))
120
- {
121
- //redirect if !is_page(), i.e. we're on wp-login.php
122
- if(!Theme_My_Login::is_tml_page())
123
- {
124
- wp_redirect($link);
125
- exit;
126
- }
127
- }
128
- }
129
-
130
- //make sure users are only getting to the profile when logged in
131
- global $current_user;
132
- if(!empty($_REQUEST['action']) && $_REQUEST['action'] == "profile" && !$current_user->ID)
133
- {
134
- $link = get_permalink($GLOBALS['theme_my_login']->options->options['page_id']);
135
- wp_redirect($link);
136
- exit;
137
- }
138
- }
139
- }
140
- }
141
- add_action('wp', 'pmpro_login_head');
142
- add_action('login_init', 'pmpro_login_head');
143
-
144
- /*
145
- If a redirect_to value is passed into /login/ and you are logged in already, just redirect there
146
-
147
- @since 1.7.14
148
- */
149
- function pmpro_redirect_to_logged_in()
150
- {
151
- if((pmpro_is_login_page() || is_page("login")) && !empty($_REQUEST['redirect_to']) && is_user_logged_in())
152
- {
153
- wp_redirect($_REQUEST['redirect_to']);
154
- exit;
155
- }
156
- }
157
- add_action("template_redirect", "pmpro_redirect_to_logged_in", 5);
158
- add_action("login_init", "pmpro_redirect_to_logged_in", 5);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/metaboxes.php DELETED
@@ -1,108 +0,0 @@
1
- <?php
2
- /*
3
- Require Membership Meta Box
4
- */
5
- function pmpro_page_meta()
6
- {
7
- global $membership_levels, $post, $wpdb;
8
- $page_levels = $wpdb->get_col("SELECT membership_id FROM {$wpdb->pmpro_memberships_pages} WHERE page_id = '{$post->ID}'");
9
- ?>
10
- <ul id="membershipschecklist" class="list:category categorychecklist form-no-clear">
11
- <input type="hidden" name="pmpro_noncename" id="pmpro_noncename" value="<?php echo wp_create_nonce( plugin_basename(__FILE__) )?>" />
12
- <?php
13
- $in_member_cat = false;
14
- foreach($membership_levels as $level)
15
- {
16
- ?>
17
- <li id="membership-level-<?php echo $level->id?>">
18
- <label class="selectit">
19
- <input id="in-membership-level-<?php echo $level->id?>" type="checkbox" <?php if(in_array($level->id, $page_levels)) { ?>checked="checked"<?php } ?> name="page_levels[]" value="<?php echo $level->id?>" />
20
- <?php
21
- echo $level->name;
22
- //Check which categories are protected for this level
23
- $protectedcategories = $wpdb->get_col("SELECT category_id FROM $wpdb->pmpro_memberships_categories WHERE membership_id = $level->id");
24
- //See if this post is in any of the level's protected categories
25
- if(in_category($protectedcategories, $post->id))
26
- {
27
- $in_member_cat = true;
28
- echo ' *';
29
- }
30
- ?>
31
- </label>
32
- </li>
33
- <?php
34
- }
35
- ?>
36
- </ul>
37
- <?php if('post' == get_post_type($post) && $in_member_cat) { ?>
38
- <p class="pmpro_meta_notice">* <?php _e("This post is already protected for this level because it is within a category that requires membership.", "pmpro");?></p>
39
- <?php } ?>
40
- <?php
41
- }
42
-
43
- //saves meta options
44
- function pmpro_page_save($post_id)
45
- {
46
- global $wpdb;
47
-
48
- if(empty($post_id))
49
- return false;
50
-
51
- if (!empty($_POST['pmpro_noncename']) && !wp_verify_nonce( $_POST['pmpro_noncename'], plugin_basename(__FILE__) )) {
52
- return $post_id;
53
- }
54
-
55
- // verify if this is an auto save routine. If it is our form has not been submitted, so we dont want
56
- // to do anything
57
- if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
58
- return $post_id;
59
-
60
- // Check permissions
61
- if(!empty($_POST['post_type']) && 'page' == $_POST['post_type'] )
62
- {
63
- if ( !current_user_can( 'edit_page', $post_id ) )
64
- return $post_id;
65
- }
66
- else
67
- {
68
- if ( !current_user_can( 'edit_post', $post_id ) )
69
- return $post_id;
70
- }
71
-
72
- // OK, we're authenticated: we need to find and save the data
73
- if(isset($_POST['pmpro_noncename']))
74
- {
75
- if(!empty($_POST['page_levels']))
76
- $mydata = $_POST['page_levels'];
77
- else
78
- $mydata = NULL;
79
-
80
- //remove all memberships for this page
81
- $wpdb->query("DELETE FROM {$wpdb->pmpro_memberships_pages} WHERE page_id = '$post_id'");
82
-
83
- //add new memberships for this page
84
- if(is_array($mydata))
85
- {
86
- foreach($mydata as $level)
87
- $wpdb->query("INSERT INTO {$wpdb->pmpro_memberships_pages} (membership_id, page_id) VALUES('" . intval($level) . "', '" . intval($post_id) . "')");
88
- }
89
-
90
- return $mydata;
91
- }
92
- else
93
- return $post_id;
94
- }
95
-
96
- //wrapper to add meta boxes
97
- function pmpro_page_meta_wrapper()
98
- {
99
- add_meta_box('pmpro_page_meta', __('Require Membership', 'pmpro'), 'pmpro_page_meta', 'page', 'side');
100
- add_meta_box('pmpro_page_meta', __('Require Membership', 'pmpro'), 'pmpro_page_meta', 'post', 'side');
101
- }
102
- if (is_admin())
103
- {
104
- add_action('admin_menu', 'pmpro_page_meta_wrapper');
105
- add_action('save_post', 'pmpro_page_save');
106
-
107
- require_once(PMPRO_DIR . "/adminpages/dashboard.php");
108
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/notifications.php DELETED
@@ -1,61 +0,0 @@
1
- <?php
2
- /*
3
- This code calls the server at www.paidmembershipspro.com to see if there are any notifications to display to the user. Notifications are shown on the PMPro settings pages in the dashboard.
4
- */
5
- function pmpro_notifications()
6
- {
7
- if(current_user_can("manage_options"))
8
- {
9
- delete_transient("pmpro_notification_" . PMPRO_VERSION);
10
-
11
- $pmpro_notification = get_transient("pmpro_notification_" . PMPRO_VERSION);
12
- if(empty($pmpro_notification))
13
- {
14
- if(is_ssl())
15
- {
16
- $remote_notification = wp_remote_get("https://www.paidmembershipspro.com/notifications/?v=" . PMPRO_VERSION);
17
- }
18
- else
19
- {
20
- $remote_notification = wp_remote_get("http://www.paidmembershipspro.com/notifications/?v=" . PMPRO_VERSION);
21
- }
22
-
23
- $pmpro_notification = wp_remote_retrieve_body($remote_notification);
24
-
25
- set_transient("pmpro_notification_" . PMPRO_VERSION, $pmpro_notification, 86400);
26
- }
27
-
28
- if($pmpro_notification && $pmpro_notification != "NULL")
29
- {
30
- ?>
31
- <div id="pmpro_notifications">
32
- <?php echo $pmpro_notification; ?>
33
- </div>
34
- <?php
35
- }
36
- }
37
-
38
- //exit so we just show this content
39
- exit;
40
- }
41
- add_action('wp_ajax_pmpro_notifications', 'pmpro_notifications');
42
-
43
- /*
44
- Show Powered by Paid Memberships Pro comment (only visible in source) in the footer.
45
- */
46
- function pmpro_link()
47
- {
48
- ?>
49
- Memberships powered by Paid Memberships Pro v<?php echo PMPRO_VERSION?>.
50
- <?php
51
- }
52
- function pmpro_footer_link()
53
- {
54
- if(!pmpro_getOption("hide_footer_link"))
55
- {
56
- ?>
57
- <!-- <?php echo pmpro_link()?> -->
58
- <?php
59
- }
60
- }
61
- add_action("wp_footer", "pmpro_footer_link");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/profile.php DELETED
@@ -1,224 +0,0 @@
1
- <?php
2
- /*
3
- These functions add the "membership level" field to the edit user/profile page
4
- */
5
- //add the fields
6
- function pmpro_membership_level_profile_fields($user)
7
- {
8
- global $current_user, $pmpro_currency_symbol;
9
-
10
- $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
11
- if(!current_user_can($membership_level_capability))
12
- return false;
13
-
14
- global $wpdb;
15
- /*$user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name
16
- FROM {$wpdb->pmpro_membership_levels} AS l
17
- JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
18
- WHERE mu.user_id = " . $user->ID . "
19
- LIMIT 1");*/
20
- $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
21
-
22
- $levels = $wpdb->get_results( "SELECT * FROM {$wpdb->pmpro_membership_levels}", OBJECT );
23
-
24
- if(!$levels)
25
- return "";
26
- ?>
27
- <h3><?php _e("Membership Level", "pmpro"); ?></h3>
28
- <table class="form-table">
29
- <?php
30
- $show_membership_level = true;
31
- $show_membership_level = apply_filters("pmpro_profile_show_membership_level", $show_membership_level, $user);
32
- if($show_membership_level)
33
- {
34
- ?>
35
- <tr>
36
- <th><label for="membership_level"><?php _e("Current Level", "pmpro"); ?></label></th>
37
- <td>
38
- <select name="membership_level" onchange="pmpro_mchange_warning();">
39
- <option value="" <?php if(empty($user->membership_level->ID)) { ?>selected="selected"<?php } ?>>-- <?php _e("None", "pmpro");?> --</option>
40
- <?php
41
- foreach($levels as $level)
42
- {
43
- $current_level = ($user->membership_level->ID == $level->id);
44
- ?>
45
- <option value="<?php echo $level->id?>" <?php if($current_level) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
46
- <?php
47
- }
48
- ?>
49
- </select>
50
- <script>
51
- var pmpro_mchange_once = 0;
52
- function pmpro_mchange_warning()
53
- {
54
- if(pmpro_mchange_once == 0)
55
- {
56
- alert('Warning: The existing membership will be cancelled, and the new membership will be free.');
57
- pmpro_mchange_once = 1;
58
- }
59
- }
60
- </script>
61
- <?php
62
- $membership_values = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_memberships_users WHERE status = 'active' AND user_id = '" . $user->ID . "' LIMIT 1");
63
- if(!empty($membership_values->billing_amount) || !empty($membership_values->trial_amount))
64
- {
65
- ?>
66
- <?php if($membership_values->billing_amount > 0) { ?>
67
- at <?php echo $pmpro_currency_symbol;?><?php echo $membership_values->billing_amount?>
68
- <?php if($membership_values->cycle_number > 1) { ?>
69
- per <?php echo $membership_values->cycle_number?> <?php echo sornot($membership_values->cycle_period,$membership_values->cycle_number)?>
70
- <?php } elseif($membership_values->cycle_number == 1) { ?>
71
- per <?php echo $membership_values->cycle_period?>
72
- <?php } ?>
73
- <?php } ?>
74
-
75
- <?php if($membership_values->billing_limit) { ?> for <?php echo $membership_values->billing_limit.' '.sornot($membership_values->cycle_period,$membership_values->billing_limit)?><?php } ?>.
76
-
77
- <?php if($membership_values->trial_limit) { ?>
78
- The first <?php echo $membership_values->trial_limit?> <?php echo sornot("payments",$membership_values->trial_limit)?> will cost <?php echo $pmpro_currency_symbol;?><?php echo $membership_values->trial_amount?>.
79
- <?php } ?>
80
- <?php
81
- }
82
- else
83
- {
84
- _e("User is not paying.", "pmpro");
85
- }
86
- ?>
87
- </td>
88
- </tr>
89
- <?php
90
- }
91
-
92
- $show_expiration = true;
93
- $show_expiration = apply_filters("pmpro_profile_show_expiration", $show_expiration, $user);
94
- if($show_expiration)
95
- {
96
- //is there an end date?
97
- $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
98
- $end_date = !empty($user->membership_level->enddate);
99
-
100
- //some vars for the dates
101
- $current_day = date("j");
102
- if($end_date)
103
- $selected_expires_day = date("j", $user->membership_level->enddate);
104
- else
105
- $selected_expires_day = $current_day;
106
-
107
- $current_month = date("M");
108
- if($end_date)
109
- $selected_expires_month = date("m", $user->membership_level->enddate);
110
- else
111
- $selected_expires_month = date("m");
112
-
113
- $current_year = date("Y");
114
- if($end_date)
115
- $selected_expires_year = date("Y", $user->membership_level->enddate);
116
- else
117
- $selected_expires_year = (int)$current_year + 1;
118
- ?>
119
- <tr>
120
- <th><label for="expiration"><?php _e("Expires", "pmpro"); ?></label></th>
121
- <td>
122
- <select id="expires" name="expires">
123
- <option value="0" <?php if(!$end_date) { ?>selected="selected"<?php } ?>><?php _e("No", "pmpro");?></option>
124
- <option value="1" <?php if($end_date) { ?>selected="selected"<?php } ?>><?php _e("Yes", "pmpro");?></option>
125
- </select>
126
- <span id="expires_date" <?php if(!$end_date) { ?>style="display: none;"<?php } ?>>
127
- on
128
- <select name="expires_month">
129
- <?php
130
- for($i = 1; $i < 13; $i++)
131
- {
132
- ?>
133
- <option value="<?php echo $i?>" <?php if($i == $selected_expires_month) { ?>selected="selected"<?php } ?>><?php echo date("M", strtotime($i . "/1/" . $current_year, current_time("timestamp")))?></option>
134
- <?php
135
- }
136
- ?>
137
- </select>
138
- <input name="expires_day" type="text" size="2" value="<?php echo $selected_expires_day?>" />
139
- <input name="expires_year" type="text" size="4" value="<?php echo $selected_expires_year?>" />
140
- </span>
141
- <script>
142
- jQuery('#expires').change(function() {
143
- if(jQuery(this).val() == 1)
144
- jQuery('#expires_date').show();
145
- else
146
- jQuery('#expires_date').hide();
147
- });
148
- </script>
149
- </td>
150
- </tr>
151
- <?php
152
- }
153
- ?>
154
- </table>
155
- <?php
156
- }
157
-
158
- //save the fields on update
159
- function pmpro_membership_level_profile_fields_update()
160
- {
161
- //get the user id
162
- global $wpdb, $current_user, $user_ID;
163
- get_currentuserinfo();
164
-
165
- if(!empty($_REQUEST['user_id']))
166
- $user_ID = $_REQUEST['user_id'];
167
-
168
- $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
169
- if(!current_user_can($membership_level_capability))
170
- return false;
171
-
172
- //level change
173
- if(isset($_REQUEST['membership_level']))
174
- {
175
- if(pmpro_changeMembershipLevel($_REQUEST['membership_level'], $user_ID))
176
- {
177
- //it changed. send email
178
- $level_changed = true;
179
- }
180
- }
181
-
182
- //expiration change
183
- if(!empty($_REQUEST['expires']))
184
- {
185
- //update the expiration date
186
- $expiration_date = intval($_REQUEST['expires_year']) . "-" . str_pad(intval($_REQUEST['expires_month']), 2, "0", STR_PAD_LEFT) . "-" . str_pad(intval($_REQUEST['expires_day']), 2, "0", STR_PAD_LEFT);
187
- $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET enddate = '" . $expiration_date . "' WHERE status = 'active' AND membership_id = '" . intval($_REQUEST['membership_level']) . "' AND user_id = '" . $user_ID . "' LIMIT 1";
188
- if($wpdb->query($sqlQuery))
189
- $expiration_changed = true;
190
- }
191
- elseif(isset($_REQUEST['expires']))
192
- {
193
- //already blank? have to check for null or '0000-00-00 00:00:00' or '' here.
194
- $sqlQuery = "SELECT user_id FROM $wpdb->pmpro_memberships_users WHERE (enddate IS NULL OR enddate = '' OR enddate = '0000-00-00 00:00:00') AND status = 'active' AND user_id = '" . $user_ID . "' LIMIT 1";
195
- $blank = $wpdb->get_var($sqlQuery);
196
-
197
- if(empty($blank))
198
- {
199
- //null out the expiration
200
- $sqlQuery = "UPDATE $wpdb->pmpro_memberships_users SET enddate = NULL WHERE status = 'active' AND membership_id = '" . intval($_REQUEST['membership_level']) . "' AND user_id = '" . $user_ID . "' LIMIT 1";
201
- if($wpdb->query($sqlQuery))
202
- $expiration_changed = true;
203
- }
204
- }
205
-
206
- //send email
207
- if(!empty($level_changed) || !empty($expiration_changed))
208
- {
209
- //email to member
210
- $pmproemail = new PMProEmail();
211
- if(!empty($expiration_changed))
212
- $pmproemail->expiration_changed = true;
213
- $pmproemail->sendAdminChangeEmail(get_userdata($user_ID));
214
-
215
- //email to admin
216
- $pmproemail = new PMProEmail();
217
- if(!empty($expiration_changed))
218
- $pmproemail->expiration_changed = true;
219
- $pmproemail->sendAdminChangeAdminEmail(get_userdata($user_ID));
220
- }
221
- }
222
- add_action( 'show_user_profile', 'pmpro_membership_level_profile_fields' );
223
- add_action( 'edit_user_profile', 'pmpro_membership_level_profile_fields' );
224
- add_action( 'profile_update', 'pmpro_membership_level_profile_fields_update' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/recaptcha.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
- function pmpro_init_recaptcha()
3
- {
4
- //don't load in admin
5
- if(is_admin())
6
- return;
7
-
8
- //use recaptcha?
9
- global $recaptcha;
10
- $recaptcha = pmpro_getOption("recaptcha");
11
- if($recaptcha)
12
- {
13
- global $recaptcha_publickey, $recaptcha_privatekey;
14
- if(!function_exists("recaptcha_get_html"))
15
- {
16
- require_once(PMPRO_DIR . "/includes/lib/recaptchalib.php");
17
- }
18
- $recaptcha_publickey = pmpro_getOption("recaptcha_publickey");
19
- $recaptcha_privatekey = pmpro_getOption("recaptcha_privatekey");
20
- }
21
- }
22
- add_action("init", "pmpro_init_recaptcha", 20);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/reports.php DELETED
@@ -1,27 +0,0 @@
1
- <?php
2
- /*
3
- Load All Reports
4
- */
5
- $pmpro_reports_dir = dirname(__FILE__) . "/../adminpages/reports/";
6
- $cwd = getcwd();
7
- chdir($pmpro_reports_dir);
8
- foreach (glob("*.php") as $filename)
9
- {
10
- require_once($filename);
11
- }
12
- chdir($cwd);
13
-
14
- /*
15
- Load Reports From Theme
16
- */
17
- $pmpro_reports_theme_dir = get_stylesheet_directory() . "/paid-memberships-pro/reports/";
18
- if(is_dir($pmpro_reports_theme_dir))
19
- {
20
- $cwd = getcwd();
21
- chdir($pmpro_reports_theme_dir);
22
- foreach (glob("*.php") as $filename)
23
- {
24
- require_once($filename);
25
- }
26
- chdir($cwd);
27
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/services.php DELETED
@@ -1,70 +0,0 @@
1
- <?php
2
- /*
3
- Loading a service?
4
- */
5
- /*
6
- Note: The applydiscountcode goes through the site_url() instead of admin-ajax to avoid HTTP/HTTPS issues.
7
- */
8
- if(isset($_REQUEST['action']) && $_REQUEST['action'] == "applydiscountcode")
9
- {
10
- function pmpro_applydiscountcode_init()
11
- {
12
- require_once(dirname(__FILE__) . "/../services/applydiscountcode.php");
13
- exit;
14
- }
15
- add_action("init", "pmpro_applydiscountcode_init", 11);
16
- }
17
- function pmpro_wp_ajax_authnet_silent_post()
18
- {
19
- require_once(dirname(__FILE__) . "/../services/authnet-silent-post.php");
20
- exit;
21
- }
22
- add_action('wp_ajax_nopriv_authnet_silent_post', 'pmpro_wp_ajax_authnet_silent_post');
23
- add_action('wp_ajax_authnet_silent_post', 'pmpro_wp_ajax_authnet_silent_post');
24
- function pmpro_wp_ajax_getfile()
25
- {
26
- require_once(dirname(__FILE__) . "/../services/getfile.php");
27
- exit;
28
- }
29
- add_action('wp_ajax_nopriv_getfile', 'pmpro_wp_ajax_getfile');
30
- add_action('wp_ajax_getfile', 'pmpro_wp_ajax_getfile');
31
- function pmpro_wp_ajax_ipnhandler()
32
- {
33
- require_once(dirname(__FILE__) . "/../services/ipnhandler.php");
34
- exit;
35
- }
36
- add_action('wp_ajax_nopriv_ipnhandler', 'pmpro_wp_ajax_ipnhandler');
37
- add_action('wp_ajax_ipnhandler', 'pmpro_wp_ajax_ipnhandler');
38
- function pmpro_wp_ajax_stripe_webhook()
39
- {
40
- require_once(dirname(__FILE__) . "/../services/stripe-webhook.php");
41
- exit;
42
- }
43
- add_action('wp_ajax_nopriv_stripe_webhook', 'pmpro_wp_ajax_stripe_webhook');
44
- add_action('wp_ajax_stripe_webhook', 'pmpro_wp_ajax_stripe_webhook');
45
- function pmpro_wp_ajax_braintree_webhook()
46
- {
47
- require_once(dirname(__FILE__) . "/../services/braintree-webhook.php");
48
- exit;
49
- }
50
- add_action('wp_ajax_nopriv_braintree_webhook', 'pmpro_wp_ajax_braintree_webhook');
51
- add_action('wp_ajax_braintree_webhook', 'pmpro_wp_ajax_braintree_webhook');
52
- function pmpro_wp_ajax_twocheckout_ins()
53
- {
54
- require_once(dirname(__FILE__) . "/../services/twocheckout-ins.php");
55
- exit;
56
- }
57
- add_action('wp_ajax_nopriv_twocheckout-ins', 'pmpro_wp_ajax_twocheckout_ins');
58
- add_action('wp_ajax_twocheckout-ins', 'pmpro_wp_ajax_twocheckout_ins');
59
- function pmpro_wp_ajax_memberlist_csv()
60
- {
61
- require_once(dirname(__FILE__) . "/../adminpages/memberslist-csv.php");
62
- exit;
63
- }
64
- add_action('wp_ajax_memberslist_csv', 'pmpro_wp_ajax_memberlist_csv');
65
- function pmpro_wp_ajax_orders_csv()
66
- {
67
- require_once(dirname(__FILE__) . "/../adminpages/orders-csv.php");
68
- exit;
69
- }
70
- add_action('wp_ajax_orders_csv', 'pmpro_wp_ajax_orders_csv');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/setup.sql CHANGED
@@ -26,7 +26,7 @@ CREATE TABLE `wp_pmpro_discount_codes` (
26
  UNIQUE KEY `code` (`code`),
27
  KEY `starts` (`starts`),
28
  KEY `expires` (`expires`)
29
- );
30
 
31
  -- --------------------------------------------------------
32
 
@@ -48,7 +48,7 @@ CREATE TABLE `wp_pmpro_discount_codes_levels` (
48
  `expiration_period` enum('Day','Week','Month','Year') NOT NULL,
49
  PRIMARY KEY (`code_id`,`level_id`),
50
  KEY `initial_payment` (`initial_payment`)
51
- );
52
 
53
  -- --------------------------------------------------------
54
 
@@ -65,7 +65,7 @@ CREATE TABLE `wp_pmpro_discount_codes_uses` (
65
  PRIMARY KEY (`id`),
66
  KEY `user_id` (`user_id`),
67
  KEY `timestamp` (`timestamp`)
68
- );
69
 
70
  -- --------------------------------------------------------
71
 
@@ -92,7 +92,7 @@ CREATE TABLE `wp_pmpro_membership_levels` (
92
  KEY `allow_signups` (`allow_signups`),
93
  KEY `initial_payment` (`initial_payment`),
94
  KEY `name` (`name`)
95
- );
96
 
97
  -- --------------------------------------------------------
98
 
@@ -125,7 +125,7 @@ CREATE TABLE `wp_pmpro_membership_orders` (
125
  `accountnumber` varchar(32) NOT NULL DEFAULT '',
126
  `expirationmonth` char(2) NOT NULL DEFAULT '',
127
  `expirationyear` varchar(4) NOT NULL DEFAULT '',
128
- `status` varchar(20) NOT NULL DEFAULT '',
129
  `gateway` varchar(64) NOT NULL,
130
  `gateway_environment` varchar(64) NOT NULL,
131
  `payment_transaction_id` varchar(64) NOT NULL,
@@ -133,21 +133,15 @@ CREATE TABLE `wp_pmpro_membership_orders` (
133
  `timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
134
  `affiliate_id` varchar(32) NOT NULL,
135
  `affiliate_subid` varchar(32) NOT NULL,
136
- `notes` TEXT NOT NULL,
137
  PRIMARY KEY (`id`),
138
  UNIQUE KEY `code` (`code`),
139
- KEY `session_id` (`session_id`),
140
- KEY `user_id` (`user_id`),
141
- KEY `membership_id` (`membership_id`),
142
- KEY `status` (`status`),
143
- KEY `timestamp` (`timestamp`),
144
- KEY `gateway` (`gateway`),
145
- KEY `gateway_environment` (`gateway_environment`),
146
- KEY `payment_transaction_id` (`payment_transaction_id`),
147
- KEY `subscription_transaction_id` (`subscription_transaction_id`),
148
- KEY `affiliate_id` (`affiliate_id`),
149
- KEY `affiliate_subid` (`affiliate_subid`)
150
- );
151
 
152
  -- --------------------------------------------------------
153
 
@@ -161,7 +155,7 @@ CREATE TABLE `wp_pmpro_memberships_categories` (
161
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
162
  UNIQUE KEY `membership_category` (`membership_id`,`category_id`),
163
  UNIQUE KEY `category_membership` (`category_id`,`membership_id`)
164
- );
165
 
166
  -- --------------------------------------------------------
167
 
@@ -175,7 +169,7 @@ CREATE TABLE `wp_pmpro_memberships_pages` (
175
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
176
  UNIQUE KEY `category_membership` (`page_id`,`membership_id`),
177
  UNIQUE KEY `membership_page` (`membership_id`,`page_id`)
178
- );
179
 
180
  -- --------------------------------------------------------
181
 
@@ -184,26 +178,22 @@ CREATE TABLE `wp_pmpro_memberships_pages` (
184
  --
185
 
186
  CREATE TABLE `wp_pmpro_memberships_users` (
187
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
188
- `user_id` int(11) unsigned NOT NULL,
189
- `membership_id` int(11) unsigned NOT NULL,
190
- `code_id` int(11) unsigned NOT NULL,
191
- `initial_payment` decimal(10,2) NOT NULL,
192
- `billing_amount` decimal(10,2) NOT NULL,
193
- `cycle_number` int(11) NOT NULL,
194
- `cycle_period` enum('Day','Week','Month','Year') NOT NULL DEFAULT 'Month',
195
- `billing_limit` int(11) NOT NULL,
196
- `trial_amount` decimal(10,2) NOT NULL,
197
- `trial_limit` int(11) NOT NULL,
198
- `status` varchar(20) NOT NULL DEFAULT 'active',
199
- `startdate` datetime NOT NULL,
200
- `enddate` datetime DEFAULT NULL,
201
- `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
202
- PRIMARY KEY (`id`),
203
- KEY `membership_id` (`membership_id`),
204
- KEY `modified` (`modified`),
205
- KEY `code_id` (`code_id`),
206
- KEY `enddate` (`enddate`),
207
- KEY `user_id` (`user_id`),
208
- KEY `user_id` (`status`)
209
- );
26
  UNIQUE KEY `code` (`code`),
27
  KEY `starts` (`starts`),
28
  KEY `expires` (`expires`)
29
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
30
 
31
  -- --------------------------------------------------------
32
 
48
  `expiration_period` enum('Day','Week','Month','Year') NOT NULL,
49
  PRIMARY KEY (`code_id`,`level_id`),
50
  KEY `initial_payment` (`initial_payment`)
51
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
52
 
53
  -- --------------------------------------------------------
54
 
65
  PRIMARY KEY (`id`),
66
  KEY `user_id` (`user_id`),
67
  KEY `timestamp` (`timestamp`)
68
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
69
 
70
  -- --------------------------------------------------------
71
 
92
  KEY `allow_signups` (`allow_signups`),
93
  KEY `initial_payment` (`initial_payment`),
94
  KEY `name` (`name`)
95
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
96
 
97
  -- --------------------------------------------------------
98
 
125
  `accountnumber` varchar(32) NOT NULL DEFAULT '',
126
  `expirationmonth` char(2) NOT NULL DEFAULT '',
127
  `expirationyear` varchar(4) NOT NULL DEFAULT '',
128
+ `status` varchar(32) NOT NULL DEFAULT '',
129
  `gateway` varchar(64) NOT NULL,
130
  `gateway_environment` varchar(64) NOT NULL,
131
  `payment_transaction_id` varchar(64) NOT NULL,
133
  `timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
134
  `affiliate_id` varchar(32) NOT NULL,
135
  `affiliate_subid` varchar(32) NOT NULL,
 
136
  PRIMARY KEY (`id`),
137
  UNIQUE KEY `code` (`code`),
138
+ KEY `session_id` (`session_id`),
139
+ KEY `user_id` (`user_id`),
140
+ KEY `membership_id` (`membership_id`),
141
+ KEY `timestamp` (`timestamp`),
142
+ KEY `gateway` (`gateway`),
143
+ KEY `gateway_environment` (`gateway_environment`)
144
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
 
 
 
145
 
146
  -- --------------------------------------------------------
147
 
155
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
156
  UNIQUE KEY `membership_category` (`membership_id`,`category_id`),
157
  UNIQUE KEY `category_membership` (`category_id`,`membership_id`)
158
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
159
 
160
  -- --------------------------------------------------------
161
 
169
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
170
  UNIQUE KEY `category_membership` (`page_id`,`membership_id`),
171
  UNIQUE KEY `membership_page` (`membership_id`,`page_id`)
172
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
173
 
174
  -- --------------------------------------------------------
175
 
178
  --
179
 
180
  CREATE TABLE `wp_pmpro_memberships_users` (
181
+ `user_id` int(11) unsigned NOT NULL,
182
+ `membership_id` int(11) unsigned NOT NULL,
183
+ `code_id` int(11) unsigned NOT NULL,
184
+ `initial_payment` decimal(10,2) NOT NULL,
185
+ `billing_amount` decimal(10,2) NOT NULL,
186
+ `cycle_number` int(11) NOT NULL,
187
+ `cycle_period` enum('Day','Week','Month','Year') NOT NULL DEFAULT 'Month',
188
+ `billing_limit` int(11) NOT NULL,
189
+ `trial_amount` decimal(10,2) NOT NULL,
190
+ `trial_limit` int(11) NOT NULL,
191
+ `startdate` datetime NOT NULL,
192
+ `enddate` datetime DEFAULT NULL,
193
+ `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
194
+ PRIMARY KEY (`user_id`),
195
+ KEY `membership_id` (`membership_id`),
196
+ KEY `modified` (`modified`),
197
+ KEY `code_id` (`code_id`),
198
+ KEY `enddate` (`enddate`)
199
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
 
 
includes/upgradecheck.php CHANGED
@@ -34,86 +34,16 @@ function pmpro_checkForUpgrades()
34
 
35
  if($pmpro_db_version < 1.48)
36
  $pmpro_db_version = pmpro_upgrade_1_4_8();
37
-
38
- if($pmpro_db_version < 1.5)
39
  $pmpro_db_version = pmpro_upgrade_1_5();
40
 
41
  if($pmpro_db_version < 1.59)
42
  $pmpro_db_version = pmpro_upgrade_1_5_9();
43
 
44
  if($pmpro_db_version < 1.6)
45
- $pmpro_db_version = pmpro_upgrade_1_6();
46
-
47
- //fix for fresh 1.7 installs
48
- if($pmpro_db_version == 1.7)
49
- {
50
- //check if we have an id column in the memberships_users table
51
- $wpdb->pmpro_memberships_users = $table_prefix . 'pmpro_memberships_users';
52
- $col = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_memberships_users LIMIT 1");
53
- if($wpdb->last_error == "Unknown column 'id' in 'field list'")
54
- {
55
- //redo 1.5 fix
56
- pmpro_upgrade_1_5();
57
- }
58
-
59
- pmpro_db_delta();
60
-
61
- pmpro_setOption("db_version", "1.703");
62
- $pmpro_db_version = 1.703;
63
- }
64
-
65
- //updates from this point on should be like this if DB only
66
- if($pmpro_db_version < 1.71)
67
- {
68
- pmpro_db_delta();
69
- pmpro_setOption("db_version", "1.71");
70
- $pmpro_db_version = 1.71;
71
- }
72
-
73
- if($pmpro_db_version < 1.72)
74
- {
75
- //schedule the credit card expiring cron
76
- wp_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings');
77
-
78
- pmpro_setOption("db_version", "1.72");
79
- $pmpro_db_version = 1.72;
80
- }
81
-
82
- /*
83
- 1.7.3
84
- - default Stripe Billing Fields to true
85
- - unless Stripe Lite is activated, then deactivate Stripe Lite and set Stripe Billing Fields to false
86
- */
87
-
88
- if($pmpro_db_version < 1.79)
89
- {
90
- //need to register caps for menu
91
- pmpro_activation();
92
-
93
- pmpro_setOption("db_version", "1.79");
94
- $pmpro_db_version = 1.79;
95
- }
96
-
97
- //set default filter_queries setting
98
- if($pmpro_db_version < 1.791)
99
- {
100
- if(!pmpro_getOption("showexcerpts"))
101
- pmpro_setOption("filterqueries", 1);
102
- else
103
- pmpro_SetOption("filterqueries", 0);
104
-
105
- pmpro_setOption("db_version", "1.791");
106
- $pmpro_db_version = 1.791;
107
- }
108
- }
109
-
110
- function pmpro_upgrade_1_7()
111
- {
112
- pmpro_db_delta(); //just a db delta
113
-
114
- pmpro_setOption("db_version", "1.7");
115
- return 1.7;
116
- }
117
 
118
  function pmpro_upgrade_1_6()
119
  {
@@ -142,31 +72,31 @@ function pmpro_upgrade_1_5_9()
142
  pmpro_setOption("db_version", "1.59");
143
  return 1.59;
144
  }
145
-
146
- function pmpro_upgrade_1_5()
147
- {
148
- /*
149
- Add the id and status fields to pmpro_memberships_users, change primary key to id instead of user_id
150
- */
151
-
152
- global $wpdb;
153
- $wpdb->hide_errors();
154
- $wpdb->pmpro_memberships_users = $wpdb->prefix . 'pmpro_memberships_users';
155
-
156
- //remove primary key
157
- $sqlQuery = "ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` DROP PRIMARY KEY";
158
- $wpdb->query($sqlQuery);
159
-
160
- //id
161
- $sqlQuery = "ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` ADD `id` BIGINT( 20 ) UNSIGNED AUTO_INCREMENT FIRST, ADD PRIMARY KEY(id)";
162
- $wpdb->query($sqlQuery);
163
-
164
- //status
165
- $sqlQuery = "ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` ADD `status` varchar( 20 ) NOT NULL DEFAULT 'active' AFTER `trial_limit`";
166
- $wpdb->query($sqlQuery);
167
-
168
- pmpro_setOption("db_version", "1.5");
169
- return 1.5;
170
  }
171
 
172
  function pmpro_upgrade_1_4_8()
@@ -268,7 +198,7 @@ ADD `expiration_period` ENUM( 'Day', 'Week', 'Month', 'Year' ) NOT NULL
268
  $wpdb->query($sqlQuery);
269
 
270
  $sqlQuery = "
271
- ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` ADD INDEX ( `enddate` )
272
  ";
273
  $wpdb->query($sqlQuery);
274
 
@@ -419,14 +349,13 @@ function pmpro_upgrade_1()
419
  /*
420
  default options
421
  */
422
- $nonmembertext = sprintf( __( 'This content is for !!levels!! members only.<br /><a href="%s">Register</a>', 'pmpro' ), wp_login_url() . "?action=register" );
423
  pmpro_setOption("nonmembertext", $nonmembertext);
424
 
425
- $notloggedintext = sprintf( __( 'This content is for !!levels!! members only.<br /><a href="%s">Log In</a> <a href="%s">Register</a>', 'pmpro' ), wp_login_url(), wp_login_url() . "?action=register" );
426
- '?action=register">Register</a>';
427
  pmpro_setOption("notloggedintext", $notloggedintext);
428
 
429
- $rsstext = __( "This content is for !!levels!! members only. Visit the site and log in/register to read.", 'pmpro' );
430
  pmpro_setOption("rsstext", $rsstext);
431
 
432
  $gateway_environment = "sandbox";
@@ -439,7 +368,7 @@ function pmpro_upgrade_1()
439
  pmpro_setOption("accepted_credit_cards", $pmpro_accepted_credit_cards);
440
 
441
  $parsed = parse_url(home_url());
442
- $hostname = $parsed['host'];
443
  $hostparts = split("\.", $hostname);
444
  $email_domain = $hostparts[count($hostparts) - 2] . "." . $hostparts[count($hostparts) - 1];
445
  $from_email = "wordpress@" . $email_domain;
@@ -448,26 +377,11 @@ function pmpro_upgrade_1()
448
  $from_name = "WordPress";
449
  pmpro_setOption("from_name", $from_name);
450
 
451
- //setting new email settings defaults
452
- pmpro_setOption("email_admin_checkout", "1");
453
- pmpro_setOption("email_admin_changes", "1");
454
- pmpro_setOption("email_admin_cancels", "1");
455
- pmpro_setOption("email_admin_billing", "1");
456
-
457
  pmpro_setOption("tospage", "");
458
 
459
- //db update
460
- pmpro_db_delta();
461
-
462
- //update version and return
463
- pmpro_setOption("db_version", "1.702"); //no need to run other updates
464
- return 1.702;
465
- }
466
-
467
- function pmpro_db_delta()
468
- {
469
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
470
-
471
  global $wpdb;
472
  $wpdb->hide_errors();
473
  $wpdb->pmpro_membership_levels = $wpdb->prefix . 'pmpro_membership_levels';
@@ -482,133 +396,117 @@ function pmpro_db_delta()
482
  //wp_pmpro_membership_levels
483
  $sqlQuery = "
484
  CREATE TABLE `" . $wpdb->pmpro_membership_levels . "` (
485
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
486
  `name` varchar(255) NOT NULL,
487
  `description` longtext NOT NULL,
488
- `confirmation` longtext NOT NULL,
489
- `initial_payment` decimal(10,2) NOT NULL DEFAULT '0.00',
490
- `billing_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
491
- `cycle_number` int(11) NOT NULL DEFAULT '0',
492
- `cycle_period` enum('Day','Week','Month','Year') DEFAULT 'Month',
493
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
494
- `trial_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
495
- `trial_limit` int(11) NOT NULL DEFAULT '0',
496
- `allow_signups` tinyint(4) NOT NULL DEFAULT '1',
497
- `expiration_number` int(10) unsigned NOT NULL,
498
- `expiration_period` enum('Day','Week','Month','Year') NOT NULL,
499
- PRIMARY KEY (`id`),
500
  KEY `allow_signups` (`allow_signups`),
501
  KEY `initial_payment` (`initial_payment`),
502
  KEY `name` (`name`)
503
- );
504
  ";
505
- dbDelta($sqlQuery);
506
 
507
  //wp_pmpro_membership_orders
508
  $sqlQuery = "
509
  CREATE TABLE `" . $wpdb->pmpro_membership_orders . "` (
510
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
511
  `code` varchar(10) NOT NULL,
512
- `session_id` varchar(64) NOT NULL DEFAULT '',
513
- `user_id` int(11) unsigned NOT NULL DEFAULT '0',
514
- `membership_id` int(11) unsigned NOT NULL DEFAULT '0',
515
- `paypal_token` varchar(64) NOT NULL DEFAULT '',
516
- `billing_name` varchar(128) NOT NULL DEFAULT '',
517
- `billing_street` varchar(128) NOT NULL DEFAULT '',
518
- `billing_city` varchar(128) NOT NULL DEFAULT '',
519
- `billing_state` varchar(32) NOT NULL DEFAULT '',
520
- `billing_zip` varchar(16) NOT NULL DEFAULT '',
521
- `billing_country` varchar(128) NOT NULL,
522
  `billing_phone` varchar(32) NOT NULL,
523
- `subtotal` varchar(16) NOT NULL DEFAULT '',
524
- `tax` varchar(16) NOT NULL DEFAULT '',
525
- `couponamount` varchar(16) NOT NULL DEFAULT '',
526
- `certificate_id` int(11) NOT NULL DEFAULT '0',
527
- `certificateamount` varchar(16) NOT NULL DEFAULT '',
528
- `total` varchar(16) NOT NULL DEFAULT '',
529
- `payment_type` varchar(64) NOT NULL DEFAULT '',
530
- `cardtype` varchar(32) NOT NULL DEFAULT '',
531
- `accountnumber` varchar(32) NOT NULL DEFAULT '',
532
- `expirationmonth` char(2) NOT NULL DEFAULT '',
533
- `expirationyear` varchar(4) NOT NULL DEFAULT '',
534
- `status` varchar(32) NOT NULL DEFAULT '',
535
  `gateway` varchar(64) NOT NULL,
536
  `gateway_environment` varchar(64) NOT NULL,
537
  `payment_transaction_id` varchar(64) NOT NULL,
538
  `subscription_transaction_id` varchar(32) NOT NULL,
539
- `timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
540
  `affiliate_id` varchar(32) NOT NULL,
541
  `affiliate_subid` varchar(32) NOT NULL,
542
- `notes` TEXT NOT NULL,
543
- PRIMARY KEY (`id`),
544
  UNIQUE KEY `code` (`code`),
545
  KEY `session_id` (`session_id`),
546
  KEY `user_id` (`user_id`),
547
  KEY `membership_id` (`membership_id`),
548
- KEY `status` (`status`),
549
  KEY `timestamp` (`timestamp`),
550
  KEY `gateway` (`gateway`),
551
- KEY `gateway_environment` (`gateway_environment`),
552
- KEY `payment_transaction_id` (`payment_transaction_id`),
553
- KEY `subscription_transaction_id` (`subscription_transaction_id`),
554
- KEY `affiliate_id` (`affiliate_id`),
555
- KEY `affiliate_subid` (`affiliate_subid`)
556
- );
557
  ";
558
- dbDelta($sqlQuery);
559
 
560
  //wp_pmpro_memberships_categories
561
  $sqlQuery = "
562
  CREATE TABLE `" . $wpdb->pmpro_memberships_categories . "` (
563
- `membership_id` int(11) unsigned NOT NULL,
564
- `category_id` int(11) unsigned NOT NULL,
565
- `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
566
  UNIQUE KEY `membership_category` (`membership_id`,`category_id`),
567
  UNIQUE KEY `category_membership` (`category_id`,`membership_id`)
568
- );
569
  ";
570
- dbDelta($sqlQuery);
571
 
572
  //wp_pmpro_memberships_pages
573
  $sqlQuery = "
574
  CREATE TABLE `" . $wpdb->pmpro_memberships_pages . "` (
575
- `membership_id` int(11) unsigned NOT NULL,
576
- `page_id` int(11) unsigned NOT NULL,
577
- `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
578
  UNIQUE KEY `category_membership` (`page_id`,`membership_id`),
579
  UNIQUE KEY `membership_page` (`membership_id`,`page_id`)
580
- );
581
  ";
582
- dbDelta($sqlQuery);
583
 
584
  //wp_pmpro_memberships_users
585
  $sqlQuery = "
586
  CREATE TABLE `" . $wpdb->pmpro_memberships_users . "` (
587
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
588
- `user_id` int(11) unsigned NOT NULL,
589
- `membership_id` int(11) unsigned NOT NULL,
590
- `code_id` int(11) unsigned NOT NULL,
591
- `initial_payment` decimal(10,2) NOT NULL,
592
- `billing_amount` decimal(10,2) NOT NULL,
593
- `cycle_number` int(11) NOT NULL,
594
- `cycle_period` enum('Day','Week','Month','Year') NOT NULL DEFAULT 'Month',
595
- `billing_limit` int(11) NOT NULL,
596
- `trial_amount` decimal(10,2) NOT NULL,
597
- `trial_limit` int(11) NOT NULL,
598
- `status` varchar(20) NOT NULL DEFAULT 'active',
599
- `startdate` datetime NOT NULL,
600
- `enddate` datetime DEFAULT NULL,
601
- `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
602
- PRIMARY KEY (`id`),
603
- KEY `membership_id` (`membership_id`),
604
- KEY `modified` (`modified`),
605
- KEY `code_id` (`code_id`),
606
- KEY `enddate` (`enddate`),
607
- KEY `user_id` (`user_id`),
608
- KEY `status` (`status`)
609
- );
610
  ";
611
- dbDelta($sqlQuery);
612
 
613
  //wp_pmpro_discount_codes
614
  $sqlQuery = "
@@ -622,15 +520,15 @@ function pmpro_db_delta()
622
  UNIQUE KEY `code` (`code`),
623
  KEY `starts` (`starts`),
624
  KEY `expires` (`expires`)
625
- );
626
  ";
627
- dbDelta($sqlQuery);
628
 
629
  //wp_pmpro_discount_codes_levels
630
  $sqlQuery = "
631
  CREATE TABLE `" . $wpdb->pmpro_discount_codes_levels . "` (
632
  `code_id` int(11) unsigned NOT NULL,
633
- `level_id` int(11) unsigned NOT NULL,
634
  `initial_payment` decimal(10,2) NOT NULL DEFAULT '0.00',
635
  `billing_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
636
  `cycle_number` int(11) NOT NULL DEFAULT '0',
@@ -638,13 +536,11 @@ function pmpro_db_delta()
638
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
639
  `trial_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
640
  `trial_limit` int(11) NOT NULL DEFAULT '0',
641
- `expiration_number` int(10) unsigned NOT NULL,
642
- `expiration_period` enum('Day','Week','Month','Year') NOT NULL,
643
  PRIMARY KEY (`code_id`,`level_id`),
644
  KEY `initial_payment` (`initial_payment`)
645
- );
646
  ";
647
- dbDelta($sqlQuery);
648
 
649
  //wp_pmpro_discount_codes_uses
650
  $sqlQuery = "
@@ -657,7 +553,10 @@ function pmpro_db_delta()
657
  PRIMARY KEY (`id`),
658
  KEY `user_id` (`user_id`),
659
  KEY `timestamp` (`timestamp`)
660
- );
661
  ";
662
- dbDelta($sqlQuery);
 
 
 
663
  }
34
 
35
  if($pmpro_db_version < 1.48)
36
  $pmpro_db_version = pmpro_upgrade_1_4_8();
37
+
38
+ if($pmpro_db_version < 1.5)
39
  $pmpro_db_version = pmpro_upgrade_1_5();
40
 
41
  if($pmpro_db_version < 1.59)
42
  $pmpro_db_version = pmpro_upgrade_1_5_9();
43
 
44
  if($pmpro_db_version < 1.6)
45
+ $pmpro_db_version = pmpro_upgrade_1_6();
46
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
  function pmpro_upgrade_1_6()
49
  {
72
  pmpro_setOption("db_version", "1.59");
73
  return 1.59;
74
  }
75
+
76
+ function pmpro_upgrade_1_5()
77
+ {
78
+ /*
79
+ Add the id and status fields to pmpro_memberships_users, change primary key to id instead of user_id
80
+ */
81
+
82
+ global $wpdb;
83
+ $wpdb->hide_errors();
84
+ $wpdb->pmpro_memberships_users = $wpdb->prefix . 'pmpro_memberships_users';
85
+
86
+ //remove primary key
87
+ $sqlQuery = "ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` DROP PRIMARY KEY";
88
+ $wpdb->query($sqlQuery);
89
+
90
+ //id
91
+ $sqlQuery = "ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` ADD `id` BIGINT( 20 ) UNSIGNED AUTO_INCREMENT FIRST, ADD PRIMARY KEY(id)";
92
+ $wpdb->query($sqlQuery);
93
+
94
+ //status
95
+ $sqlQuery = "ALTER TABLE `" . $wpdb->pmpro_memberships_users . "` ADD `status` varchar( 20 ) NOT NULL DEFAULT 'active' AFTER `trial_limit`";
96
+ $wpdb->query($sqlQuery);
97
+
98
+ pmpro_setOption("db_version", "1.5");
99
+ return 1.5;
100
  }
101
 
102
  function pmpro_upgrade_1_4_8()
198
  $wpdb->query($sqlQuery);
199
 
200
  $sqlQuery = "
201
+ ALTER TABLE `" . $wpdb->pmpro_membership_levels . "` ADD INDEX ( `enddate` )
202
  ";
203
  $wpdb->query($sqlQuery);
204
 
349
  /*
350
  default options
351
  */
352
+ $nonmembertext = "This content is for !!levels!! members only. <a href=\"" . wp_login_url() . "?action=register\">Register here</a>.";
353
  pmpro_setOption("nonmembertext", $nonmembertext);
354
 
355
+ $notloggedintext = "This content is for !!levels!! members only. Please <a href=\"" . wp_login_url( get_permalink() ) . "\">login</a> to view this content. (<a href=\"" . wp_login_url() . "?action=register\">Register here</a>.)";
 
356
  pmpro_setOption("notloggedintext", $notloggedintext);
357
 
358
+ $rsstext = "This content is for !!levels!! members only. Visit the site and log in/register to read.";
359
  pmpro_setOption("rsstext", $rsstext);
360
 
361
  $gateway_environment = "sandbox";
368
  pmpro_setOption("accepted_credit_cards", $pmpro_accepted_credit_cards);
369
 
370
  $parsed = parse_url(home_url());
371
+ $hostname = $parsed[host];
372
  $hostparts = split("\.", $hostname);
373
  $email_domain = $hostparts[count($hostparts) - 2] . "." . $hostparts[count($hostparts) - 1];
374
  $from_email = "wordpress@" . $email_domain;
377
  $from_name = "WordPress";
378
  pmpro_setOption("from_name", $from_name);
379
 
 
 
 
 
 
 
380
  pmpro_setOption("tospage", "");
381
 
382
+ /*
383
+ DB table setup
384
+ */
 
 
 
 
 
 
 
 
 
385
  global $wpdb;
386
  $wpdb->hide_errors();
387
  $wpdb->pmpro_membership_levels = $wpdb->prefix . 'pmpro_membership_levels';
396
  //wp_pmpro_membership_levels
397
  $sqlQuery = "
398
  CREATE TABLE `" . $wpdb->pmpro_membership_levels . "` (
399
+ `id` int(11) UNSIGNED NOT NULL auto_increment,
400
  `name` varchar(255) NOT NULL,
401
  `description` longtext NOT NULL,
402
+ `initial_payment` decimal(10,2) NOT NULL default '0.00',
403
+ `billing_amount` decimal(10,2) NOT NULL default '0.00',
404
+ `cycle_number` int(11) NOT NULL default '0',
405
+ `cycle_period` enum('Day','Week','Month','Year') default 'Month',
 
406
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
407
+ `trial_amount` decimal(10,2) NOT NULL default '0.00',
408
+ `trial_limit` int(11) NOT NULL default '0',
409
+ `allow_signups` tinyint(4) NOT NULL default '1',
410
+ PRIMARY KEY (`id`),
 
 
411
  KEY `allow_signups` (`allow_signups`),
412
  KEY `initial_payment` (`initial_payment`),
413
  KEY `name` (`name`)
414
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8
415
  ";
416
+ $wpdb->query($sqlQuery);
417
 
418
  //wp_pmpro_membership_orders
419
  $sqlQuery = "
420
  CREATE TABLE `" . $wpdb->pmpro_membership_orders . "` (
421
+ `id` int(11) UNSIGNED NOT NULL auto_increment,
422
  `code` varchar(10) NOT NULL,
423
+ `session_id` varchar(64) NOT NULL default '',
424
+ `user_id` int(11) UNSIGNED NOT NULL default '0',
425
+ `membership_id` int(11) UNSIGNED NOT NULL default '0',
426
+ `paypal_token` varchar(64) NOT NULL default '',
427
+ `billing_name` varchar(128) NOT NULL default '',
428
+ `billing_street` varchar(128) NOT NULL default '',
429
+ `billing_city` varchar(128) NOT NULL default '',
430
+ `billing_state` varchar(32) NOT NULL default '',
431
+ `billing_zip` varchar(16) NOT NULL default '',
 
432
  `billing_phone` varchar(32) NOT NULL,
433
+ `subtotal` varchar(16) NOT NULL default '',
434
+ `tax` varchar(16) NOT NULL default '',
435
+ `couponamount` varchar(16) NOT NULL default '',
436
+ `certificate_id` int(11) NOT NULL default '0',
437
+ `certificateamount` varchar(16) NOT NULL default '',
438
+ `total` varchar(16) NOT NULL default '',
439
+ `payment_type` varchar(64) NOT NULL default '',
440
+ `cardtype` varchar(32) NOT NULL default '',
441
+ `accountnumber` varchar(32) NOT NULL default '',
442
+ `expirationmonth` char(2) NOT NULL default '',
443
+ `expirationyear` varchar(4) NOT NULL default '',
444
+ `status` varchar(32) NOT NULL default '',
445
  `gateway` varchar(64) NOT NULL,
446
  `gateway_environment` varchar(64) NOT NULL,
447
  `payment_transaction_id` varchar(64) NOT NULL,
448
  `subscription_transaction_id` varchar(32) NOT NULL,
449
+ `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
450
  `affiliate_id` varchar(32) NOT NULL,
451
  `affiliate_subid` varchar(32) NOT NULL,
452
+ PRIMARY KEY (`id`),
 
453
  UNIQUE KEY `code` (`code`),
454
  KEY `session_id` (`session_id`),
455
  KEY `user_id` (`user_id`),
456
  KEY `membership_id` (`membership_id`),
 
457
  KEY `timestamp` (`timestamp`),
458
  KEY `gateway` (`gateway`),
459
+ KEY `gateway_environment` (`gateway_environment`)
460
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
 
 
461
  ";
462
+ $wpdb->query($sqlQuery);
463
 
464
  //wp_pmpro_memberships_categories
465
  $sqlQuery = "
466
  CREATE TABLE `" . $wpdb->pmpro_memberships_categories . "` (
467
+ `membership_id` int(11) UNSIGNED NOT NULL,
468
+ `category_id` int(11) UNSIGNED NOT NULL,
469
+ `modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
470
  UNIQUE KEY `membership_category` (`membership_id`,`category_id`),
471
  UNIQUE KEY `category_membership` (`category_id`,`membership_id`)
472
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
473
  ";
474
+ $wpdb->query($sqlQuery);
475
 
476
  //wp_pmpro_memberships_pages
477
  $sqlQuery = "
478
  CREATE TABLE `" . $wpdb->pmpro_memberships_pages . "` (
479
+ `membership_id` int(11) UNSIGNED NOT NULL,
480
+ `page_id` int(11) UNSIGNED NOT NULL,
481
+ `modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
482
  UNIQUE KEY `category_membership` (`page_id`,`membership_id`),
483
  UNIQUE KEY `membership_page` (`membership_id`,`page_id`)
484
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
485
  ";
486
+ $wpdb->query($sqlQuery);
487
 
488
  //wp_pmpro_memberships_users
489
  $sqlQuery = "
490
  CREATE TABLE `" . $wpdb->pmpro_memberships_users . "` (
491
+ `user_id` int(11) UNSIGNED NOT NULL,
492
+ `membership_id` int(11) UNSIGNED NOT NULL,
493
+ `code_id` int(11) UNSIGNED NOT NULL,
494
+ `initial_payment` decimal(10,2) NOT NULL,
495
+ `billing_amount` decimal(10,2) NOT NULL,
496
+ `cycle_number` int(11) NOT NULL,
497
+ `cycle_period` enum('Day','Week','Month','Year') NOT NULL default 'Month',
498
+ `billing_limit` int(11) NOT NULL,
499
+ `trial_amount` decimal(10,2) NOT NULL,
500
+ `trial_limit` int(11) NOT NULL,
501
+ `startdate` datetime NOT NULL,
502
+ `modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
503
+ PRIMARY KEY (`user_id`),
504
+ KEY `membership_id` (`membership_id`),
505
+ KEY `modified` (`modified`),
506
+ KEY `code_id` (`code_id`)
507
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
 
 
 
 
508
  ";
509
+ $wpdb->query($sqlQuery);
510
 
511
  //wp_pmpro_discount_codes
512
  $sqlQuery = "
520
  UNIQUE KEY `code` (`code`),
521
  KEY `starts` (`starts`),
522
  KEY `expires` (`expires`)
523
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
524
  ";
525
+ $wpdb->query($sqlQuery);
526
 
527
  //wp_pmpro_discount_codes_levels
528
  $sqlQuery = "
529
  CREATE TABLE `" . $wpdb->pmpro_discount_codes_levels . "` (
530
  `code_id` int(11) unsigned NOT NULL,
531
+ `level_id` int(11) unsigned NOT NULL,
532
  `initial_payment` decimal(10,2) NOT NULL DEFAULT '0.00',
533
  `billing_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
534
  `cycle_number` int(11) NOT NULL DEFAULT '0',
536
  `billing_limit` int(11) NOT NULL COMMENT 'After how many cycles should billing stop?',
537
  `trial_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
538
  `trial_limit` int(11) NOT NULL DEFAULT '0',
 
 
539
  PRIMARY KEY (`code_id`,`level_id`),
540
  KEY `initial_payment` (`initial_payment`)
541
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
542
  ";
543
+ $wpdb->query($sqlQuery);
544
 
545
  //wp_pmpro_discount_codes_uses
546
  $sqlQuery = "
553
  PRIMARY KEY (`id`),
554
  KEY `user_id` (`user_id`),
555
  KEY `timestamp` (`timestamp`)
556
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
557
  ";
558
+ $wpdb->query($sqlQuery);
559
+
560
+ pmpro_setOption("db_version", "1.115");
561
+ return 1.115;
562
  }
includes/xmlrpc.php DELETED
@@ -1,80 +0,0 @@
1
- <?php
2
- /**
3
- * Define the XMLRPC Methods We Add
4
- * Since v2.0
5
- */
6
- add_filter('xmlrpc_methods', 'pmpro_xmlrpc_methods');
7
- function pmpro_xmlrpc_methods($methods)
8
- {
9
- $methods['pmpro.getMembershipLevelForUser'] = 'pmpro_xmlrpc_getMembershipLevelForUser';
10
- $methods['pmpro.hasMembershipAccess'] = 'pmpro_xmlrpc_hasMembershipAccess';
11
- return $methods;
12
- }
13
-
14
- /**
15
- * API method to get the membership level info for a user.
16
- * Since v2.0
17
- */
18
- function pmpro_xmlrpc_getMembershipLevelForUser($args)
19
- {
20
- // Parse the arguments, assuming they're in the correct order
21
- $username = $args[0];
22
- $password = $args[1];
23
- $user_id = $args[2]; //optional user id passed in
24
-
25
- global $wp_xmlrpc_server;
26
-
27
- // Let's run a check to see if credentials are okay
28
- if ( !$user = $wp_xmlrpc_server->login($username, $password) ) {
29
- return $wp_xmlrpc_server->error;
30
- }
31
-
32
- // The user passed should be an admin or have the pmpro_xmlprc capability
33
- if(!user_can($user->ID, "manage_options") && !user_can($user->ID, "pmpro_xmlrpc"))
34
- return "ERROR: User does not have access to the PMPro XMLRPC methods.";
35
-
36
- // Default to logged in user if no user_id is given.
37
- if(empty($user_id))
38
- {
39
- $user_id = $user->ID;
40
- }
41
-
42
- $membership_level = pmpro_getMembershipLevelForUser($user_id);
43
-
44
- return $membership_level;
45
- }
46
-
47
- /**
48
- * API method to check if a user has access to a certain post.
49
- * Since v2.0
50
- */
51
- function pmpro_xmlrpc_hasMembershipAccess($args)
52
- {
53
- // Parse the arguments, assuming they're in the correct order
54
- $username = $args[0];
55
- $password = $args[1];
56
- $post_id = $args[2]; //post id to check
57
- $user_id = $args[3]; //optional user id passed in
58
- $return_membership_levels = $args[4]; //option to also include an array of membership levels with access to the post
59
-
60
- global $wp_xmlrpc_server;
61
-
62
- // Let's run a check to see if credentials are okay
63
- if ( !$user = $wp_xmlrpc_server->login($username, $password) ) {
64
- return $wp_xmlrpc_server->error;
65
- }
66
-
67
- // The user passed should be an admin or have the pmpro_xmlprc capability
68
- if(!user_can($user->ID, "manage_options") && !user_can($user->ID, "pmpro_xmlrpc"))
69
- return "ERROR: User does not have access to the PMPro XMLRPC methods.";
70
-
71
- // Default to logged in user if no user_id is given.
72
- if(empty($user_id))
73
- {
74
- $user_id = $user->ID;
75
- }
76
-
77
- $has_access = pmpro_has_membership_access($post_id, $user_id, $return_membership_levels);
78
-
79
- return $has_access;
80
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/admin_change.html DELETED
@@ -1,7 +0,0 @@
1
- <p>En Administrator hos !!sitename!! har ændret dit medlemsskab niveau.</p>
2
-
3
- <p>!!membership_change!!.</p>
4
-
5
- <p>Hvis du ikke har bedt om, at få dit medlemsskab ændret, og gerne ville vide mere omkring det, kontakt os venligst på denne mail !!siteemail!!</p>
6
-
7
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
languages/email/da_DK/admin_change_admin.html DELETED
@@ -1,5 +0,0 @@
1
- <p>En Administrator hos !!sitename!! har ændret medlemsskab niveau.</p>
2
-
3
- <p>!!membership_change!!.</p>
4
-
5
- <p>Log ind på din Wordpress admin her: !!login_link!!</p>
 
 
 
 
 
languages/email/da_DK/billing.html DELETED
@@ -1,16 +0,0 @@
1
- <p>Din betaings informationer hos !!sitename!! er bleven ændret.</p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>
5
- Betalings Informationer:<br />
6
- !!billing_address!!
7
- </p>
8
-
9
- <p>
10
- !!cardtype!!: !!accountnumber!!<br />
11
- Udløber: !!expirationmonth!!/!!expirationyear!!
12
- </p>
13
-
14
- <p>Hvis du ikke har bedt om, at ændre betalings informationer, så kontakt os via !!siteemail!!</p>
15
-
16
- <p>Log ind til din medlems konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/billing_admin.html DELETED
@@ -1,17 +0,0 @@
1
- <p>Betalings informationer for !!display_name!! hos !!sitename!! er bleven ændret.</p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>
5
- Betalings informationer:<br />
6
- !!billing_name!!<br />
7
- !!billing_street!!<br />
8
- !!billing_city!!, !!billing_state!! !!billing_zip!! !!billing_country!!
9
- !!billing_phone!!
10
- </p>
11
-
12
- <p>
13
- !!cardtype!!: !!accountnumber!!<br />
14
- Udløber: !!expirationmonth!!/!!expirationyear!!
15
- </p>
16
-
17
- <p>Log ind på din Wordpress kontrolpanel her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/billing_failure.html DELETED
@@ -1,11 +0,0 @@
1
- <p>Den nuværende abonnements betaling for dit !!sitename!! medlemsskab har fejlet. <strong>Klik på følgende link for at logge ind og opdatere dine betalings informationer for at undgå at din konto blive deaktiveret. !!login_link!!</strong></p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>De seneste konto informationer vi på arkiv er:</p>
5
-
6
- <p>!!billing_address!!</p>
7
-
8
- <p>
9
- !!cardtype!!: !!accountnumber!!<br />
10
- Udløber: !!expirationmonth!!/!!expirationyear!!
11
- </p>
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/billing_failure_admin.html DELETED
@@ -1,11 +0,0 @@
1
- <p>Betaling Fejlet</p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>De seneste konto informationer vi på arkiv er:</p>
5
-
6
- <p>!!billing_address!!</p>
7
-
8
- <p>
9
- !!cardtype!!: !!accountnumber!!<br />
10
- Udløber: !!expirationmonth!!/!!expirationyear!!
11
- </p>
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/cancel.html DELETED
@@ -1,3 +0,0 @@
1
- <p>Dit medlemsskab hos !!sitename!! er bleven annulleret.</p>
2
-
3
- <p>Hvis du ikke har anmodet om at denne annullering, og ville vide mere omkring det. Kontakt os via !!siteemail!!</p>
 
 
 
languages/email/da_DK/cancel_admin.html DELETED
@@ -1,8 +0,0 @@
1
- <p>Medlemsskabet for !!user_login!! hos !!sitename!! er bleven annulleret.</p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>Medlemsskab Niveau: !!membership_level_name!!</p>
5
- <p>Start Dato: !!startdate!!</p>
6
- <p>Annullering Dato: !!enddate!!</p>
7
-
8
- <p>Log ind på din Wordpress admin her: !!login_link!!</p>
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_check.html DELETED
@@ -1,17 +0,0 @@
1
- <p>Tak for din bestilling til !!sitename!!. Dit medlemsskab er nu aktiveret.</p>
2
-
3
- !!instructions!!
4
-
5
- <p>Nedenfor er detaljerne omkring dit nye medlemsskab og en faktura.</p>
6
-
7
- <p>Konto: !!display_name!! (!!user_email!!)</p>
8
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
9
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
10
- !!membership_expiration!! !!discount_code!!
11
-
12
- <p>
13
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
14
- Regning Total: !!invoice_total!!
15
- </p>
16
-
17
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_check_admin.html DELETED
@@ -1,17 +0,0 @@
1
- <p>Der er kommet et nyt medlem hos !!sitename!!.</p>
2
-
3
- <p><strong>De har valgt at betale med check.</strong></p>
4
-
5
- <p>Nedenfor er detaljer omkring det nye medlems konto og en forklaring på medlemmets faktura.</p>
6
-
7
- <p>Konto: !!display_name!! (!!user_email!!)</p>
8
- <p>Meldlemsskab Niveau: !!membership_level_name!!</p>
9
- <p>Medlemsskab Gebyr: !!membership_cost!!</p>
10
- !!membership_expiration!! !!discount_code!!
11
-
12
- <p>
13
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
14
- Regning Total: $!!invoice_total!!
15
- </p>
16
-
17
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_express.html DELETED
@@ -1,14 +0,0 @@
1
- <p>Tak for din bestilling til !!sitename!!. Dit medlemsskab er nu aktiveret.</p>
2
- <p>Nedenfor er detaljerne omkring dit nye medlemsskab og en faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
11
- Regning Total: !!invoice_total!!
12
- </p>
13
-
14
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_express_admin.html DELETED
@@ -1,14 +0,0 @@
1
- <p>Der er kommet et nyt medlem hos !!sitename!!.</p>
2
- <p>Nedenfor er detaljer omkring det nye medlems konto og en forklaring på medlemmets faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskab Nivea: !!membership_level_name!!</p>
6
- <p>Medlemsskab Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
11
- Regning Total: !!invoice_total!!
12
- </p>
13
-
14
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_free.html DELETED
@@ -1,8 +0,0 @@
1
- <p>Tak for din bestilling til !!sitename!!. Dit medlemsskab er nu aktiveret.</p>
2
- <p>Nedenfor er detaljerne omkring dit nye medlemsskab.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- !!membership_expiration!! !!discount_code!!
7
-
8
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_free_admin.html DELETED
@@ -1,8 +0,0 @@
1
- <p>Der er kommet et nyt medlem hos !!sitename!!.</p>
2
- <p>Nedenfor er detaljerne omkring det nye medlemsskabs konto.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- !!membership_expiration!! !!discount_code!!
7
-
8
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_freetrial.html DELETED
@@ -1,19 +0,0 @@
1
- <p>Tak for din bestilling til !!sitename!!. Dit medlemsskab er nu aktiveret</p>
2
- <p>Nedenfor er detaljerne omkring dit nye medlemsskab.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Betalings informationer i Arkivet:<br />
11
- !!billing_address!!
12
- </p>
13
-
14
- <p>
15
- !!cardtype!!: !!accountnumber!!<br />
16
- Udløber: !!expirationmonth!!/!!expirationyear!!
17
- </p>
18
-
19
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_freetrial_admin.html DELETED
@@ -1,19 +0,0 @@
1
- <p>Der er kommet et nyt medlem hos !!sitename!!.</p>
2
- <p>Nedenfor er detaljer omkring det nye medlems konto og en forklaring på medlemmets faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Betalings informationer i Arkivet:<br />
11
- !!billing_address!!
12
- </p>
13
-
14
- <p>
15
- !!cardtype!!: !!accountnumber!!<br />
16
- Udløber: !!expirationmonth!!/!!expirationyear!!
17
- </p>
18
-
19
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_paid.html DELETED
@@ -1,23 +0,0 @@
1
- <p>Tak for din bestilling til !!sitename!!. Dit medlemsskab er nu aktiveret.</p>
2
- <p>Nedenfor er detaljerne omkring dit nye medlemsskab og en faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
11
- Regning Total: !!invoice_total!!
12
- </p>
13
- <p>
14
- Betalings Informationer:<br />
15
- !!billing_address!!
16
- </p>
17
-
18
- <p>
19
- !!cardtype!!: !!accountnumber!!<br />
20
- Udløber: !!expirationmonth!!/!!expirationyear!!
21
- </p>
22
-
23
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_paid_admin.html DELETED
@@ -1,23 +0,0 @@
1
- <p>Der er kommet et nyt medlem hos !!sitename!!.</p>
2
- <p>Nedenfor er detaljer omkring det nye medlems konto og en forklaring på medlemmets faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
11
- Regning Total: !!invoice_total!!
12
- </p>
13
- <p>
14
- Betalings Informationer:<br />
15
- !!billing_address!!
16
- </p>
17
-
18
- <p>
19
- !!cardtype!!: !!accountnumber!!<br />
20
- Udløber: !!expirationmonth!!/!!expirationyear!!
21
- </p>
22
-
23
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_trial.html DELETED
@@ -1,23 +0,0 @@
1
- <p>Tak for din bestilling til !!sitename!!. Dit medlemsskab er nu aktiveret.</p>
2
- <p>Nedenfor er detaljerne omkring dit nye medlemsskab og en faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
11
- Regning Total: !!invoice_total!!
12
- </p>
13
- <p>
14
- Betalings Informationer:<br />
15
- !!billing_address!!
16
- </p>
17
-
18
- <p>
19
- !!cardtype!!: !!accountnumber!!<br />
20
- Udløber: !!expirationmonth!!/!!expirationyear!!
21
- </p>
22
-
23
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/checkout_trial_admin.html DELETED
@@ -1,23 +0,0 @@
1
- <p>Der er kommet et nyt medlem hos !!sitename!!.</p>
2
- <p>Nedenfor er detaljer omkring det nye medlems konto og en forklaring på medlemmets faktura.</p>
3
-
4
- <p>Konto: !!display_name!! (!!user_email!!)</p>
5
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
6
- <p>Medlemsskabs Gebyr: !!membership_cost!!</p>
7
- !!membership_expiration!! !!discount_code!!
8
-
9
- <p>
10
- Faktura #!!invoice_id!! on !!invoice_date!!<br />
11
- Regning Total: !!invoice_total!!
12
- </p>
13
- <p>
14
- Betalings Informationer:<br />
15
- !!billing_address!!
16
- </p>
17
-
18
- <p>
19
- !!cardtype!!: !!accountnumber!!<br />
20
- Udløber: !!expirationmonth!!/!!expirationyear!!
21
- </p>
22
-
23
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/credit_card_expiring.html DELETED
@@ -1,13 +0,0 @@
1
- <p>Den nuværende abonnements betaling for dit !!sitename!! medlemsskab har fejlet. <strong>Klik på følgende link for at logge ind og opdatere dine betalings informationer for at undgå at din konto blive deaktiveret. !!login_link!!</strong></p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>De seneste konto informationer vi på arkiv er:</p>
5
-
6
- <p>!!billing_name!!</br />
7
- !!billing_address!!
8
- </p>
9
-
10
- <p>
11
- !!cardtype!!: !!accountnumber!!<br />
12
- Udløber: !!expirationmonth!!/!!expirationyear!!
13
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/default.html DELETED
@@ -1 +0,0 @@
1
- !!body!!
 
languages/email/da_DK/footer.html DELETED
@@ -1,4 +0,0 @@
1
- <p>
2
- Respectfully,<br />
3
- !!sitename!!
4
- </p>
 
 
 
 
languages/email/da_DK/header.html DELETED
@@ -1 +0,0 @@
1
- <p>Kære !!name!!,</p>
 
languages/email/da_DK/invoice.html DELETED
@@ -1,19 +0,0 @@
1
- <p>Thank you for your membership to !!sitename!!. Below is a receipt for your most recent membership invoice.</p>
2
-
3
- <p>Account: !!display_name!! (!!user_email!!)</p>
4
- <p>
5
- Invoice #!!invoice_id!! on !!invoice_date!!<br />
6
- Total Billed: !!invoice_total!!
7
- </p>
8
- <p>
9
- Billing Information:<br />
10
- !!billing_address!!
11
- </p>
12
-
13
- <p>
14
- !!cardtype!!: !!accountnumber!!<br />
15
- Expires: !!expirationmonth!!/!!expirationyear!!
16
- </p>
17
-
18
- <p>Log in to your membership account here: !!login_link!!</p>
19
- <p>To view an online version of this invoice, click here: !!invoice_link!!</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/email/da_DK/membership_expired.html DELETED
@@ -1,7 +0,0 @@
1
- <p>Dit medlemsskab hos !!sitename!! er ophørt.</p>
2
-
3
- <p>Vi takker for din support.</p>
4
-
5
- <p>Se vores nuværende medlems tilbud: !!levels_link!!</p>
6
-
7
- <p>Log in, for at håndtere din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
languages/email/da_DK/membership_expiring.html DELETED
@@ -1,6 +0,0 @@
1
- <p>Vi er glade for dit medlemsskab hos !!sitename!!. Dette er bare en påmindelse om, at dit medlemsskab ender den !!enddate!!.</p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
5
-
6
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
languages/email/da_DK/trial_ending.html DELETED
@@ -1,8 +0,0 @@
1
- <p>Vi er glade for dit medlemsskab hos !!sitename!!. Din prøveperiode ender den !!trial_end!!.</p>
2
-
3
- <p>Konto: !!display_name!! (!!user_email!!)</p>
4
- <p>Medlemsskabs Niveau: !!membership_level_name!!</p>
5
-
6
- <p>Dit gebyr ville ændre sig fra !!trial_amount!! til !!billing_amount!! hver !!cycle_number!! !!cycle_period!!(s).</p>
7
-
8
- <p>Log ind på din konto her: !!login_link!!</p>
 
 
 
 
 
 
 
 
languages/gettext.sh DELETED
@@ -1,23 +0,0 @@
1
- #---------------------------
2
- # This script generates a new pmpro.pot file for use in translations.
3
- # To generate a new pmpro.pot, cd to the main /paid-memberships-pro/ directory,
4
- # then execute `languages/gettext.sh` from the command line.
5
- # then fix the header info (helps to have the old pmpro.pot open before running script above)
6
- # then execute `cp languages/pmpro.pot languages/pmpro.po` to copy the .pot to .po
7
- # then execute `msgfmt languages/pmpro.po --output-file languages/pmpro.mo` to generate the .mo
8
- #---------------------------
9
- echo "Updating pmpro.pot... "
10
- xgettext -j -o languages/pmpro.pot \
11
- --default-domain=pmpro \
12
- --language=PHP \
13
- --keyword=_ \
14
- --keyword=__ \
15
- --keyword=_e \
16
- --keyword=_ex \
17
- --keyword=_n \
18
- --keyword=_x \
19
- --sort-by-file \
20
- --package-version=1.0 \
21
- --msgid-bugs-address="jason@strangerstudios.com" \
22
- $(find . -name "*.php")
23
- echo "Done!"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/pmpro-cs_CZ.mo DELETED
Binary file
languages/pmpro-cs_CZ.po DELETED
@@ -1,2889 +0,0 @@
1
- #
2
- # Hi there! Details on how to help out translating Paid Memberships Pro can be found at:
3
- # http://www.paidmembershipspro.com/documentation/languages/
4
- #
5
- msgid ""
6
- msgstr ""
7
- "Project-Id-Version: pmpro\n"
8
- "POT-Creation-Date: 2013-12-10 12:14-0500\n"
9
- "PO-Revision-Date: 2013-12-20 13:36+0100\n"
10
- "Last-Translator: Milan Hrnčál <hrncal.junior@seznam.cz>\n"
11
- "Language-Team: Stranger Studios <jason@strangerstudios.com>\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "Language: cs_CZ\n"
16
- "X-Generator: Poedit 1.6.3\n"
17
-
18
- #: adminpages/addons.php:5 adminpages/advancedsettings.php:5
19
- #: adminpages/discountcodes.php:5 adminpages/emailsettings.php:5
20
- #: adminpages/membershiplevels.php:5 adminpages/memberslist-csv.php:5
21
- #: adminpages/memberslist.php:5 adminpages/orders-csv.php:5
22
- #: adminpages/orders.php:5 adminpages/pagesettings.php:5
23
- #: adminpages/paymentsettings.php:5
24
- msgid "You do not have permissions to perform this action."
25
- msgstr "K provedení této akce nemáte dostatečná opravnění."
26
-
27
- #: adminpages/addons.php:79
28
- msgid "Disabled"
29
- msgstr "Nepovoleno"
30
-
31
- #: adminpages/addons.php:79
32
- msgid "Enabled"
33
- msgstr "Povoleno"
34
-
35
- #: adminpages/admin_header.php:25
36
- msgid "Add a membership level to get started."
37
- msgstr "Ke spuštění zadejte úroveň ćlenství"
38
-
39
- #: adminpages/admin_header.php:27
40
- msgid "Setup the membership pages"
41
- msgstr "Nastavit stránky členů"
42
-
43
- #: adminpages/admin_header.php:29
44
- msgid "Setup your SSL certificate and payment gateway"
45
- msgstr "Nastavení vašeho SSL certifikátu a platební brány"
46
-
47
- #: adminpages/admin_header.php:38
48
- msgid ""
49
- "The billing details for some of your membership levels is not supported by "
50
- "Stripe."
51
- msgstr ""
52
- "Pro některé uživatelské úrovně není možné zobrazit fakturační podrobnosti "
53
- "(nepodporováno STRIPEM)."
54
-
55
- #: adminpages/admin_header.php:46
56
- msgid ""
57
- "The billing details for this level are not supported by Stripe. Please "
58
- "review the notes in the Billing Details section below."
59
- msgstr ""
60
- "Pro tuto úroveň nejsou podporovány fakturační údaje (nepodporuje STRIPE). "
61
- "Níže, v části fakturační údaje, si přečtěte pokyny."
62
-
63
- #: adminpages/admin_header.php:50 adminpages/admin_header.php:70
64
- #: adminpages/admin_header.php:90 adminpages/admin_header.php:111
65
- msgid "The levels with issues are highlighted below."
66
- msgstr "Úrovně s otázkami jsou označeny níže."
67
-
68
- #: adminpages/admin_header.php:52 adminpages/admin_header.php:72
69
- #: adminpages/admin_header.php:92 adminpages/admin_header.php:113
70
- msgid "Please edit your levels"
71
- msgstr "Prosím upravte vaše úrovně"
72
-
73
- #: adminpages/admin_header.php:58
74
- msgid ""
75
- "The billing details for some of your membership levels is not supported by "
76
- "Payflow."
77
- msgstr ""
78
- "Fakturační údaje pro některé z vašich členských úrovní nejsou podporovány "
79
- "Payflow."
80
-
81
- #: adminpages/admin_header.php:66
82
- msgid ""
83
- "The billing details for this level are not supported by Payflow. Please "
84
- "review the notes in the Billing Details section below."
85
- msgstr ""
86
- "Payflow nepodporuje fakturační detaily pro tuto úroveň. Níže, v části "
87
- "fakturační údaje, si přečtěte pokyny."
88
-
89
- #: adminpages/admin_header.php:78
90
- msgid ""
91
- "The billing details for some of your membership levels is not supported by "
92
- "Braintree."
93
- msgstr ""
94
- "Braintree nepodporuje fakturační detaily pro některé vaše členské úrovně."
95
-
96
- #: adminpages/admin_header.php:86
97
- msgid ""
98
- "The billing details for this level are not supported by Braintree. Please "
99
- "review the notes in the Billing Details section below."
100
- msgstr ""
101
- "Braintree nepodporuje fakturační detaily pro tuto členskou úroveň. Prosím "
102
- "prostudujte poznámky v sekci fakturační údaje. Tyto poznámky naleznete níže."
103
-
104
- #: adminpages/admin_header.php:98
105
- msgid ""
106
- "The billing details for some of your membership levels is not supported by "
107
- "TwoCheckout."
108
- msgstr ""
109
- "TwoCheckout nepodporuje fakturační detaily pro některé vaše členské úrovně."
110
-
111
- #: adminpages/admin_header.php:107
112
- msgid ""
113
- "The billing details for this level are not supported by 2Checkout. Please "
114
- "review the notes in the Billing Details section below."
115
- msgstr ""
116
- "TwoCheckout nepodporuje fakturační detaily pro tuto úroveň. Prosím "
117
- "prostudujte poznámky v sekci fakturační údaje. Tyto poznámky naleznete níže."
118
-
119
- #: adminpages/admin_header.php:127 adminpages/admin_header.php:106
120
- msgid "Plugin Support"
121
- msgstr "Podpora pluginu"
122
-
123
- #: adminpages/admin_header.php:127 adminpages/admin_header.php:106
124
- msgid "User Forum"
125
- msgstr "Uživatelské fórum"
126
-
127
- #: adminpages/admin_header.php:149 adminpages/membershiplevels.php:496
128
- #: includes/adminpages.php:44 adminpages/admin_header.php:128
129
- #: adminpages/membershiplevels.php:490
130
- msgid "Membership Levels"
131
- msgstr "Úroveň členství"
132
-
133
- #: adminpages/admin_header.php:150 adminpages/pagesettings.php:92
134
- #: adminpages/admin_header.php:129
135
- msgid "Pages"
136
- msgstr "Stránky"
137
-
138
- #: adminpages/admin_header.php:151 adminpages/admin_header.php:130
139
- msgid "Payment Gateway &amp; SSL"
140
- msgstr "Platební brány &amp; SSL"
141
-
142
- #: adminpages/admin_header.php:152 adminpages/memberslist.php:115
143
- #: pages/account.php:52 adminpages/admin_header.php:131
144
- msgid "Email"
145
- msgstr "Email"
146
-
147
- #: adminpages/admin_header.php:153 adminpages/admin_header.php:132
148
- msgid "Advanced"
149
- msgstr "Pokročilé"
150
-
151
- #: adminpages/admin_header.php:154 includes/adminpages.php:14
152
- #: includes/adminpages.php:69 adminpages/admin_header.php:133
153
- msgid "Add Ons"
154
- msgstr "Doplňky"
155
-
156
- #: adminpages/advancedsettings.php:35
157
- msgid "Your advanced settings have been updated."
158
- msgstr "Vaše pokročilá nastavení budou aktualizována."
159
-
160
- #: adminpages/advancedsettings.php:79 includes/adminpages.php:13
161
- #: includes/adminpages.php:64
162
- msgid "Advanced Settings"
163
- msgstr "Pokročilá nastavení"
164
-
165
- #: adminpages/advancedsettings.php:85
166
- msgid "Message for Logged-in Non-members"
167
- msgstr "Zpráva pro přihlášené v nečlenech"
168
-
169
- #: adminpages/advancedsettings.php:89
170
- msgid ""
171
- "This message replaces the post content for non-members. Available variables"
172
- msgstr "Tato zpráva nahrazuje obsah příspěvku pro nečleny. Dostupné proměné"
173
-
174
- #: adminpages/advancedsettings.php:94
175
- msgid "Message for Logged-out Users"
176
- msgstr "Zpráva pro odhlášené uživatele"
177
-
178
- #: adminpages/advancedsettings.php:98
179
- msgid "This message replaces the post content for logged-out visitors."
180
- msgstr "Tato zpráva nahrazuje obsah příspěvku pro odhlášené uživatele."
181
-
182
- #: adminpages/advancedsettings.php:103
183
- msgid "Message for RSS Feed"
184
- msgstr "Zpráva pro RSS Feed"
185
-
186
- #: adminpages/advancedsettings.php:107
187
- msgid "This message replaces the post content in RSS feeds."
188
- msgstr "Tato zpráva nahrazuje obsah příspěvku v RSSfeedu."
189
-
190
- #: adminpages/advancedsettings.php:113
191
- msgid "Show Excerpts to Non-Members?"
192
- msgstr "Zobrazit ukázky pro nečleny?"
193
-
194
- #: adminpages/advancedsettings.php:117
195
- msgid "No - Hide excerpts."
196
- msgstr "Ne - Skrýt ukázky"
197
-
198
- #: adminpages/advancedsettings.php:118
199
- msgid "Yes - Show excerpts."
200
- msgstr "Ano - Ukázat ukázky"
201
-
202
- #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:187
203
- #: adminpages/advancedsettings.php:199 adminpages/membershiplevels.php:569
204
- #: adminpages/paymentsettings.php:429 adminpages/paymentsettings.php:454
205
- #: includes/profile.php:123 adminpages/membershiplevels.php:563
206
- #: adminpages/paymentsettings.php:414 includes/profile.php:121
207
- msgid "No"
208
- msgstr "Ne"
209
-
210
- #: adminpages/advancedsettings.php:129
211
- msgid "Hide Ads From All Members"
212
- msgstr "Skrýt reklamy pro všechny členy"
213
-
214
- #: adminpages/advancedsettings.php:130
215
- msgid "Hide Ads From Certain Members"
216
- msgstr "Skrýt reklamy pro některé členy"
217
-
218
- #: adminpages/advancedsettings.php:137
219
- msgid "Ads from the following plugins will be automatically turned off"
220
- msgstr "Reklama z následujících pluginů se automaticky vypne"
221
-
222
- #: adminpages/advancedsettings.php:138
223
- msgid "To hide ads in your template code, use code like the following"
224
- msgstr ""
225
- "Chcete-li skrýt reklamy ve vašem kódu šablony, použijté kód jako je tento"
226
-
227
- #: adminpages/advancedsettings.php:149
228
- msgid "Choose Levels to Hide Ads From"
229
- msgstr "Zvolte úrovně pro skrité reklam"
230
-
231
- #: adminpages/advancedsettings.php:183
232
- msgid "Redirect all traffic from registration page to /susbcription/?"
233
- msgstr "Přesměrovat veškerý provoz z registrační stránky na / susbcription /?"
234
-
235
- #: adminpages/advancedsettings.php:183
236
- msgid "multisite only"
237
- msgstr "Pouze pro multisite"
238
-
239
- #: adminpages/advancedsettings.php:188 adminpages/membershiplevels.php:569
240
- #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:455
241
- #: includes/profile.php:124 adminpages/membershiplevels.php:563
242
- #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424
243
- #: includes/profile.php:122
244
- msgid "Yes"
245
- msgstr "Ano"
246
-
247
- #: adminpages/advancedsettings.php:195
248
- msgid "Use reCAPTCHA?"
249
- msgstr "Použít reCAPTCHU?"
250
-
251
- #: adminpages/advancedsettings.php:200
252
- msgid "Yes - Free memberships only."
253
- msgstr "Ano - Pouze členové zdarma "
254
-
255
- #: adminpages/advancedsettings.php:201
256
- msgid "Yes - All memberships."
257
- msgstr "Ano - všichni členové"
258
-
259
- #: adminpages/advancedsettings.php:203
260
- msgid "A free reCAPTCHA key is required."
261
- msgstr "Je vyžadován volný reCAPTCHA klíč."
262
-
263
- #: adminpages/advancedsettings.php:203
264
- msgid "Click here to signup for reCAPTCHA"
265
- msgstr "Klikněte zde pro registraci re CAPTCHA"
266
-
267
- #: adminpages/advancedsettings.php:209
268
- msgid "reCAPTCHA Public Key"
269
- msgstr "reCAPTCHA veřejný klíč"
270
-
271
- #: adminpages/advancedsettings.php:212
272
- msgid "reCAPTCHA Private Key"
273
- msgstr "reCAPTCHA osobní klíč"
274
-
275
- #: adminpages/advancedsettings.php:218
276
- msgid "Require Terms of Service on signups?"
277
- msgstr "Vyžadovat souhlas s podmínkami služeb o registraci?"
278
-
279
- #: adminpages/advancedsettings.php:225
280
- msgid ""
281
- "If yes, create a WordPress page containing your TOS agreement and assign it "
282
- "using the dropdown above."
283
- msgstr ""
284
- "Pokud ano, WordPress vytvoří stránky obsahující váš souhlas s podmínkami "
285
- "služeb a přiřadít jej pomocí rozevíracího seznamu výše."
286
-
287
- #: adminpages/advancedsettings.php:284 adminpages/pagesettings.php:223
288
- #: adminpages/paymentsettings.php:526 adminpages/pagesettings.php:209
289
- #: adminpages/paymentsettings.php:485
290
- msgid "Save Settings"
291
- msgstr "Uložit nastavení"
292
-
293
- #: adminpages/discountcodes.php:48
294
- msgid "Discount code updated successfully."
295
- msgstr "Slevový kód byl úspěšně upraven."
296
-
297
- #: adminpages/discountcodes.php:55
298
- msgid "Error updating discount code. That code may already be in use."
299
- msgstr ""
300
- "Chyba při aktualizaci slevového kupónu. Tento kupón může být již v provozu."
301
-
302
- #: adminpages/discountcodes.php:64
303
- msgid "Discount code added successfully."
304
- msgstr "Slevový kód byl úspěšně přidán"
305
-
306
- #: adminpages/discountcodes.php:71
307
- msgid "Error adding discount code. That code may already be in use."
308
- msgstr ""
309
- "Chyba při přidání slevového kupónu. Tento kupón může být již v provozu."
310
-
311
- #: adminpages/discountcodes.php:196
312
- #, php-format
313
- msgid "Error saving values for the %s level."
314
- msgstr "Chyba při hodnotě pro %s úroveň."
315
-
316
- #: adminpages/discountcodes.php:204
317
- msgid "There were errors updating the level values: "
318
- msgstr "Došlo k chybám při aktualizací hodnot úrovní:"
319
-
320
- #: adminpages/discountcodes.php:234
321
- #, php-format
322
- msgid "Code %s deleted successfully."
323
- msgstr "Kúpón %s byl úspěšně smazán."
324
-
325
- #: adminpages/discountcodes.php:239
326
- msgid ""
327
- "Error deleting discount code. The code was only partially deleted. Please "
328
- "try again."
329
- msgstr ""
330
- "Chyba při mazání slevového kupónu. Kód byl jen částečně odstraněn. Zkuste to "
331
- "prosím znovu."
332
-
333
- #: adminpages/discountcodes.php:245
334
- msgid "Error deleting code. Please try again."
335
- msgstr "Chyba při mazání kupónu. Zkuste to znovu."
336
-
337
- #: adminpages/discountcodes.php:251
338
- msgid "Code not found."
339
- msgstr "Kupón nenalezen."
340
-
341
- #: adminpages/discountcodes.php:264
342
- msgid "Edit Discount Code"
343
- msgstr "Upravit slevový kupón"
344
-
345
- #: adminpages/discountcodes.php:266 adminpages/discountcodes.php:526
346
- msgid "Add New Discount Code"
347
- msgstr "Vložit nový slevový kupón"
348
-
349
- #: adminpages/discountcodes.php:306 adminpages/discountcodes.php:547
350
- #: adminpages/membershiplevels.php:284 adminpages/membershiplevels.php:511
351
- #: adminpages/memberslist.php:111 adminpages/orders.php:597
352
- #: adminpages/reports/login.php:140 adminpages/membershiplevels.php:505
353
- msgid "ID"
354
- msgstr "ID"
355
-
356
- #: adminpages/discountcodes.php:307 adminpages/orders.php:211
357
- msgid "This will be generated when you save."
358
- msgstr "Toto bude generováno, když práci uložíte."
359
-
360
- #: adminpages/discountcodes.php:311 adminpages/discountcodes.php:548
361
- #: adminpages/orders.php:215 adminpages/orders.php:598
362
- msgid "Code"
363
- msgstr "Kód"
364
-
365
- #: adminpages/discountcodes.php:349
366
- msgid "Start Date"
367
- msgstr "Počáteční datum"
368
-
369
- #: adminpages/discountcodes.php:367 pages/billing.php:249
370
- #: pages/checkout.php:532 pages/checkout.php:525
371
- msgid "Expiration Date"
372
- msgstr "Datum vypršení"
373
-
374
- #: adminpages/discountcodes.php:385 adminpages/discountcodes.php:551
375
- msgid "Uses"
376
- msgstr "Uživatelé"
377
-
378
- #: adminpages/discountcodes.php:388
379
- msgid "Leave blank for unlimited uses."
380
- msgstr "Pro neomezené použití zanechte prázdné."
381
-
382
- #: adminpages/discountcodes.php:427 adminpages/membershiplevels.php:337
383
- #: adminpages/membershiplevels.php:513 pages/levels.php:14
384
- #: adminpages/membershiplevels.php:507
385
- msgid "Initial Payment"
386
- msgstr "Počáteční platba"
387
-
388
- #: adminpages/discountcodes.php:428 adminpages/membershiplevels.php:338
389
- msgid "The initial amount collected at registration."
390
- msgstr "Počáteční částka získaná při registraci."
391
-
392
- #: adminpages/discountcodes.php:432 adminpages/membershiplevels.php:342
393
- msgid "Recurring Subscription"
394
- msgstr "Opakované předplatné"
395
-
396
- #: adminpages/discountcodes.php:433 adminpages/membershiplevels.php:343
397
- msgid "Check if this level has a recurring subscription payment."
398
- msgstr "Zkontrolujte, zda má tato úroveň opakující se platby předplatného."
399
-
400
- #: adminpages/discountcodes.php:437
401
- msgid "Billing Ammount"
402
- msgstr "Fakturační množství"
403
-
404
- #: adminpages/discountcodes.php:451 adminpages/membershiplevels.php:362
405
- msgid "The amount to be billed one cycle after the initial payment."
406
- msgstr "Částka, která má být účtována za jeden cyklus, po první platbě."
407
-
408
- #: adminpages/discountcodes.php:456 adminpages/membershiplevels.php:380
409
- msgid "Billing Cycle Limit"
410
- msgstr "Limit fakturačního cyklu"
411
-
412
- #: adminpages/discountcodes.php:459 adminpages/membershiplevels.php:384
413
- msgid ""
414
- "The <strong>total</strong> number of recurring billing cycles for this "
415
- "level, including the trial period (if applicable) but not including the "
416
- "initial payment. Set to zero if membership is indefinite."
417
- msgstr ""
418
- "<strong> Všech </ strong> počet opakujících se fakturačních cyklů na této "
419
- "úrovni, včetně zkušební doby (pokud existuje), ale ne včetně počáteční "
420
- "platby. Nastavit na nulu, pokud je členství na dobu neurčitou."
421
-
422
- #: adminpages/discountcodes.php:464 adminpages/membershiplevels.php:393
423
- msgid "Custom Trial"
424
- msgstr "Vlastní zkušební verze"
425
-
426
- #: adminpages/discountcodes.php:465 adminpages/membershiplevels.php:395
427
- #: adminpages/membershiplevels.php:394
428
- msgid "Check to add a custom trial period."
429
- msgstr "Zkontrolujte, zda jste přidal vlastní zkušební dobu."
430
-
431
- #: adminpages/discountcodes.php:469 adminpages/membershiplevels.php:404
432
- #: adminpages/membershiplevels.php:398
433
- msgid "Trial Billing Amount"
434
- msgstr "Množství zkušebních fakturací"
435
-
436
- #: adminpages/discountcodes.php:472 adminpages/membershiplevels.php:407
437
- #: adminpages/membershiplevels.php:401
438
- msgid "for the first"
439
- msgstr "zaprvé"
440
-
441
- #: adminpages/discountcodes.php:474 adminpages/membershiplevels.php:409
442
- #: adminpages/membershiplevels.php:403
443
- msgid "subscription payments"
444
- msgstr "Předplatné"
445
-
446
- #: adminpages/discountcodes.php:479 adminpages/membershiplevels.php:437
447
- #: adminpages/membershiplevels.php:431
448
- msgid "Membership Expiration"
449
- msgstr "Vypršení členství"
450
-
451
- #: adminpages/discountcodes.php:480
452
- msgid "Check this to set an expiration date for new sign ups."
453
- msgstr "Zkontorlujte datum vypršení platnosti nového zápisu."
454
-
455
- #: adminpages/discountcodes.php:484 adminpages/membershiplevels.php:442
456
- #: adminpages/membershiplevels.php:436
457
- msgid "Expires In"
458
- msgstr "Vyprší v"
459
-
460
- #: adminpages/discountcodes.php:497
461
- msgid ""
462
- "How long before the expiration expires. Note that any future payments will "
463
- "be cancelled when the membership expires."
464
- msgstr ""
465
- "Jak dlouho před vypršením platnosti. Všimněte si, že všechny budoucí platby "
466
- "budou zrušeny po vypršení členství."
467
-
468
- #: adminpages/discountcodes.php:525
469
- msgid "Memberships Discount Codes"
470
- msgstr "Slevové kupóny pro členy"
471
-
472
- #: adminpages/discountcodes.php:535
473
- msgid "Search Discount Codes"
474
- msgstr "Najít slevové kupóny"
475
-
476
- #: adminpages/discountcodes.php:538 adminpages/reports/login.php:81
477
- msgid "Search"
478
- msgstr "Hledat"
479
-
480
- #: adminpages/discountcodes.php:549
481
- msgid "Starts"
482
- msgstr "Statistiky"
483
-
484
- #: adminpages/discountcodes.php:550 adminpages/memberslist.php:121
485
- #: adminpages/reports/login.php:145 includes/profile.php:120
486
- #: includes/profile.php:118
487
- msgid "Expires"
488
- msgstr "Vyprší"
489
-
490
- #: adminpages/discountcodes.php:552
491
- msgid "Levels"
492
- msgstr "Úrovně"
493
-
494
- #: adminpages/discountcodes.php:570
495
- msgid "Create your first discount code now"
496
- msgstr "Nyní vytvořte Váš první slevový kupón"
497
-
498
- #: adminpages/discountcodes.php:570
499
- msgid ""
500
- "Discount codes allow you to offer your memberships at discounted prices to "
501
- "select customers."
502
- msgstr ""
503
- "Slevové kupóny vám umožňují nabízet své členství, pro vybrané zákazníky, za "
504
- "zvýhodněné ceny"
505
-
506
- #: adminpages/discountcodes.php:614 adminpages/membershiplevels.php:570
507
- #: adminpages/orders.php:658 adminpages/membershiplevels.php:564
508
- msgid "edit"
509
- msgstr "upravit"
510
-
511
- #: adminpages/discountcodes.php:617
512
- #, php-format
513
- msgid ""
514
- "Are you sure you want to delete the %s discount code? The subscriptions for "
515
- "existing users will not change, but new users will not be able to use this "
516
- "code anymore."
517
- msgstr ""
518
- "Jste si jisti, že chcete smazat % s slevový kupón? Odběry pro stávající "
519
- "uživatele se nezmění, ale noví uživatelé nebudou moci použít tyto kupóny."
520
-
521
- #: adminpages/discountcodes.php:617 adminpages/membershiplevels.php:572
522
- #: adminpages/orders.php:664 adminpages/membershiplevels.php:566
523
- msgid "delete"
524
- msgstr "smazat"
525
-
526
- #: adminpages/emailsettings.php:60 includes/adminpages.php:12
527
- #: includes/adminpages.php:59
528
- msgid "Email Settings"
529
- msgstr "Nastavení e-mailu"
530
-
531
- #: adminpages/emailsettings.php:61
532
- msgid ""
533
- "By default, system generated emails are sent from "
534
- "<em><strong>wordpress@yourdomain.com</strong></em>. You can update this from "
535
- "address using the fields below."
536
- msgstr ""
537
- "Ve výchozím nastavení jsou generovány e-maily, které jsou odesílány z "
538
- "<em><strong>wordpress@yourdomain.com</strong></em>. Můžete aktualizovat z "
539
- "adresy, pomocí níže uvedených polí."
540
-
541
- #: adminpages/emailsettings.php:63
542
- msgid ""
543
- "To modify the appearance of system generated emails, add the files "
544
- "<em>email_header.html</em> and <em>email_footer.html</em> to your theme's "
545
- "directory. This will modify both the WordPress default messages as well as "
546
- "messages generated by Paid Memberships Pro. <a title=\"Paid Memberships Pro "
547
- "- Member Communications\" target=\"_blank\" href=\"http://www."
548
- "paidmembershipspro.com/documentation/member-communications/\">Click here to "
549
- "learn more about Paid Memberships Pro emails</a>."
550
- msgstr ""
551
- "Chcete-li změnit vzhled systémem generovaných e-mailů, přidejte soubory "
552
- "<em>email_header.html < em> a <em>email_footer.html </em> do adresáře vašeho "
553
- "motivu. To bude upravovat jak výchozí zprávy WordPress, tak i zprávy "
554
- "generované pomocí Paid Memberships Pro. <a title=\"Paid Memberships Pro - "
555
- "Member Communications\" target=\"_blank\" href=\"http://www."
556
- "paidmembershipspro.com/documentation/member-communications/\"> Klikněte zde "
557
- "a dozvíte se více o Paid Memberships Pro emails</a>."
558
-
559
- #: adminpages/emailsettings.php:69
560
- msgid "From Email"
561
- msgstr "Z e-mailu"
562
-
563
- #: adminpages/emailsettings.php:77
564
- msgid "From Name"
565
- msgstr "Z názvu"
566
-
567
- #: adminpages/emailsettings.php:86
568
- msgid "Send the site admin emails"
569
- msgstr "Odešlete emaly správci webu"
570
-
571
- #: adminpages/emailsettings.php:92
572
- msgid "Checkout"
573
- msgstr "Pokladna"
574
-
575
- #: adminpages/emailsettings.php:96
576
- msgid "when a member checks out."
577
- msgstr "když členové zaplatí"
578
-
579
- #: adminpages/emailsettings.php:101
580
- msgid "Admin Changes"
581
- msgstr "Změny správce"
582
-
583
- #: adminpages/emailsettings.php:105
584
- msgid "when an admin changes a user's membership level through the dashboard."
585
- msgstr "když správce změní úrověň členství uživatelů přes nástěnku."
586
-
587
- #: adminpages/emailsettings.php:110
588
- msgid "Cancellation"
589
- msgstr "Zrušení."
590
-
591
- #: adminpages/emailsettings.php:114
592
- msgid "when a user cancels his or her account."
593
- msgstr "když uživatel zruší svůj účet."
594
-
595
- #: adminpages/emailsettings.php:119
596
- msgid "Bill Updates"
597
- msgstr "Aktualizace účtenky"
598
-
599
- #: adminpages/emailsettings.php:123
600
- msgid "when a user updates his or her billing information."
601
- msgstr "pokud uživatel aktualizuje svoje fakturační údaje."
602
-
603
- #: adminpages/emailsettings.php:129
604
- msgid "Send members emails"
605
- msgstr "Poslat uživatelské e-maily"
606
-
607
- #: adminpages/emailsettings.php:135
608
- msgid "New Users"
609
- msgstr "Noví uživatelé"
610
-
611
- #: adminpages/emailsettings.php:139
612
- msgid ""
613
- "Default WP notification email. (Recommended: Leave unchecked. Members will "
614
- "still get an email confirmation from PMPro after checkout.)"
615
- msgstr ""
616
- "Výchozí WP e-mailové upozornění. (Doporučeno: Nechte zaškrtnuté. Členové "
617
- "budou ještě dostat e-mailem potvrzení od PMPro po vyzkoušení.)."
618
-
619
- #: adminpages/membershiplevels.php:118
620
- msgid "Membership level updated successfully."
621
- msgstr "Úroveň členství byla úspěšne uprave."
622
-
623
- #: adminpages/membershiplevels.php:124
624
- msgid "Error updating membership level."
625
- msgstr "Chyba při aktualizaci členské úrovně."
626
-
627
- #: adminpages/membershiplevels.php:141
628
- msgid "Membership level added successfully."
629
- msgstr "Členská úroveň úspěšně přidána."
630
-
631
- #: adminpages/membershiplevels.php:146
632
- msgid "Error adding membership level."
633
- msgstr "Chyba při přidávání členské úrovně."
634
-
635
- #: adminpages/membershiplevels.php:179
636
- #, php-format
637
- msgid ""
638
- "There was an error canceling the subscription for user with ID=%d. You will "
639
- "want to check your payment gateway to see if their subscription is still "
640
- "active."
641
- msgstr ""
642
- "Došlo k chybě při zrušení odběru pro uživatele s ID =%d. Budete chtít "
643
- "zkontrolovat platební bránu, zda je jejich předplatné je stále aktivní."
644
-
645
- #: adminpages/membershiplevels.php:182
646
- msgid "Last Invoice"
647
- msgstr "Poslední faktury"
648
-
649
- #: adminpages/membershiplevels.php:196
650
- msgid "Membership level deleted successfully."
651
- msgstr "Úroveň členství byla úspěšně smazána."
652
-
653
- #: adminpages/membershiplevels.php:201 adminpages/membershiplevels.php:207
654
- msgid "Error deleting membership level."
655
- msgstr "Chyb a při mazání členské úrovně."
656
-
657
- #: adminpages/membershiplevels.php:222
658
- msgid "Edit Membership Level"
659
- msgstr "Změna uživatelské úrovně"
660
-
661
- #: adminpages/membershiplevels.php:224
662
- msgid "Add New Membership Level"
663
- msgstr "Vložit novou úroveň členství"
664
-
665
- #: adminpages/membershiplevels.php:291 adminpages/membershiplevels.php:512
666
- #: adminpages/reports/login.php:142 adminpages/membershiplevels.php:506
667
- msgid "Name"
668
- msgstr "Jméno"
669
-
670
- #: adminpages/membershiplevels.php:296
671
- msgid "Description"
672
- msgstr "Popis"
673
-
674
- #: adminpages/membershiplevels.php:314
675
- msgid "Confirmation Message"
676
- msgstr "Potvrzovací zpráva"
677
-
678
- #: adminpages/membershiplevels.php:333
679
- msgid "Billing Details"
680
- msgstr "Fakturační detaily"
681
-
682
- #: adminpages/membershiplevels.php:347
683
- msgid "Billing Amount"
684
- msgstr "Množství faktur"
685
-
686
- #: adminpages/membershiplevels.php:349
687
- msgid "per"
688
- msgstr "na"
689
-
690
- #: adminpages/membershiplevels.php:353
691
- msgid "Day(s)"
692
- msgstr "Den(y)"
693
-
694
- #: adminpages/membershiplevels.php:353
695
- msgid "Month(s)"
696
- msgstr "Měsíc(e)"
697
-
698
- #: adminpages/membershiplevels.php:353
699
- msgid "Week(s)"
700
- msgstr "Týden(y)"
701
-
702
- #: adminpages/membershiplevels.php:353
703
- msgid "Year(s)"
704
- msgstr "Rok(y)"
705
-
706
- #: adminpages/membershiplevels.php:364
707
- msgid ""
708
- "Stripe integration currently only supports billing periods of \"Month\" or "
709
- "\"Year\"."
710
- msgstr ""
711
- "Integrace Stripe v současné době podporuje pouze fakturace období \"Month\" "
712
- "or \"Year\"."
713
-
714
- #: adminpages/membershiplevels.php:366
715
- msgid ""
716
- "Braintree integration currently only supports billing periods of \"Month\" "
717
- "or \"Year\"."
718
- msgstr ""
719
- "Integrace Braintree v současné době podporuje pouze fakturace období \"Month"
720
- "\" or \"Year\"."
721
-
722
- #: adminpages/membershiplevels.php:368
723
- msgid ""
724
- "Payflow integration currently only supports billing frequencies of 1 and "
725
- "billing periods of \"Week\", \"Month\" or \"Year\"."
726
- msgstr ""
727
- "Integrace Payflow v současné době podporuje pouze fakturace frekvence 1 a "
728
- "fakturace období \"Week\", \"Month\" nebo \"Year\"."
729
-
730
- #: adminpages/membershiplevels.php:372
731
- msgid ""
732
- "After saving this level, make note of the ID and create a \"Plan\" in your "
733
- "Braintree dashboard with the same settings and the \"Plan ID\" set to "
734
- "<em>pmpro_#</em>, where # is the level ID."
735
- msgstr ""
736
- "Po uložení této úrovně si poznamenejte ID a vytvořte \"Plan\" ve vašem "
737
- "Braintree nástěnce se stejným nastavením a \"Plan ID\" nastavte na "
738
- "<em>pmpro_#</em>, kde # je úroveň ID."
739
-
740
- #: adminpages/membershiplevels.php:372 adminpages/membershiplevels.php:374
741
- #: adminpages/paymentsettings.php:174 adminpages/paymentsettings.php:170
742
- msgid "Note"
743
- msgstr "Poznámka"
744
-
745
- #: adminpages/membershiplevels.php:374
746
- msgid ""
747
- "You will need to create a \"Plan\" in your Braintree dashboard with the same "
748
- "settings and the \"Plan ID\" set to"
749
- msgstr ""
750
- "Budete muset vytvořit \"Plan\" v Braintree nástěnce se stejným nastavením a "
751
- "\"Plan ID\" nastavit na"
752
-
753
- #: adminpages/membershiplevels.php:386
754
- msgid ""
755
- "Stripe integration currently does not support billing limits. You can still "
756
- "set an expiration date below."
757
- msgstr ""
758
- "Integrace Stripe v současné době nepodporuje fakturační limity. Níže můžete "
759
- "nastavit datum vypršení platnosti."
760
-
761
- #: adminpages/membershiplevels.php:398
762
- msgid ""
763
- "2Checkout integration does not support custom trials. You can do one period "
764
- "trials by setting an initial payment different from the billing amount."
765
- msgstr ""
766
- "2Checkout integrace nepodporuje zkušební dobu. Můžete to udělat v jedné "
767
- "zkušební době nastavením počáteční platbu, která se liší od fakturační "
768
- "částky."
769
-
770
- #: adminpages/membershiplevels.php:412 adminpages/membershiplevels.php:406
771
- msgid ""
772
- "Stripe integration currently does not support trial amounts greater than $0."
773
- msgstr ""
774
- "Integrace Stripe v současné době nepodporuje zkušební částky vyšší než 0 Kč."
775
-
776
- #: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:410
777
- msgid ""
778
- "Braintree integration currently does not support trial amounts greater than "
779
- "$0."
780
- msgstr ""
781
- "Integrace Braintree v současné době nepodporuje zkušební částky vyšší než 0 "
782
- "Kč."
783
-
784
- #: adminpages/membershiplevels.php:420 adminpages/membershiplevels.php:414
785
- msgid ""
786
- "Payflow integration currently does not support trial amounts greater than $0."
787
- msgstr ""
788
- "Integrace Payflow v současné době nepodporuje zkušební částky vyšší než 0 Kč."
789
-
790
- #: adminpages/membershiplevels.php:428 adminpages/membershiplevels.php:422
791
- msgid "Other Settings"
792
- msgstr "Další nastavení"
793
-
794
- #: adminpages/membershiplevels.php:432 adminpages/membershiplevels.php:426
795
- msgid "Disable New Signups"
796
- msgstr "Zastavení novích registrací"
797
-
798
- #: adminpages/membershiplevels.php:433 adminpages/membershiplevels.php:427
799
- msgid ""
800
- "Check to hide this level from the membership levels page and disable "
801
- "registration."
802
- msgstr ""
803
- "Podívejte se na skrytí této úrovně na stránce úrovní a zakažte registraci."
804
-
805
- #: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:432
806
- msgid "Check this to set when membership access expires."
807
- msgstr "Zkontrolujte, zda je toto nastaveno, když vyprší přístup k členství."
808
-
809
- #: adminpages/membershiplevels.php:455 adminpages/membershiplevels.php:449
810
- msgid ""
811
- "Set the duration of membership access. Note that the any future payments "
812
- "(recurring subscription, if any) will be cancelled when the membership "
813
- "expires."
814
- msgstr ""
815
- "Nastavte dobu trvání přístupu členství. Všimněte si, že všechny budoucí "
816
- "platby (opakující předplatné, pokud existuje) budou zrušeny, pokud vyprší "
817
- "členství."
818
-
819
- #: adminpages/membershiplevels.php:463 adminpages/membershiplevels.php:457
820
- msgid "Content Settings"
821
- msgstr "Nastavení obsahu"
822
-
823
- #: adminpages/membershiplevels.php:467 adminpages/membershiplevels.php:461
824
- msgid "Categories"
825
- msgstr "Kategorie"
826
-
827
- #: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:490
828
- msgid "Add New Level"
829
- msgstr "Vložit novou úroveň"
830
-
831
- #: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:502
832
- #: adminpages/membershiplevels.php:493 adminpages/membershiplevels.php:496
833
- msgid "Search Levels"
834
- msgstr "Najít úrovně"
835
-
836
- #: adminpages/membershiplevels.php:514 adminpages/membershiplevels.php:508
837
- msgid "Billing Cycle"
838
- msgstr "Cyklus fakturací"
839
-
840
- #: adminpages/membershiplevels.php:515 adminpages/membershiplevels.php:509
841
- msgid "Trial Cycle"
842
- msgstr "Zkušební cyklus"
843
-
844
- #: adminpages/membershiplevels.php:516 pages/confirmation.php:83
845
- #: pages/invoice.php:70 adminpages/membershiplevels.php:510
846
- #: pages/confirmation.php:81 pages/invoice.php:68
847
- msgid "Expiration"
848
- msgstr "Vypršení"
849
-
850
- #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:511
851
- msgid "Allow Signups"
852
- msgstr "Povolit registraci"
853
-
854
- #: adminpages/membershiplevels.php:540 adminpages/membershiplevels.php:534
855
- msgid "FREE"
856
- msgstr "ZDARMA"
857
-
858
- #: adminpages/membershiplevels.php:549 adminpages/membershiplevels.php:543
859
- msgid "every"
860
- msgstr "každý"
861
-
862
- #: adminpages/membershiplevels.php:551 adminpages/membershiplevels.php:559
863
- #: adminpages/reports/memberships.php:304
864
- #: adminpages/reports/memberships.php:315 adminpages/reports/sales.php:204
865
- #: adminpages/reports/sales.php:215 adminpages/membershiplevels.php:545
866
- #: adminpages/membershiplevels.php:553 adminpages/reports/sales.php:195
867
- #: adminpages/reports/sales.php:206
868
- msgid "for"
869
- msgstr "pro"
870
-
871
- #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:560
872
- msgid "After"
873
- msgstr "Po"
874
-
875
- #: adminpages/membershiplevels.php:571 adminpages/orders.php:661
876
- #: adminpages/membershiplevels.php:565
877
- msgid "copy"
878
- msgstr "kopie"
879
-
880
- #: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:566
881
- #, php-format
882
- msgid ""
883
- "Are you sure you want to delete membership level %s? All subscriptions will "
884
- "be cancelled."
885
- msgstr ""
886
- "Jste si jisti, že chcete smazat úrovně členství % s? Všechny odběry budou "
887
- "zrušeny."
888
-
889
- #: adminpages/memberslist.php:25 includes/adminpages.php:15
890
- #: includes/adminpages.php:74
891
- msgid "Members List"
892
- msgstr "Seznam členů"
893
-
894
- #: adminpages/memberslist.php:26 adminpages/orders.php:522
895
- msgid "Export to CSV"
896
- msgstr "Export do CSV"
897
-
898
- #: adminpages/memberslist.php:30 adminpages/reports/login.php:65
899
- #: adminpages/reports/memberships.php:292 adminpages/reports/sales.php:194
900
- #: adminpages/reports/sales.php:185
901
- msgid "Show"
902
- msgstr "Ukaž"
903
-
904
- #: adminpages/memberslist.php:32 adminpages/reports/login.php:67
905
- #: adminpages/reports/memberships.php:317 adminpages/reports/sales.php:217
906
- #: adminpages/reports/sales.php:208
907
- msgid "All Levels"
908
- msgstr "Všechny úrovně"
909
-
910
- #: adminpages/memberslist.php:46 adminpages/memberslist.php:49
911
- msgid "Search Members"
912
- msgstr "Prohledat členy"
913
-
914
- #: adminpages/memberslist.php:103
915
- #, php-format
916
- msgid "%d members found."
917
- msgstr "%d členů nalezeno"
918
-
919
- #: adminpages/memberslist.php:112 pages/account.php:51 pages/checkout.php:171
920
- #: pages/checkout.php:168
921
- msgid "Username"
922
- msgstr "Uživatelské jméno"
923
-
924
- #: adminpages/memberslist.php:113
925
- msgid "First&nbsp;Name"
926
- msgstr "Jméno"
927
-
928
- #: adminpages/memberslist.php:114
929
- msgid "Last&nbsp;Name"
930
- msgstr "Příjmení"
931
-
932
- #: adminpages/memberslist.php:117 pages/account.php:90 pages/billing.php:58
933
- #: pages/checkout.php:321 pages/confirmation.php:61 pages/invoice.php:48
934
- #: pages/checkout.php:314 pages/confirmation.php:59 pages/invoice.php:46
935
- msgid "Billing Address"
936
- msgstr "Fakturační adresa"
937
-
938
- #: adminpages/memberslist.php:118 adminpages/pagesettings.php:51
939
- #: adminpages/reports/login.php:143
940
- #: classes/gateways/class.pmprogateway_authorizenet.php:187
941
- msgid "Membership"
942
- msgstr "Členství"
943
-
944
- #: adminpages/memberslist.php:119
945
- msgid "Fee"
946
- msgstr "Odměna"
947
-
948
- #: adminpages/memberslist.php:120 adminpages/reports/login.php:144
949
- msgid "Joined"
950
- msgstr "Připojil"
951
-
952
- #: adminpages/memberslist.php:184
953
- msgid "Never"
954
- msgstr "Nikdy"
955
-
956
- #: adminpages/memberslist.php:195 adminpages/reports/login.php:210
957
- msgid "No members found."
958
- msgstr "Žádní členové nebyly nalezeni"
959
-
960
- #: adminpages/memberslist.php:195 adminpages/reports/login.php:210
961
- msgid "Search all levels"
962
- msgstr "Prohledat všechny úrovně"
963
-
964
- #: adminpages/orders.php:26
965
- msgid "Order deleted successfully."
966
- msgstr "Objednávka byla úspěšně smazána."
967
-
968
- #: adminpages/orders.php:31
969
- msgid "Error deleting order."
970
- msgstr "Chyba při mazání objednávky"
971
-
972
- #: adminpages/orders.php:119
973
- msgid "Order saved successfully."
974
- msgstr "Objednávka byla úspěšne uložena."
975
-
976
- #: adminpages/orders.php:124
977
- msgid "Error updating order timestamp."
978
- msgstr "Chyba při aktualizaci časového razítka"
979
-
980
- #: adminpages/orders.php:130
981
- msgid "Error saving order."
982
- msgstr "Chyba při ukládání zboží"
983
-
984
- #: adminpages/orders.php:195
985
- msgid "Order"
986
- msgstr "Objednávka"
987
-
988
- #: adminpages/orders.php:197
989
- msgid "New Order"
990
- msgstr "Nová objednávka"
991
-
992
- #: adminpages/orders.php:220
993
- msgid "Randomly generated for you."
994
- msgstr "Náhodně generované pro Vás."
995
-
996
- #: adminpages/orders.php:225
997
- msgid "User ID"
998
- msgstr "Uživatelské ID"
999
-
1000
- #: adminpages/orders.php:234
1001
- msgid "Membership Level ID"
1002
- msgstr "ID členské úrovně"
1003
-
1004
- #: adminpages/orders.php:243
1005
- msgid "Billing Name"
1006
- msgstr "Fakturační adresa"
1007
-
1008
- #: adminpages/orders.php:251
1009
- msgid "Billing Street"
1010
- msgstr "Fakturační ulice"
1011
-
1012
- #: adminpages/orders.php:258
1013
- msgid "Billing City"
1014
- msgstr "Fakturační město"
1015
-
1016
- #: adminpages/orders.php:265
1017
- msgid "Billing State"
1018
- msgstr "Fakturační stát"
1019
-
1020
- #: adminpages/orders.php:272
1021
- msgid "Billing Postal Code"
1022
- msgstr "Fakturační PSČ"
1023
-
1024
- #: adminpages/orders.php:279
1025
- msgid "Billing Country"
1026
- msgstr "Fakturační země"
1027
-
1028
- #: adminpages/orders.php:287
1029
- msgid "Billing Phone"
1030
- msgstr "Fakturační telefon"
1031
-
1032
- #: adminpages/orders.php:296
1033
- msgid "Sub Total"
1034
- msgstr "Mezisoučet"
1035
-
1036
- #: adminpages/orders.php:304 pages/invoice.php:80 pages/invoice.php:78
1037
- msgid "Tax"
1038
- msgstr "Daň"
1039
-
1040
- #: adminpages/orders.php:312
1041
- msgid "Coupon Amount"
1042
- msgstr "Množství kupónu"
1043
-
1044
- #: adminpages/orders.php:320 adminpages/orders.php:602 pages/invoice.php:84
1045
- #: pages/invoice.php:82
1046
- msgid "Total"
1047
- msgstr "Celkem"
1048
-
1049
- #: adminpages/orders.php:325
1050
- msgid "Should be subtotal + tax - couponamount."
1051
- msgstr "Měl by obsahovat součet + daň - množství kupónu"
1052
-
1053
- #: adminpages/orders.php:330
1054
- msgid "Payment Type"
1055
- msgstr "Typ platby"
1056
-
1057
- #: adminpages/orders.php:335
1058
- msgid "e.g. PayPal Express, PayPal Standard, Credit Card."
1059
- msgstr "Například PayPal Express, PayPal Standard, Kreditní karta."
1060
-
1061
- #: adminpages/orders.php:339 pages/billing.php:234 pages/checkout.php:517
1062
- #: pages/checkout.php:510
1063
- msgid "Card Type"
1064
- msgstr "Typ karty"
1065
-
1066
- #: adminpages/orders.php:344
1067
- msgid "e.g. Visa, MasterCard, AMEX, etc"
1068
- msgstr "Například Visa, MasterCard, AMEX, atd."
1069
-
1070
- #: adminpages/orders.php:348 adminpages/paymentsettings.php:347
1071
- msgid "Account Number"
1072
- msgstr "Číslo účtu"
1073
-
1074
- #: adminpages/orders.php:353
1075
- msgid "Obscure all but last 4 digits."
1076
- msgstr "Vše nejasné, ale poslední 4 čísla"
1077
-
1078
- #: adminpages/orders.php:358
1079
- msgid "Expiration Month"
1080
- msgstr "Datum expirace"
1081
-
1082
- #: adminpages/orders.php:365
1083
- msgid "Expiration Year"
1084
- msgstr "Rok expirace"
1085
-
1086
- #: adminpages/orders.php:373 adminpages/orders.php:606
1087
- msgid "Status"
1088
- msgstr "Postavení"
1089
-
1090
- #: adminpages/orders.php:394 adminpages/orders.php:604
1091
- msgid "Gateway"
1092
- msgstr "Brána"
1093
-
1094
- #: adminpages/orders.php:398
1095
- msgid "Testing Only"
1096
- msgstr "Pouze testování"
1097
-
1098
- #: adminpages/orders.php:399 adminpages/paymentsettings.php:159
1099
- #: adminpages/paymentsettings.php:157
1100
- msgid "Pay by Check"
1101
- msgstr "Platit kupónem"
1102
-
1103
- #: adminpages/orders.php:411 adminpages/paymentsettings.php:179
1104
- #: adminpages/paymentsettings.php:175
1105
- msgid "Gateway Environment"
1106
- msgstr "Brána životního prostředí"
1107
-
1108
- #: adminpages/orders.php:415 adminpages/paymentsettings.php:183
1109
- #: adminpages/paymentsettings.php:179
1110
- msgid "Sandbox/Testing"
1111
- msgstr "Bezpečnostní mechanismus / testování"
1112
-
1113
- #: adminpages/orders.php:416 adminpages/paymentsettings.php:184
1114
- #: adminpages/paymentsettings.php:180
1115
- msgid "Live/Production"
1116
- msgstr "Naživo / produkce"
1117
-
1118
- #: adminpages/orders.php:423
1119
- msgid "Payment Transaction ID"
1120
- msgstr "Číslo platební transakce"
1121
-
1122
- #: adminpages/orders.php:428
1123
- msgid "Generated by the gateway. Useful to cross reference orders."
1124
- msgstr "Generováno bránou. Užitečný pro spárování referenčních zakázek."
1125
-
1126
- #: adminpages/orders.php:432
1127
- msgid "Subscription Transaction ID"
1128
- msgstr "Číslo předplatného"
1129
-
1130
- #: adminpages/orders.php:437
1131
- msgid "Generated by the gateway. Useful to cross reference subscriptions."
1132
- msgstr "Generováno bránou. Užitečný pro spárování referenčního předplatného."
1133
-
1134
- #: adminpages/orders.php:442 adminpages/orders.php:607 pages/invoice.php:107
1135
- #: pages/invoice.php:105
1136
- msgid "Date"
1137
- msgstr "Datum"
1138
-
1139
- #: adminpages/orders.php:477
1140
- msgid "Affiliate ID"
1141
- msgstr "Partnerské ID"
1142
-
1143
- #: adminpages/orders.php:485
1144
- msgid "Affiliate SubID"
1145
- msgstr "Partnerské subID"
1146
-
1147
- #: adminpages/orders.php:495
1148
- msgid "Notes"
1149
- msgstr "Poznámky"
1150
-
1151
- #: adminpages/orders.php:510
1152
- msgid "Save Order"
1153
- msgstr "Uložit"
1154
-
1155
- #: adminpages/orders.php:511 pages/billing.php:295
1156
- msgid "Cancel"
1157
- msgstr "Zrušit"
1158
-
1159
- #: adminpages/orders.php:520 includes/adminpages.php:17
1160
- #: includes/adminpages.php:84
1161
- msgid "Orders"
1162
- msgstr "Objednávky"
1163
-
1164
- #: adminpages/orders.php:521
1165
- msgid "Add New Order"
1166
- msgstr "Vložit novou objednávku"
1167
-
1168
- #: adminpages/orders.php:535 adminpages/orders.php:538
1169
- msgid "Search Orders"
1170
- msgstr "Najít objednávku"
1171
-
1172
- #: adminpages/orders.php:590
1173
- #, php-format
1174
- msgid "%d orders found."
1175
- msgstr "%d objednávek nalezeno."
1176
-
1177
- #: adminpages/orders.php:599 adminpages/paymentsettings.php:215
1178
- #: adminpages/reports/login.php:141 adminpages/paymentsettings.php:211
1179
- msgid "User"
1180
- msgstr "Uživatel"
1181
-
1182
- #: adminpages/orders.php:601 includes/profile.php:27 pages/checkout.php:33
1183
- #: pages/confirmation.php:47 pages/confirmation.php:64
1184
- #: pages/confirmation.php:105 pages/invoice.php:28 pages/invoice.php:51
1185
- #: includes/profile.php:25 pages/checkout.php:34 pages/confirmation.php:46
1186
- #: pages/confirmation.php:62 pages/confirmation.php:103 pages/invoice.php:27
1187
- #: pages/invoice.php:49
1188
- msgid "Membership Level"
1189
- msgstr "Úroveň členství"
1190
-
1191
- #: adminpages/orders.php:603 adminpages/orders.php:651
1192
- msgid "Payment"
1193
- msgstr "Platba"
1194
-
1195
- #: adminpages/orders.php:605
1196
- msgid "Transaction IDs"
1197
- msgstr "Číslo transakce"
1198
-
1199
- #: adminpages/orders.php:630
1200
- msgid "deleted"
1201
- msgstr "smazáno"
1202
-
1203
- #: adminpages/orders.php:653
1204
- msgid "Subscription"
1205
- msgstr "Předplatné"
1206
-
1207
- #: adminpages/orders.php:664
1208
- #, php-format
1209
- msgid ""
1210
- "Deleting orders is permanent and can affect active users. Are you sure you "
1211
- "want to delete order %s?"
1212
- msgstr ""
1213
- "Vymazání objednávek je trvalé a může to mít vliv na aktivní uživatele. Jste "
1214
- "si jisti, že chcete smazat objednávky % s?"
1215
-
1216
- #: adminpages/orders.php:674
1217
- msgid "No orders found."
1218
- msgstr "žádné nalezené objednávky"
1219
-
1220
- #: adminpages/pagesettings.php:83
1221
- msgid "The following pages have been created for you"
1222
- msgstr "Následující stránky budou vytvořeny pro Vás"
1223
-
1224
- #: adminpages/pagesettings.php:98
1225
- msgid ""
1226
- "Manage the WordPress pages assigned to each required Paid Memberships Pro "
1227
- "page."
1228
- msgstr ""
1229
- "Správa WordPress stránky přiřazené ke každé požadované, placené Memberships "
1230
- "Pro page."
1231
-
1232
- #: adminpages/pagesettings.php:104
1233
- msgid ""
1234
- "Assign the WordPress pages for each required Paid Memberships Pro page or"
1235
- msgstr "Přiřaďte Wordpress stránku pro každé požadované placené členství nebo,"
1236
-
1237
- #: adminpages/pagesettings.php:104
1238
- msgid "click here to let us generate them for you"
1239
- msgstr "klikněte zde a my vám ho vytvoříme"
1240
-
1241
- #: adminpages/pagesettings.php:112
1242
- msgid "Account Page"
1243
- msgstr "Stránka účtu"
1244
-
1245
- #: adminpages/pagesettings.php:119 adminpages/pagesettings.php:134
1246
- #: adminpages/pagesettings.php:149 adminpages/pagesettings.php:165
1247
- #: adminpages/pagesettings.php:181 adminpages/pagesettings.php:197
1248
- #: adminpages/pagesettings.php:213 adminpages/pagesettings.php:132
1249
- #: adminpages/pagesettings.php:145 adminpages/pagesettings.php:159
1250
- #: adminpages/pagesettings.php:173 adminpages/pagesettings.php:187
1251
- #: adminpages/pagesettings.php:201
1252
- msgid "edit page"
1253
- msgstr "upravit stránku"
1254
-
1255
- #: adminpages/pagesettings.php:121 adminpages/pagesettings.php:136
1256
- #: adminpages/pagesettings.php:151 adminpages/pagesettings.php:167
1257
- #: adminpages/pagesettings.php:183 adminpages/pagesettings.php:199
1258
- #: adminpages/pagesettings.php:215
1259
- msgid "view page"
1260
- msgstr "zobrazit stránku"
1261
-
1262
- #: adminpages/pagesettings.php:123 adminpages/pagesettings.php:138
1263
- #: adminpages/pagesettings.php:153 adminpages/pagesettings.php:169
1264
- #: adminpages/pagesettings.php:185 adminpages/pagesettings.php:201
1265
- #: adminpages/pagesettings.php:217 adminpages/pagesettings.php:121
1266
- #: adminpages/pagesettings.php:134 adminpages/pagesettings.php:147
1267
- #: adminpages/pagesettings.php:161 adminpages/pagesettings.php:175
1268
- #: adminpages/pagesettings.php:189 adminpages/pagesettings.php:203
1269
- msgid "Include the shortcode"
1270
- msgstr "Vložit shortcode"
1271
-
1272
- #: adminpages/pagesettings.php:127 adminpages/pagesettings.php:125
1273
- msgid "Billing Information Page"
1274
- msgstr "Stránka fakturačních údajů"
1275
-
1276
- #: adminpages/pagesettings.php:142 adminpages/pagesettings.php:138
1277
- msgid "Cancel Page"
1278
- msgstr "Zrušit stránku"
1279
-
1280
- #: adminpages/pagesettings.php:158 adminpages/pagesettings.php:152
1281
- msgid "Checkout Page"
1282
- msgstr "Pokladna"
1283
-
1284
- #: adminpages/pagesettings.php:174 adminpages/pagesettings.php:166
1285
- msgid "Confirmation Page"
1286
- msgstr "Potvrzovací stránka"
1287
-
1288
- #: adminpages/pagesettings.php:190 adminpages/pagesettings.php:180
1289
- msgid "Invoice Page"
1290
- msgstr "Stránka fakturací"
1291
-
1292
- #: adminpages/pagesettings.php:206 adminpages/pagesettings.php:194
1293
- msgid "Levels Page"
1294
- msgstr "Stránka úrovní"
1295
-
1296
- #: adminpages/paymentsettings.php:77 adminpages/paymentsettings.php:82
1297
- msgid "Your payment settings have been updated."
1298
- msgstr "Vaše nastavení plateb bylo úspěšně aktualizováno"
1299
-
1300
- #: adminpages/paymentsettings.php:146 adminpages/paymentsettings.php:154
1301
- #: adminpages/paymentsettings.php:144 adminpages/paymentsettings.php:152
1302
- msgid "Payment Gateway"
1303
- msgstr "Platební brána"
1304
-
1305
- #: adminpages/paymentsettings.php:146 adminpages/paymentsettings.php:144
1306
- msgid "SSL Settings"
1307
- msgstr "Nastavení SSL"
1308
-
1309
- #: adminpages/paymentsettings.php:174
1310
- msgid ""
1311
- "This gateway option is in beta. Some functionality may not be available. "
1312
- "Please contact Paid Memberships Pro with any issues you run into. "
1313
- "<strong>Please be sure to upgrade Paid Memberships Pro to the latest "
1314
- "versions when available.</strong>"
1315
- msgstr ""
1316
- "Tato platební brána je v beta verzi. Nekteré funkce nemusí být k dispozici. "
1317
- "Obraťte se prosím na Memberships Pro s případnými otázkami, které poté "
1318
- "můžete konzultovat. <strong> Prosím ujistěte se, že jste upgradovali "
1319
- "Memberships Pro na nejnovější verzi, která je k dispozici. </ strong>"
1320
-
1321
- #: adminpages/paymentsettings.php:199 adminpages/paymentsettings.php:195
1322
- msgid "Partner"
1323
- msgstr "Partner"
1324
-
1325
- #: adminpages/paymentsettings.php:207 adminpages/paymentsettings.php:203
1326
- msgid "Vendor"
1327
- msgstr "Prodejce"
1328
-
1329
- #: adminpages/paymentsettings.php:223 pages/checkout.php:180
1330
- #: adminpages/paymentsettings.php:219 pages/checkout.php:177
1331
- msgid "Password"
1332
- msgstr "Heslo"
1333
-
1334
- #: adminpages/paymentsettings.php:231 adminpages/paymentsettings.php:227
1335
- msgid "Gateway Account Email"
1336
- msgstr "E-mail k bráně účtu"
1337
-
1338
- #: adminpages/paymentsettings.php:239 adminpages/paymentsettings.php:331
1339
- #: adminpages/paymentsettings.php:235
1340
- msgid "API Username"
1341
- msgstr "API uživatelské jméno"
1342
-
1343
- #: adminpages/paymentsettings.php:247 adminpages/paymentsettings.php:339
1344
- #: adminpages/paymentsettings.php:243
1345
- msgid "API Password"
1346
- msgstr "API heslo"
1347
-
1348
- #: adminpages/paymentsettings.php:255 adminpages/paymentsettings.php:251
1349
- msgid "API Signature"
1350
- msgstr "API podpis"
1351
-
1352
- #: adminpages/paymentsettings.php:264 adminpages/paymentsettings.php:260
1353
- msgid "Login Name"
1354
- msgstr "Přihlašovací jméno"
1355
-
1356
- #: adminpages/paymentsettings.php:272 adminpages/paymentsettings.php:268
1357
- msgid "Transaction Key"
1358
- msgstr "Transakční klíč"
1359
-
1360
- #: adminpages/paymentsettings.php:281 adminpages/paymentsettings.php:277
1361
- msgid "Secret Key"
1362
- msgstr "Tajný klíč"
1363
-
1364
- #: adminpages/paymentsettings.php:289 adminpages/paymentsettings.php:285
1365
- msgid "Publishable Key"
1366
- msgstr "Nezávadný klíč"
1367
-
1368
- #: adminpages/paymentsettings.php:298 adminpages/paymentsettings.php:364
1369
- #: adminpages/paymentsettings.php:294
1370
- msgid "Merchant ID"
1371
- msgstr "ID obchodníka"
1372
-
1373
- #: adminpages/paymentsettings.php:306 adminpages/paymentsettings.php:302
1374
- msgid "Public Key"
1375
- msgstr "Veřejný klíč"
1376
-
1377
- #: adminpages/paymentsettings.php:314 adminpages/paymentsettings.php:310
1378
- msgid "Private Key"
1379
- msgstr "Osobní klíč"
1380
-
1381
- #: adminpages/paymentsettings.php:322 adminpages/paymentsettings.php:318
1382
- msgid "Client-Side Encryption Key"
1383
- msgstr "Klientův dešifrovací klíč"
1384
-
1385
- #: adminpages/paymentsettings.php:355
1386
- msgid "Secret Word"
1387
- msgstr "Tajné slovo"
1388
-
1389
- #: adminpages/paymentsettings.php:372
1390
- msgid "Transaction Security Key"
1391
- msgstr "Bezpečnostní klíč transakce"
1392
-
1393
- #: adminpages/paymentsettings.php:381 adminpages/paymentsettings.php:327
1394
- #: adminpages/paymentsettings.php:337 adminpages/paymentsettings.php:356
1395
- msgid "Currency"
1396
- msgstr "Měna"
1397
-
1398
- #: adminpages/paymentsettings.php:401 adminpages/paymentsettings.php:375
1399
- msgid "Accepted Credit Card Types"
1400
- msgstr "Akceptujeme tyto platební karty"
1401
-
1402
- #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:389
1403
- msgid "Instructions"
1404
- msgstr "Instrukce"
1405
-
1406
- #: adminpages/paymentsettings.php:419 adminpages/paymentsettings.php:393
1407
- msgid ""
1408
- "Who to write the check out to. Where to mail it. Shown on checkout, "
1409
- "confirmation, and invoice pages."
1410
- msgstr ""
1411
- "Kdo napsal šek. Kde je e-mail. Zobrazení pokladny, potvrzení a fakturační "
1412
- "stránky."
1413
-
1414
- #: adminpages/paymentsettings.php:425
1415
- msgid "Show Billing Address Fields"
1416
- msgstr "Ukázat pole - Fakturační údaje"
1417
-
1418
- #: adminpages/paymentsettings.php:432
1419
- msgid ""
1420
- "Stripe doesn't require billing address fields. Choose 'No' to hide them on "
1421
- "the checkout page."
1422
- msgstr ""
1423
- "Stripe nevyžaduje pole fakturační adresa. Zvolte \"Ne\" pro skování na "
1424
- "platební stránce."
1425
-
1426
- #: adminpages/paymentsettings.php:438 adminpages/paymentsettings.php:398
1427
- msgid "Sales Tax"
1428
- msgstr "Daň z prodeje"
1429
-
1430
- #: adminpages/paymentsettings.php:438 pages/billing.php:78
1431
- #: adminpages/paymentsettings.php:398
1432
- msgid "optional"
1433
- msgstr "volitelné"
1434
-
1435
- #: adminpages/paymentsettings.php:441 adminpages/paymentsettings.php:401
1436
- msgid "Tax State"
1437
- msgstr "DPH"
1438
-
1439
- #: adminpages/paymentsettings.php:442 adminpages/paymentsettings.php:402
1440
- msgid "abbreviation, e.g. \"PA\""
1441
- msgstr "zkratka, např. \"PA\""
1442
-
1443
- #: adminpages/paymentsettings.php:444 adminpages/paymentsettings.php:404
1444
- msgid "decimal, e.g. \"0.06\""
1445
- msgstr "desetinný, např. \"0.06\""
1446
-
1447
- #: adminpages/paymentsettings.php:445 adminpages/paymentsettings.php:405
1448
- msgid ""
1449
- "If values are given, tax will be applied for any members ordering from the "
1450
- "selected state. For more complex tax rules, use the \"pmpro_tax\" filter."
1451
- msgstr ""
1452
- "Jestliže máte nastaveny hodnoty, daň bude použita pro všechny členy z "
1453
- "určitého státu, kteří si objednají službu. U složitějších daňových pravidel, "
1454
- "použijte \"pmpro_tax \" filtr."
1455
-
1456
- #: adminpages/paymentsettings.php:450
1457
- msgid "Force SSL"
1458
- msgstr "Silný SSL"
1459
-
1460
- #: adminpages/paymentsettings.php:456
1461
- msgid "Yes (with JavaScript redirects)"
1462
- msgstr "Ano (s JavaScript přesměrováním)"
1463
-
1464
- #: adminpages/paymentsettings.php:463 adminpages/paymentsettings.php:430
1465
- msgid "SSL Seal Code"
1466
- msgstr "SSL Seal Code"
1467
-
1468
- #: adminpages/paymentsettings.php:471 adminpages/paymentsettings.php:438
1469
- msgid "HTTPS Nuclear Option"
1470
- msgstr "nastavení HTTPS"
1471
-
1472
- #: adminpages/paymentsettings.php:474 adminpages/paymentsettings.php:441
1473
- msgid ""
1474
- "Use the \"Nuclear Option\" to use secure (HTTPS) URLs on your secure pages. "
1475
- "Check this if you are using SSL and have warnings on your checkout pages."
1476
- msgstr ""
1477
- "Použijte \"Nuclear Option\" k použití zabezpečené (HTTPS) URL na vaše "
1478
- "zabezpečené stránky. Podívejte se na to, zda používáte SSL a máte upozornění "
1479
- "na vašich platebních stránkách."
1480
-
1481
- #: adminpages/paymentsettings.php:479 adminpages/paymentsettings.php:446
1482
- msgid "IPN Handler URL"
1483
- msgstr "IPN Handler URL"
1484
-
1485
- #: adminpages/paymentsettings.php:482 adminpages/paymentsettings.php:449
1486
- msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to "
1487
- msgstr ""
1488
- "Chcete-li plně integrovat PayPal, ujistěte se že jste nastavily IPN Handler "
1489
- "URL"
1490
-
1491
- #: adminpages/paymentsettings.php:487
1492
- msgid "TwoCheckout INS URL"
1493
- msgstr "TwoCheckout INS URL"
1494
-
1495
- #: adminpages/paymentsettings.php:490
1496
- msgid ""
1497
- "To fully integrate with 2Checkout, be sure to set your 2Checkout INS URL "
1498
- msgstr ""
1499
- "Chcete-li plně integrovat 2Checkout, ujistěte se že jste nastavily "
1500
- "2Checkout IPN Handler URL"
1501
-
1502
- #: adminpages/paymentsettings.php:495 adminpages/paymentsettings.php:454
1503
- msgid "Silent Post URL"
1504
- msgstr "Tichý příspěvek URL"
1505
-
1506
- #: adminpages/paymentsettings.php:498 adminpages/paymentsettings.php:457
1507
- msgid ""
1508
- "To fully integrate with Authorize.net, be sure to set your Silent Post URL to"
1509
- msgstr ""
1510
- "Chcete-li plně integrovat s Authorize.net, ujistěte se, že máte správně "
1511
- "nastaven Silent Post URL na"
1512
-
1513
- #: adminpages/paymentsettings.php:503 adminpages/paymentsettings.php:511
1514
- #: adminpages/paymentsettings.php:462 adminpages/paymentsettings.php:470
1515
- msgid "Web Hook URL"
1516
- msgstr "Web Hook URL"
1517
-
1518
- #: adminpages/paymentsettings.php:506 adminpages/paymentsettings.php:465
1519
- msgid "To fully integrate with Stripe, be sure to set your Web Hook URL to"
1520
- msgstr ""
1521
- "Chcete-li plně integrovat s Stripe, ujistěte se, že máte správně nastaven "
1522
- "Web Hook URL na"
1523
-
1524
- #: adminpages/paymentsettings.php:515 adminpages/paymentsettings.php:474
1525
- msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to"
1526
- msgstr ""
1527
- "Chcete-li plně integrovat s Braintree, ujistěte se, že máte správně nastaven "
1528
- "Web Hook URL na"
1529
-
1530
- #: adminpages/reports.php:37 adminpages/reports.php:26
1531
- msgid "Details"
1532
- msgstr "Detaily"
1533
-
1534
- #: adminpages/reports/login.php:16
1535
- msgid "Visits, Views, and Logins"
1536
- msgstr "Návštěvy, zobrazení a přihlášení"
1537
-
1538
- #: adminpages/reports/login.php:26
1539
- msgid "Visits Today"
1540
- msgstr "Dnešní návštěvy"
1541
-
1542
- #: adminpages/reports/login.php:27 adminpages/reports/login.php:147
1543
- msgid "Visits This Month"
1544
- msgstr "Návštěvy tento měsíc"
1545
-
1546
- #: adminpages/reports/login.php:28
1547
- msgid "Visits All Time"
1548
- msgstr "Celková návštěvnost"
1549
-
1550
- #: adminpages/reports/login.php:31
1551
- msgid "Views Today"
1552
- msgstr "Dnešní zobrazení"
1553
-
1554
- #: adminpages/reports/login.php:32 adminpages/reports/login.php:149
1555
- msgid "Views This Month"
1556
- msgstr "Zobrazeno tento měsíc"
1557
-
1558
- #: adminpages/reports/login.php:33
1559
- msgid "Views All Time"
1560
- msgstr "Zobrazeno celkem"
1561
-
1562
- #: adminpages/reports/login.php:36
1563
- msgid "Logins Today"
1564
- msgstr "Přihlášeno dnes"
1565
-
1566
- #: adminpages/reports/login.php:37 adminpages/reports/login.php:152
1567
- msgid "Logins This Month"
1568
- msgstr "Přihlášeno tento měsíc"
1569
-
1570
- #: adminpages/reports/login.php:38
1571
- msgid "Logins All Time"
1572
- msgstr "Přihlášeno celkem"
1573
-
1574
- #: adminpages/reports/login.php:61
1575
- msgid "Visits, Views, and Logins Report"
1576
- msgstr "Zprávy z návštěv, zobrazení a přihlášení"
1577
-
1578
- #: adminpages/reports/login.php:66
1579
- msgid "All Users"
1580
- msgstr "Všichni uživatelé"
1581
-
1582
- #: adminpages/reports/login.php:146
1583
- msgid "Last Visit"
1584
- msgstr "Poslední návštěva"
1585
-
1586
- #: adminpages/reports/login.php:148
1587
- msgid "Total Visits"
1588
- msgstr "Návštěv celkem"
1589
-
1590
- #: adminpages/reports/login.php:150
1591
- msgid "Total Views"
1592
- msgstr "Zobrazeno celkem"
1593
-
1594
- #: adminpages/reports/login.php:151
1595
- msgid "Last Login"
1596
- msgstr "Poslední přihlášení"
1597
-
1598
- #: adminpages/reports/login.php:153
1599
- msgid "Total Logins"
1600
- msgstr "Přihlášení celkem"
1601
-
1602
- #: adminpages/reports/memberships.php:18
1603
- #: adminpages/reports/memberships.php:288
1604
- msgid "Membership Stats"
1605
- msgstr "Členská statistika"
1606
-
1607
- #: adminpages/reports/memberships.php:294 adminpages/reports/sales.php:196
1608
- #: adminpages/reports/sales.php:187
1609
- msgid "Daily"
1610
- msgstr "Denně"
1611
-
1612
- #: adminpages/reports/memberships.php:295 adminpages/reports/sales.php:197
1613
- #: adminpages/reports/sales.php:188
1614
- msgid "Monthly"
1615
- msgstr "Měsíčně"
1616
-
1617
- #: adminpages/reports/memberships.php:296 adminpages/reports/sales.php:198
1618
- #: adminpages/reports/sales.php:189
1619
- msgid "Annual"
1620
- msgstr "Ročně"
1621
-
1622
- #: adminpages/reports/memberships.php:299
1623
- msgid "Signups vs. Cancellations"
1624
- msgstr "Registrace vs. storna"
1625
-
1626
- #: adminpages/reports/memberships.php:331 adminpages/reports/sales.php:231
1627
- #: adminpages/reports/sales.php:222
1628
- msgid "Generate Report"
1629
- msgstr "Vytvořit zprávu"
1630
-
1631
- #: adminpages/reports/sales.php:18
1632
- msgid "Sales and Revenue (Testing/Sandbox)"
1633
- msgstr "Prodeje a výnosy (testování / bezpečnostní mechanismus)"
1634
-
1635
- #: adminpages/reports/sales.php:20 adminpages/reports/sales.php:189
1636
- #: adminpages/reports/sales.php:180
1637
- msgid "Sales and Revenue"
1638
- msgstr "Prodeje a příjmy"
1639
-
1640
- #: adminpages/reports/sales.php:201 adminpages/reports/sales.php:192
1641
- msgid "Revenue"
1642
- msgstr "Příjmy"
1643
-
1644
- #: adminpages/reports/sales.php:202 adminpages/reports/sales.php:193
1645
- msgid "Sales"
1646
- msgstr "Prodeje"
1647
-
1648
- #: classes/class.pmproemail.php:37
1649
- #, php-format
1650
- msgid "An Email From %s"
1651
- msgstr "E-mail od %s"
1652
-
1653
- #: classes/class.pmproemail.php:120
1654
- #, php-format
1655
- msgid "Your membership at %s has been CANCELLED"
1656
- msgstr "Vaše členství na %s bylo ZRUŠENO"
1657
-
1658
- #: classes/class.pmproemail.php:142
1659
- #, php-format
1660
- msgid "Membership for %s at %s has been CANCELLED"
1661
- msgstr "Členství pro %s na %s bylo ZRUŠENO"
1662
-
1663
- #: classes/class.pmproemail.php:173 classes/class.pmproemail.php:172
1664
- #, php-format
1665
- msgid "Your membership confirmation for %s"
1666
- msgstr "Vaše členství potvzeno do %s"
1667
-
1668
- #: classes/class.pmproemail.php:218 classes/class.pmproemail.php:227
1669
- #: classes/class.pmproemail.php:236 classes/class.pmproemail.php:307
1670
- #: classes/class.pmproemail.php:316 classes/class.pmproemail.php:580
1671
- #: pages/checkout.php:66 pages/checkout.php:76 pages/checkout.php:573
1672
- #: pages/confirmation.php:52 pages/invoice.php:33
1673
- #: classes/class.pmproemail.php:216 classes/class.pmproemail.php:225
1674
- #: classes/class.pmproemail.php:234 classes/class.pmproemail.php:304
1675
- #: classes/class.pmproemail.php:313 classes/class.pmproemail.php:532
1676
- #: pages/checkout.php:67 pages/checkout.php:77 pages/checkout.php:566
1677
- #: pages/confirmation.php:51 pages/invoice.php:32
1678
- msgid "Discount Code"
1679
- msgstr "Slevový kód"
1680
-
1681
- #: classes/class.pmproemail.php:243 classes/class.pmproemail.php:328
1682
- #: classes/class.pmproemail.php:586 classes/class.pmproemail.php:241
1683
- #: classes/class.pmproemail.php:325 classes/class.pmproemail.php:538
1684
- #, php-format
1685
- msgid "This membership will expire on %s."
1686
- msgstr "Toto členství vyprší %s."
1687
-
1688
- #: classes/class.pmproemail.php:265 classes/class.pmproemail.php:263
1689
- #, php-format
1690
- msgid "Member Checkout for %s at %s"
1691
- msgstr "Členská platba pro% s na% s"
1692
-
1693
- #: classes/class.pmproemail.php:345 classes/class.pmproemail.php:342
1694
- #, php-format
1695
- msgid "Your billing information has been udpated at %s"
1696
- msgstr "Vaše fakturační údaje byly aktualizovány na %s"
1697
-
1698
- #: classes/class.pmproemail.php:390 classes/class.pmproemail.php:386
1699
- #, php-format
1700
- msgid "Billing information has been udpated for %s at %s"
1701
- msgstr "Fakturační údaje byly aktualizovány z %s na %s"
1702
-
1703
- #: classes/class.pmproemail.php:430 classes/class.pmproemail.php:425
1704
- #, php-format
1705
- msgid "Membership Payment Failed at %s"
1706
- msgstr "Platba za členství se nezdařila na %s"
1707
-
1708
- #: classes/class.pmproemail.php:468 classes/class.pmproemail.php:462
1709
- #, php-format
1710
- msgid "Membership Payment Failed For %s at %s"
1711
- msgstr "Členská platba se nezdařila pro %s na %s"
1712
-
1713
- #: classes/class.pmproemail.php:508
1714
- #, php-format
1715
- msgid "Credit Card on File Expiring Soon at %s"
1716
- msgstr "Kreditní karta brzy skončí na %s"
1717
-
1718
- #: classes/class.pmproemail.php:548 classes/class.pmproemail.php:501
1719
- #, php-format
1720
- msgid "INVOICE for %s membership"
1721
- msgstr "Faktura za %s členství"
1722
-
1723
- #: classes/class.pmproemail.php:611 classes/class.pmproemail.php:563
1724
- #, php-format
1725
- msgid "Your trial at %s is ending soon"
1726
- msgstr "Vaše zkušební verze na %s brzy končí"
1727
-
1728
- #: classes/class.pmproemail.php:645 classes/class.pmproemail.php:596
1729
- #, php-format
1730
- msgid "Your membership at %s has ended"
1731
- msgstr "Vaše členství na %s bylo ukončeno"
1732
-
1733
- #: classes/class.pmproemail.php:670 classes/class.pmproemail.php:621
1734
- #, php-format
1735
- msgid "Your membership at %s will end soon"
1736
- msgstr "Vaše členství na %s brzy zkončí"
1737
-
1738
- #: classes/class.pmproemail.php:690 classes/class.pmproemail.php:641
1739
- #, php-format
1740
- msgid "Your membership at %s has been changed"
1741
- msgstr "Vaše členství na %s bude změněno"
1742
-
1743
- #: classes/class.pmproemail.php:694 classes/class.pmproemail.php:732
1744
- #: classes/class.pmproemail.php:645 classes/class.pmproemail.php:683
1745
- #, php-format
1746
- msgid "The new level is %s. This membership is free"
1747
- msgstr "Nová úroveň je% s. Toto členství je zdarma"
1748
-
1749
- #: classes/class.pmproemail.php:696 classes/class.pmproemail.php:647
1750
- msgid "Your membership has been cancelled"
1751
- msgstr "Vaše členství bylo ukončeno"
1752
-
1753
- #: classes/class.pmproemail.php:700 classes/class.pmproemail.php:738
1754
- #: classes/class.pmproemail.php:651 classes/class.pmproemail.php:689
1755
- #, php-format
1756
- msgid "This membership will expire on %s"
1757
- msgstr "Toto členství vyprší %s"
1758
-
1759
- #: classes/class.pmproemail.php:704 classes/class.pmproemail.php:742
1760
- #: classes/class.pmproemail.php:655 classes/class.pmproemail.php:693
1761
- msgid "This membership does not expire"
1762
- msgstr "Toto členství nevyprší"
1763
-
1764
- #: classes/class.pmproemail.php:728 classes/class.pmproemail.php:679
1765
- #, php-format
1766
- msgid "Membership for %s at %s has been changed"
1767
- msgstr "členství pro %s na %s bylo změněno"
1768
-
1769
- #: classes/class.pmproemail.php:734 classes/class.pmproemail.php:685
1770
- msgid "membership has been cancelled"
1771
- msgstr "členství ukončeno"
1772
-
1773
- #: classes/gateways/class.pmprogateway.php:55
1774
- #: classes/gateways/class.pmprogateway_authorizenet.php:55
1775
- #: classes/gateways/class.pmprogateway_check.php:60
1776
- #: classes/gateways/class.pmprogateway_cybersource.php:57
1777
- #: classes/gateways/class.pmprogateway_payflowpro.php:27
1778
- #: classes/gateways/class.pmprogateway_paypal.php:27
1779
- msgid "Unknown error: Authorization failed."
1780
- msgstr "Neznámá chyba: Autorizace selhala"
1781
-
1782
- #: classes/gateways/class.pmprogateway.php:106
1783
- #: classes/gateways/class.pmprogateway.php:111
1784
- #: classes/gateways/class.pmprogateway.php:129
1785
- #: classes/gateways/class.pmprogateway_authorizenet.php:106
1786
- #: classes/gateways/class.pmprogateway_authorizenet.php:111
1787
- #: classes/gateways/class.pmprogateway_authorizenet.php:128
1788
- #: classes/gateways/class.pmprogateway_check.php:111
1789
- #: classes/gateways/class.pmprogateway_check.php:116
1790
- #: classes/gateways/class.pmprogateway_check.php:134
1791
- #: classes/gateways/class.pmprogateway_cybersource.php:108
1792
- #: classes/gateways/class.pmprogateway_cybersource.php:113
1793
- #: classes/gateways/class.pmprogateway_cybersource.php:131
1794
- #: classes/gateways/class.pmprogateway_payflowpro.php:50
1795
- #: classes/gateways/class.pmprogateway_payflowpro.php:55
1796
- #: classes/gateways/class.pmprogateway_paypal.php:50
1797
- msgid "Unknown error: Payment failed."
1798
- msgstr "Neznámá chyba: Platba selhala"
1799
-
1800
- #: classes/gateways/class.pmprogateway.php:113
1801
- #: classes/gateways/class.pmprogateway_authorizenet.php:112
1802
- #: classes/gateways/class.pmprogateway_check.php:118
1803
- #: classes/gateways/class.pmprogateway_cybersource.php:115
1804
- msgid ""
1805
- "A partial payment was made that we could not void. Please contact the site "
1806
- "owner immediately to correct this."
1807
- msgstr ""
1808
- "Částečně provedená platba. Prosím, obraťte se na vlastníka stránky, který "
1809
- "problém okamžitě napraví."
1810
-
1811
- #: classes/gateways/class.pmprogateway_authorizenet.php:787
1812
- #: classes/gateways/class.pmprogateway_authorizenet.php:788
1813
- #: classes/gateways/class.pmprogateway_authorizenet.php:789
1814
- msgid "Could not connect to Authorize.net"
1815
- msgstr "Nelze se připojit k Authorize.net"
1816
-
1817
- #: classes/gateways/class.pmprogateway_braintree.php:61
1818
- #: classes/gateways/class.pmprogateway_stripe.php:53
1819
- msgid "Unknown error: Initial payment failed."
1820
- msgstr "Neznámá platba: První platba se nezdařila."
1821
-
1822
- #: classes/gateways/class.pmprogateway_braintree.php:120
1823
- msgid "Error during settlement:"
1824
- msgstr "Chyba při zúčtování:"
1825
-
1826
- #: classes/gateways/class.pmprogateway_braintree.php:129
1827
- msgid "Error during charge:"
1828
- msgstr "Chyba během placení:"
1829
-
1830
- #: classes/gateways/class.pmprogateway_braintree.php:198
1831
- msgid "Failed to update customer."
1832
- msgstr "Nepodařilo se aktualizovat zákazníka."
1833
-
1834
- #: classes/gateways/class.pmprogateway_braintree.php:246
1835
- msgid "Failed to create customer."
1836
- msgstr "Nepodařilo se vytvořit zákazníka."
1837
-
1838
- #: classes/gateways/class.pmprogateway_braintree.php:253
1839
- msgid "Error creating customer record with Braintree:"
1840
- msgstr "Chyba při vytváření zákazníka nahrána do Braintree:"
1841
-
1842
- #: classes/gateways/class.pmprogateway_braintree.php:344
1843
- #: classes/gateways/class.pmprogateway_braintree.php:345
1844
- msgid "Error subscribing customer to plan with Braintree:"
1845
- msgstr "Chyba při objednání zákazníka nahrána do Braintree:"
1846
-
1847
- #: classes/gateways/class.pmprogateway_braintree.php:359
1848
- #: classes/gateways/class.pmprogateway_braintree.php:360
1849
- msgid "Failed to subscribe with Braintree:"
1850
- msgstr "Přihlášení s Braintree se nezdařilo:"
1851
-
1852
- #: classes/gateways/class.pmprogateway_braintree.php:397
1853
- #: classes/gateways/class.pmprogateway_braintree.php:410
1854
- #: classes/gateways/class.pmprogateway_braintree.php:417
1855
- #: classes/gateways/class.pmprogateway_stripe.php:344
1856
- #: classes/gateways/class.pmprogateway_stripe.php:354
1857
- #: classes/gateways/class.pmprogateway_braintree.php:398
1858
- #: classes/gateways/class.pmprogateway_braintree.php:411
1859
- #: classes/gateways/class.pmprogateway_braintree.php:418
1860
- #: classes/gateways/class.pmprogateway_stripe.php:343
1861
- #: classes/gateways/class.pmprogateway_stripe.php:353
1862
- msgid "Could not find the subscription."
1863
- msgstr "Nelze najít předplatné."
1864
-
1865
- #: classes/gateways/class.pmprogateway_payflowpro.php:57
1866
- #: classes/gateways/class.pmprogateway_paypal.php:57
1867
- msgid ""
1868
- "A partial payment was made that we could not refund. Please contact the site "
1869
- "owner immediately to correct this."
1870
- msgstr ""
1871
- "Částečná platba byla provedena, ale nemůžeme ji vrátit. Obraťte se na "
1872
- "vlastníka webu, který problém okamžitě vyřeší."
1873
-
1874
- #: classes/gateways/class.pmprogateway_stripe.php:192
1875
- #: classes/gateways/class.pmprogateway_stripe.php:190
1876
- msgid "Error creating customer record with Stripe:"
1877
- msgstr "Chyba při vytváření zákazníka nahrána do Stripe:"
1878
-
1879
- #: classes/gateways/class.pmprogateway_stripe.php:279
1880
- #: classes/gateways/class.pmprogateway_stripe.php:278
1881
- msgid "Error creating plan with Stripe:"
1882
- msgstr "Chyba vytvoření plánu pomocí Stripe:"
1883
-
1884
- #: classes/gateways/class.pmprogateway_stripe.php:295
1885
- #: classes/gateways/class.pmprogateway_stripe.php:294
1886
- msgid "Error subscribing customer to plan with Stripe:"
1887
- msgstr "Chyba při objednání zákazníka nahrána do Stripe:"
1888
-
1889
- #: includes/adminpages.php:9 includes/adminpages.php:39
1890
- msgid "Memberships"
1891
- msgstr "Členství"
1892
-
1893
- #: includes/adminpages.php:10 includes/adminpages.php:49
1894
- msgid "Page Settings"
1895
- msgstr "Nastavení stránek"
1896
-
1897
- #: includes/adminpages.php:11 includes/adminpages.php:54
1898
- msgid "Payment Settings"
1899
- msgstr "Nastavení plateb"
1900
-
1901
- #: includes/adminpages.php:16 includes/adminpages.php:79
1902
- msgid "Reports"
1903
- msgstr "Statistiky"
1904
-
1905
- #: includes/adminpages.php:18 includes/adminpages.php:89
1906
- msgid "Discount Codes"
1907
- msgstr "Slevové kupóny"
1908
-
1909
- #: includes/cleanup.php:24
1910
- #, php-format
1911
- msgid ""
1912
- "There was an error canceling the subscription for user with ID=%s. You will "
1913
- "want to check your payment gateway to see if their subscription is still "
1914
- "active."
1915
- msgstr ""
1916
- "Došlo k chybě při zrušení předplatného pro uživatele s ID=%s. Budete chtít "
1917
- "zkontrolovat platební bránu, zda je jejich předplatné stále aktivní?"
1918
-
1919
- #: includes/currencies.php:7 includes/currencies.php:44
1920
- #: includes/currencies.php:37
1921
- msgid "US Dollars (&#36;)"
1922
- msgstr "Americký dolar (&#36;)"
1923
-
1924
- #: includes/currencies.php:8 includes/currencies.php:47
1925
- #: includes/currencies.php:40
1926
- msgid "Euros (&euro;)"
1927
- msgstr "Euro (&euro;)"
1928
-
1929
- #: includes/currencies.php:9 includes/currencies.php:46
1930
- #: includes/currencies.php:39
1931
- msgid "Pounds Sterling (&pound;)"
1932
- msgstr "Libra (&pound;)"
1933
-
1934
- #: includes/currencies.php:10
1935
- msgid "Australian Dollars (&#36;)"
1936
- msgstr "Australský dolar (&#36;)"
1937
-
1938
- #: includes/currencies.php:11
1939
- msgid "Brazilian Real (&#36;)"
1940
- msgstr "Brazilský real (&#36;)"
1941
-
1942
- #: includes/currencies.php:12 includes/currencies.php:45
1943
- #: includes/currencies.php:38
1944
- msgid "Canadian Dollars (&#36;)"
1945
- msgstr "Kanadský dolar (&#36;)"
1946
-
1947
- #: includes/currencies.php:13
1948
- msgid "Chinese Yuan"
1949
- msgstr "Čínský Jen"
1950
-
1951
- #: includes/currencies.php:14 includes/currencies.php:13
1952
- msgid "Czech Koruna"
1953
- msgstr "Český koruna"
1954
-
1955
- #: includes/currencies.php:15 includes/currencies.php:14
1956
- msgid "Danish Krone"
1957
- msgstr "Dánská koruna"
1958
-
1959
- #: includes/currencies.php:16 includes/currencies.php:15
1960
- msgid "Hong Kong Dollar (&#36;)"
1961
- msgstr "Hong Kongský dolar (&#36;)"
1962
-
1963
- #: includes/currencies.php:17 includes/currencies.php:16
1964
- msgid "Hungarian Forint"
1965
- msgstr "Maďarský forint"
1966
-
1967
- #: includes/currencies.php:18
1968
- msgid "Indian Rupee"
1969
- msgstr "Indická rupie"
1970
-
1971
- #: includes/currencies.php:19
1972
- msgid "Indonesia Rupiah"
1973
- msgstr "Indonézská rupie"
1974
-
1975
- #: includes/currencies.php:20 includes/currencies.php:17
1976
- msgid "Israeli Shekel"
1977
- msgstr "Izraelský Shekel"
1978
-
1979
- #: includes/currencies.php:21 includes/currencies.php:18
1980
- msgid "Japanese Yen (&yen;)"
1981
- msgstr "Japonský Jen (&yen;)"
1982
-
1983
- #: includes/currencies.php:22 includes/currencies.php:19
1984
- msgid "Malaysian Ringgits"
1985
- msgstr "Malajský ringgits"
1986
-
1987
- #: includes/currencies.php:23 includes/currencies.php:20
1988
- msgid "Mexican Peso (&#36;)"
1989
- msgstr "Mexické peso (&#36;)"
1990
-
1991
- #: includes/currencies.php:24 includes/currencies.php:21
1992
- msgid "New Zealand Dollar (&#36;)"
1993
- msgstr "Novozélanský dolar (&#36;)"
1994
-
1995
- #: includes/currencies.php:25 includes/currencies.php:22
1996
- msgid "Norwegian Krone"
1997
- msgstr "Norská koruna"
1998
-
1999
- #: includes/currencies.php:26 includes/currencies.php:23
2000
- msgid "Philippine Pesos"
2001
- msgstr "Filipínské pesos"
2002
-
2003
- #: includes/currencies.php:27 includes/currencies.php:24
2004
- msgid "Polish Zloty"
2005
- msgstr "Polský zlotý"
2006
-
2007
- #: includes/currencies.php:28 includes/currencies.php:25
2008
- msgid "Singapore Dollar (&#36;)"
2009
- msgstr "Singapurský dolar (&#36;)"
2010
-
2011
- #: includes/currencies.php:29
2012
- msgid "South African Rand"
2013
- msgstr "Jihoafrický Rand"
2014
-
2015
- #: includes/currencies.php:30
2016
- msgid "South Korean Won"
2017
- msgstr "Jihokorejský Won"
2018
-
2019
- #: includes/currencies.php:31 includes/currencies.php:26
2020
- msgid "Swedish Krona"
2021
- msgstr "švédská koruna"
2022
-
2023
- #: includes/currencies.php:32 includes/currencies.php:27
2024
- msgid "Swiss Franc"
2025
- msgstr "Švýcarský Frank"
2026
-
2027
- #: includes/currencies.php:33 includes/currencies.php:28
2028
- msgid "Taiwan New Dollars"
2029
- msgstr "Taiwanský noví dolar"
2030
-
2031
- #: includes/currencies.php:34 includes/currencies.php:29
2032
- msgid "Thai Baht"
2033
- msgstr "Thaiský Baht"
2034
-
2035
- #: includes/currencies.php:35
2036
- msgid "Turkish Lira"
2037
- msgstr "Turecká lira"
2038
-
2039
- #: includes/currencies.php:36
2040
- msgid "Vietnamese Dong"
2041
- msgstr "Vietnamský Dong"
2042
-
2043
- #: includes/functions.php:196 includes/functions.php:160
2044
- #, php-format
2045
- msgid "The price for membership is <strong>%s</strong> now"
2046
- msgstr "Cena za členství je nyní <strong>%s</strong>"
2047
-
2048
- #: includes/functions.php:205 includes/functions.php:169
2049
- #, php-format
2050
- msgid " and then <strong>%s per %s for %d more %s</strong>."
2051
- msgstr "a pak <strong>%s na %s pro %d další %s</strong>."
2052
-
2053
- #: includes/functions.php:209 includes/functions.php:173
2054
- #, php-format
2055
- msgid " and then <strong>%s every %d %s for %d more %s</strong>."
2056
- msgstr "a pak <strong>%s každý %d %s pro %d více %s</strong>."
2057
-
2058
- #: includes/functions.php:214 includes/functions.php:178
2059
- #, php-format
2060
- msgid " and then <strong>%s after %d %s</strong>."
2061
- msgstr "a pak <strong>%s po %d %s</strong>."
2062
-
2063
- #: includes/functions.php:220 includes/functions.php:184
2064
- #, php-format
2065
- msgid " and then <strong>%s per %s</strong>."
2066
- msgstr "a pak <strong>%s na %s</strong>."
2067
-
2068
- #: includes/functions.php:224 includes/functions.php:188
2069
- #, php-format
2070
- msgid " and then <strong>%s every %d %s</strong>."
2071
- msgstr "a pak <strong>%s každý %d %s</strong>."
2072
-
2073
- #: includes/functions.php:238 pages/levels.php:82 includes/functions.php:202
2074
- msgid "After your initial payment, your first payment is Free."
2075
- msgstr "Pro vaši výchozí platbu je první platba zdarma."
2076
-
2077
- #: includes/functions.php:242 pages/levels.php:86 includes/functions.php:206
2078
- #, php-format
2079
- msgid "After your initial payment, your first %d payments are Free."
2080
- msgstr "Pro vaši výchozí platbu jsou vaše %d platby zdarma"
2081
-
2082
- #: includes/functions.php:249 pages/levels.php:93 includes/functions.php:213
2083
- #, php-format
2084
- msgid "After your initial payment, your first payment will cost %s."
2085
- msgstr "Pro vaši výchozí platbu bude vaše první platba stát %s."
2086
-
2087
- #: includes/functions.php:253 pages/levels.php:97 includes/functions.php:217
2088
- #, php-format
2089
- msgid "After your initial payment, your first %d payments will cost %s."
2090
- msgstr "Pro vaši výchozí platbu bude vaše první %d platby stát %s."
2091
-
2092
- #: includes/functions.php:264 includes/functions.php:228
2093
- #, php-format
2094
- msgid "Customers in %s will be charged %s%% tax."
2095
- msgstr "Zákazníkovi %s bude účtována %s%% daň."
2096
-
2097
- #: includes/functions.php:278 includes/functions.php:242
2098
- #, php-format
2099
- msgid "Membership expires after %d %s."
2100
- msgstr "Členství vyprší %d %s."
2101
-
2102
- #: includes/functions.php:514 includes/functions.php:491
2103
- msgid "User ID not found."
2104
- msgstr "Uživatelské ID nenalezeno."
2105
-
2106
- #: includes/functions.php:531 includes/functions.php:508
2107
- msgid "Invalid level."
2108
- msgstr "špatná úroveň."
2109
-
2110
- #: includes/functions.php:542 includes/functions.php:520
2111
- msgid "not changing?"
2112
- msgstr "bez změn?"
2113
-
2114
- #: includes/functions.php:559 includes/functions.php:605
2115
- #: includes/functions.php:614 includes/functions.php:537
2116
- #: includes/functions.php:583 includes/functions.php:592
2117
- msgid "Error interacting with database"
2118
- msgstr "Chyba interakce s databází"
2119
-
2120
- #: includes/functions.php:651 includes/functions.php:690
2121
- #: includes/functions.php:629 includes/functions.php:668
2122
- msgid "Membership level not found."
2123
- msgstr "Uživatelská úroveň nenalezena."
2124
-
2125
- #: includes/functions.php:1072 includes/functions.php:1050
2126
- msgid "The discount code could not be found."
2127
- msgstr "Slevový kupón nenalezen."
2128
-
2129
- #: includes/functions.php:1088 includes/functions.php:1066
2130
- #, php-format
2131
- msgid "This discount code goes into effect on %s."
2132
- msgstr "Slevový kupón bude platný od %s."
2133
-
2134
- #: includes/functions.php:1097 includes/functions.php:1075
2135
- #, php-format
2136
- msgid "This discount code expired on %s."
2137
- msgstr "Tento slevový kupón vyprší %s."
2138
-
2139
- #: includes/functions.php:1109 includes/functions.php:1087
2140
- msgid "This discount code is no longer valid."
2141
- msgstr "Tento slevový kupó již není platný."
2142
-
2143
- #: includes/functions.php:1124 includes/functions.php:1102
2144
- msgid "This discount code does not apply to this membership level."
2145
- msgstr "Tento slevový kupón nelze použit pro tuto členskou úroveň."
2146
-
2147
- #: includes/functions.php:1132 includes/functions.php:1110
2148
- msgid "This discount code is okay."
2149
- msgstr "Slevový kupón je vpořádku."
2150
-
2151
- #: includes/functions.php:1156 includes/functions.php:1134
2152
- msgid "and"
2153
- msgstr "a"
2154
-
2155
- #: includes/functions.php:1341 includes/functions.php:1319
2156
- msgid "Sign Up for !!name!! Now"
2157
- msgstr "Přihlašte se !!name!! nyní"
2158
-
2159
- #: includes/functions.php:1347 includes/functions.php:1325
2160
- msgid "Please specify a level id."
2161
- msgstr "Zadejte číslo úrovně."
2162
-
2163
- #: includes/localization.php:23
2164
- msgid "Day"
2165
- msgstr "Den"
2166
-
2167
- #: includes/localization.php:25
2168
- msgid "Week"
2169
- msgstr "Týden"
2170
-
2171
- #: includes/localization.php:27
2172
- msgid "Month"
2173
- msgstr "Měsíc"
2174
-
2175
- #: includes/localization.php:29
2176
- msgid "Year"
2177
- msgstr "Rok"
2178
-
2179
- #: includes/metaboxes.php:38
2180
- msgid ""
2181
- "This post is already protected for this level because it is within a "
2182
- "category that requires membership."
2183
- msgstr ""
2184
- "Tento příspěvek je již chráněna pro tuto úrověň, protože je v kategorii, "
2185
- "která vyžaduje členství."
2186
-
2187
- #: includes/metaboxes.php:99 includes/metaboxes.php:100
2188
- msgid "Require Membership"
2189
- msgstr "Vyžadovat členství"
2190
-
2191
- #: includes/profile.php:36 includes/profile.php:34
2192
- msgid "Current Level"
2193
- msgstr "Aktuální úrověň"
2194
-
2195
- #: includes/profile.php:39 includes/profile.php:37
2196
- msgid "None"
2197
- msgstr "Nic"
2198
-
2199
- #: includes/profile.php:84 includes/profile.php:82
2200
- msgid "User is not paying."
2201
- msgstr "Uživatel nezaplatil."
2202
-
2203
- #: pages/account.php:10
2204
- msgid "Your membership is <strong>active</strong>."
2205
- msgstr "Vaše členství je <strong>aktivní</strong>."
2206
-
2207
- #: pages/account.php:12 pages/billing.php:16 pages/levels.php:13
2208
- msgid "Level"
2209
- msgstr "Úroveň"
2210
-
2211
- #: pages/account.php:14 pages/billing.php:18
2212
- msgid "Membership Fee"
2213
- msgstr "členský poplatek"
2214
-
2215
- #: pages/account.php:25 pages/billing.php:29
2216
- msgid "Duration"
2217
- msgstr "Trvání"
2218
-
2219
- #: pages/account.php:29 pages/confirmation.php:49 pages/invoice.php:30
2220
- #: pages/confirmation.php:48 pages/invoice.php:29
2221
- msgid "Membership Expires"
2222
- msgstr "členství vyprší"
2223
-
2224
- #: pages/account.php:34
2225
- #, php-format
2226
- msgid "Your first payment will cost %s."
2227
- msgstr "Vaše první platba bude stát %s."
2228
-
2229
- #: pages/account.php:38
2230
- #, php-format
2231
- msgid "Your first %d payments will cost %s."
2232
- msgstr "Vaše první %d budou stát %s."
2233
-
2234
- #: pages/account.php:46
2235
- msgid "My Account"
2236
- msgstr "Muj účet"
2237
-
2238
- #: pages/account.php:55
2239
- msgid "Edit Profile"
2240
- msgstr "Upravit profil"
2241
-
2242
- #: pages/account.php:56
2243
- msgid "Change Password"
2244
- msgstr "Změnit heslo"
2245
-
2246
- #: pages/account.php:87
2247
- msgid "Billing Information"
2248
- msgstr "Fakturační údaje"
2249
-
2250
- #: pages/account.php:105 pages/confirmation.php:63 pages/invoice.php:50
2251
- #: pages/confirmation.php:61 pages/invoice.php:48
2252
- msgid "Payment Method"
2253
- msgstr "Platební metody"
2254
-
2255
- #: pages/account.php:114
2256
- msgid "Edit Billing Information"
2257
- msgstr "Upravit fakturační údaje"
2258
-
2259
- #: pages/account.php:125
2260
- msgid "Past Invoices"
2261
- msgstr "Minulé faktury"
2262
-
2263
- #: pages/account.php:140
2264
- msgid "View All Invoices"
2265
- msgstr "Zobrazit všechny faktury"
2266
-
2267
- #: pages/account.php:146
2268
- msgid "Member Links"
2269
- msgstr "Odkazy členů"
2270
-
2271
- #: pages/account.php:152
2272
- msgid "Update Billing Information"
2273
- msgstr "Upravit fakturační údaje"
2274
-
2275
- #: pages/account.php:155
2276
- msgid "Change Membership Level"
2277
- msgstr "Změnit úroveň členství"
2278
-
2279
- #: pages/account.php:157
2280
- msgid "Cancel Membership"
2281
- msgstr "Zrušení členství"
2282
-
2283
- #: pages/billing.php:14
2284
- #, php-format
2285
- msgid "Logged in as <strong>%s</strong>."
2286
- msgstr "Přihlášen jako <strong>%s</strong>."
2287
-
2288
- #: pages/billing.php:14
2289
- msgid "logout"
2290
- msgstr "odhlásit"
2291
-
2292
- #: pages/billing.php:39
2293
- msgid ""
2294
- "Your payment subscription is managed by PayPal. Please <a href=\"http://www."
2295
- "paypal.com\">login to PayPal here</a> to update your billing information."
2296
- msgstr ""
2297
- "Váš odběr plateb řídí PayPal. <a href=\"http://www.paypal.com\">Přihlašte se "
2298
- "do PayPal</a> a aktualizujte své fakturační údaje."
2299
-
2300
- #: pages/billing.php:65 pages/checkout.php:328 pages/checkout.php:321
2301
- msgid "First Name"
2302
- msgstr "Jméno"
2303
-
2304
- #: pages/billing.php:69 pages/checkout.php:332 pages/checkout.php:325
2305
- msgid "Last Name"
2306
- msgstr "Příjmení"
2307
-
2308
- #: pages/billing.php:73 pages/checkout.php:336 pages/checkout.php:329
2309
- msgid "Address 1"
2310
- msgstr "Adresa 1"
2311
-
2312
- #: pages/billing.php:77 pages/checkout.php:340 pages/checkout.php:333
2313
- msgid "Address 2"
2314
- msgstr "Adresa 2"
2315
-
2316
- #: pages/billing.php:87 pages/checkout.php:350 pages/checkout.php:343
2317
- msgid "City"
2318
- msgstr "Město"
2319
-
2320
- #: pages/billing.php:91 pages/checkout.php:354 pages/checkout.php:347
2321
- msgid "State"
2322
- msgstr "Stát"
2323
-
2324
- #: pages/billing.php:95 pages/checkout.php:358 pages/checkout.php:351
2325
- msgid "Postal Code"
2326
- msgstr "PSČ"
2327
-
2328
- #: pages/billing.php:104 pages/checkout.php:367 pages/checkout.php:360
2329
- msgid "City, State Zip"
2330
- msgstr "Město, PSČ státu"
2331
-
2332
- #: pages/billing.php:157 pages/checkout.php:420 pages/checkout.php:413
2333
- msgid "Country"
2334
- msgstr "Země"
2335
-
2336
- #: pages/billing.php:182 pages/checkout.php:445 pages/checkout.php:438
2337
- msgid "Phone"
2338
- msgstr "Telefon"
2339
-
2340
- #: pages/billing.php:193 pages/checkout.php:207 pages/checkout.php:460
2341
- #: pages/checkout.php:204 pages/checkout.php:453
2342
- msgid "E-mail Address"
2343
- msgstr "E-mail"
2344
-
2345
- #: pages/billing.php:197 pages/checkout.php:469 pages/checkout.php:462
2346
- msgid "Confirm E-mail"
2347
- msgstr "Potvrdit e-mail"
2348
-
2349
- #: pages/billing.php:217
2350
- msgid "Credit Card Information"
2351
- msgstr "Informace o platební kartě"
2352
-
2353
- #: pages/billing.php:217
2354
- #, php-format
2355
- msgid "We accept %s"
2356
- msgstr "Přijímáme %s"
2357
-
2358
- #: pages/billing.php:244 pages/checkout.php:527 pages/checkout.php:520
2359
- msgid "Card Number"
2360
- msgstr "Číslo karty"
2361
-
2362
- #: pages/billing.php:281 pages/checkout.php:564 pages/checkout.php:557
2363
- msgid "CVV"
2364
- msgstr "CVV"
2365
-
2366
- #: pages/billing.php:282 pages/checkout.php:565 pages/checkout.php:558
2367
- msgid "what's this?"
2368
- msgstr "Co je toto?"
2369
-
2370
- #: pages/billing.php:294
2371
- msgid "Update"
2372
- msgstr "Upraveno"
2373
-
2374
- #: pages/billing.php:309
2375
- msgid ""
2376
- "This subscription is not recurring. So you don't need to update your billing "
2377
- "information."
2378
- msgstr ""
2379
- "Tento odběr se neopakuje, takže nemusíte aktualizovat své fakturační údaje."
2380
-
2381
- #: pages/cancel.php:14
2382
- msgid "Are you sure you want to cancel your membership?"
2383
- msgstr "Jste si jisti, že chcete zrušit Vaše členství?"
2384
-
2385
- #: pages/cancel.php:17
2386
- msgid "Yes, cancel my account"
2387
- msgstr "Ano, chci zrušit účet"
2388
-
2389
- #: pages/cancel.php:19
2390
- msgid "No, keep my account"
2391
- msgstr "Ne, chci si ponechat účet"
2392
-
2393
- #: pages/cancel.php:22
2394
- msgid "Click here to go to the home page."
2395
- msgstr "Pro návrat na hlavní stranu klikněte zde."
2396
-
2397
- #: pages/checkout.php:26 pages/checkout.php:27
2398
- msgid ""
2399
- "Almost done. Review the membership information and pricing below then "
2400
- "<strong>click the \"Complete Payment\" button</strong> to finish your order."
2401
- msgstr ""
2402
- "Téměř hotovo. Zkontrolujte informace o členství a ceny níže, pak "
2403
- "<strong>klikněte na tlačítko \"Complete Payment\" </ strong> a objednávka "
2404
- "se dokončí."
2405
-
2406
- #: pages/checkout.php:33 pages/checkout.php:34
2407
- msgid "change"
2408
- msgstr "změna"
2409
-
2410
- #: pages/checkout.php:41 pages/checkout.php:42
2411
- #, php-format
2412
- msgid "You have selected the <strong>%s</strong> membership level."
2413
- msgstr "Vybrali jste si <strong>%s</strong> úřověň členství."
2414
-
2415
- #: pages/checkout.php:51 pages/checkout.php:52
2416
- #, php-format
2417
- msgid "<p>The <strong>%s</strong> code has been applied to your order.</p>"
2418
- msgstr "<p><strong>%s</strong> kupón byl použit k Vaši objednávce.</p>"
2419
-
2420
- #: pages/checkout.php:62 services/applydiscountcode.php:74
2421
- #: pages/checkout.php:63
2422
- msgid "Click here to change your discount code"
2423
- msgstr "Pro úpravu slevového kupónu klikněte zde"
2424
-
2425
- #: pages/checkout.php:64 pages/checkout.php:65
2426
- msgid "Click here to enter your discount code"
2427
- msgstr "Pro vložení slevového kupónu klikněte zde"
2428
-
2429
- #: pages/checkout.php:64 pages/checkout.php:65
2430
- msgid "Do you have a discount code?"
2431
- msgstr "Chcete použít slevový kupón?"
2432
-
2433
- #: pages/checkout.php:78 pages/checkout.php:575 pages/checkout.php:79
2434
- #: pages/checkout.php:568
2435
- msgid "Apply"
2436
- msgstr "použít"
2437
-
2438
- #: pages/checkout.php:163 pages/checkout.php:160
2439
- msgid "Account Information"
2440
- msgstr "Informace o účtu"
2441
-
2442
- #: pages/checkout.php:163 pages/checkout.php:160
2443
- msgid "Already have an account?"
2444
- msgstr "Máte již svůj účet?"
2445
-
2446
- #: pages/checkout.php:163 pages/checkout.php:160
2447
- msgid "Log in here"
2448
- msgstr "Přihlašte se zde"
2449
-
2450
- #: pages/checkout.php:189 pages/checkout.php:186
2451
- msgid "Confirm Password"
2452
- msgstr "Potvrzení hesla"
2453
-
2454
- #: pages/checkout.php:216 pages/checkout.php:213
2455
- msgid "Confirm E-mail Address"
2456
- msgstr "Potvrzení e-mailové adresy"
2457
-
2458
- #: pages/checkout.php:235 pages/checkout.php:232
2459
- msgid "Full Name"
2460
- msgstr "Celé jméno"
2461
-
2462
- #: pages/checkout.php:236 pages/checkout.php:233
2463
- msgid "LEAVE THIS BLANK"
2464
- msgstr "VZÍT ZPĚT"
2465
-
2466
- #: pages/checkout.php:260 pages/checkout.php:257
2467
- #, php-format
2468
- msgid ""
2469
- "You are logged in as <strong>%s</strong>. If you would like to use a "
2470
- "different account for this membership, <a href=\"%s\">log out now</a>."
2471
- msgstr ""
2472
- "Jste přihlášen jako <strong>%s</strong>. Pokud jste chtěl použít jiný účet, "
2473
- "<a href=\"%s\">odhlašte se</a>."
2474
-
2475
- #: pages/checkout.php:284 pages/checkout.php:277
2476
- #, php-format
2477
- msgid "I agree to the %s"
2478
- msgstr "Souhlasím s %s"
2479
-
2480
- #: pages/checkout.php:299 pages/checkout.php:292
2481
- msgid "Choose your Payment Method"
2482
- msgstr "Zvolte vaši platební metodu"
2483
-
2484
- #: pages/checkout.php:307 pages/checkout.php:300
2485
- msgid "Check Out with a Credit Card Here"
2486
- msgstr "Zde ověřte Vaši kreditní kartu"
2487
-
2488
- #: pages/checkout.php:309 pages/checkout.php:682 pages/checkout.php:302
2489
- #: pages/checkout.php:675
2490
- msgid "Check Out with PayPal"
2491
- msgstr "Zde ověřte PayPal"
2492
-
2493
- #: pages/checkout.php:500 pages/checkout.php:493
2494
- msgid "Payment Information"
2495
- msgstr "Platební informace"
2496
-
2497
- #: pages/checkout.php:500 pages/checkout.php:493
2498
- #, php-format
2499
- msgid "We Accept %s"
2500
- msgstr "Přijímáme %s"
2501
-
2502
- #: pages/checkout.php:674 pages/checkout.php:667
2503
- msgid "Complete Payment"
2504
- msgstr "Kompletní platby"
2505
-
2506
- #: pages/checkout.php:688 pages/checkout.php:681
2507
- msgid "Submit and Check Out"
2508
- msgstr "Ověřit a odeslat"
2509
-
2510
- #: pages/checkout.php:688 pages/checkout.php:681
2511
- msgid "Submit and Confirm"
2512
- msgstr "Potvrdit a odeslat"
2513
-
2514
- #: pages/checkout.php:688
2515
- msgid "Submit and Pay with 2CheckOut"
2516
- msgstr "Zaplatit a odeslat pomocí 2CheckOut"
2517
-
2518
- #: pages/checkout.php:694 pages/checkout.php:687
2519
- msgid "Processing..."
2520
- msgstr "Zpracování..."
2521
-
2522
- #: pages/confirmation.php:12
2523
- msgid ""
2524
- "Your payment has been submitted. Your membership will be activated shortly."
2525
- msgstr "Platba přijata. Vaše členství bude zakrátko aktivní."
2526
-
2527
- #: pages/confirmation.php:14
2528
- #, php-format
2529
- msgid "Thank you for your membership to %s. Your %s membership is now active."
2530
- msgstr "Děkujeme Vám za vaše členství na %s Váše %s členství je nyní aktivní."
2531
-
2532
- #: pages/confirmation.php:28
2533
- #, php-format
2534
- msgid ""
2535
- "Below are details about your membership account and a receipt for your "
2536
- "initial membership invoice. A welcome email with a copy of your initial "
2537
- "membership invoice has been sent to %s."
2538
- msgstr ""
2539
- "Níže jsou uvedeny informace o vašem členském účtu. Uvítací e-mail s kopií "
2540
- "vašeho členství byl odeslán na % s."
2541
-
2542
- #: pages/confirmation.php:41 pages/invoice.php:22
2543
- #, php-format
2544
- msgid "Invoice #%s on %s"
2545
- msgstr "Faktura #%s na %s"
2546
-
2547
- #: pages/confirmation.php:43
2548
- msgid "Print"
2549
- msgstr "Tisk"
2550
-
2551
- #: pages/confirmation.php:46 pages/confirmation.php:104 pages/invoice.php:27
2552
- #: pages/confirmation.php:45 pages/confirmation.php:102 pages/invoice.php:26
2553
- msgid "Account"
2554
- msgstr "Účet"
2555
-
2556
- #: pages/confirmation.php:65 pages/invoice.php:52 pages/invoice.php:109
2557
- #: pages/confirmation.php:63 pages/invoice.php:50 pages/invoice.php:107
2558
- msgid "Total Billed"
2559
- msgstr "Celkový účet"
2560
-
2561
- #: pages/confirmation.php:82 pages/invoice.php:69 pages/confirmation.php:80
2562
- #: pages/invoice.php:67
2563
- msgid "ending in"
2564
- msgstr "Končí"
2565
-
2566
- #: pages/confirmation.php:97 pages/confirmation.php:95
2567
- #, php-format
2568
- msgid ""
2569
- "Below are details about your membership account. A welcome email with has "
2570
- "been sent to %s."
2571
- msgstr ""
2572
- "Níže jsou uvedeny informace o vašem účtu. Uvítací e-mail byl odeslán na %s."
2573
-
2574
- #: pages/confirmation.php:105 pages/confirmation.php:103
2575
- msgid "Pending"
2576
- msgstr "Až do"
2577
-
2578
- #: pages/confirmation.php:113 pages/invoice.php:141 pages/confirmation.php:111
2579
- #: pages/invoice.php:139
2580
- msgid "View Your Membership Account &rarr;"
2581
- msgstr "Zobrazit Vás členský účet &rarr;"
2582
-
2583
- #: pages/confirmation.php:115 pages/confirmation.php:113
2584
- msgid ""
2585
- "If your account is not activated within a few minutes, please contact the "
2586
- "site owner."
2587
- msgstr ""
2588
- "Pokud není váš účet aktivován během několika minut, kontaktujte vlastníka "
2589
- "webu."
2590
-
2591
- #: pages/invoice.php:79 pages/invoice.php:77
2592
- msgid "Subtotal"
2593
- msgstr "Mezisoučet"
2594
-
2595
- #: pages/invoice.php:82 pages/invoice.php:80
2596
- msgid "Coupon"
2597
- msgstr "Kupón"
2598
-
2599
- #: pages/invoice.php:108 pages/invoice.php:106
2600
- msgid "Invoice #"
2601
- msgstr "Faktura #"
2602
-
2603
- #: pages/invoice.php:122 pages/invoice.php:120
2604
- msgid "View Invoice"
2605
- msgstr "Zobrazit fakturu"
2606
-
2607
- #: pages/invoice.php:134 pages/invoice.php:132
2608
- msgid "No invoices found."
2609
- msgstr "Faktruy nenalezeny"
2610
-
2611
- #: pages/invoice.php:145 pages/invoice.php:143
2612
- msgid "&larr; View All Invoices"
2613
- msgstr "&larr; Zobrazení všech faktur"
2614
-
2615
- #: pages/levels.php:15
2616
- msgid "Subscription Information"
2617
- msgstr "Přihlašovací informace"
2618
-
2619
- #: pages/levels.php:33
2620
- msgid "--"
2621
- msgstr "--"
2622
-
2623
- #: pages/levels.php:43
2624
- msgid "Free"
2625
- msgstr "Zdarma"
2626
-
2627
- #: pages/levels.php:51
2628
- #, php-format
2629
- msgid "%s per %s for %d more %s."
2630
- msgstr "%s na %s pro %d více %s."
2631
-
2632
- #: pages/levels.php:55
2633
- #, php-format
2634
- msgid "%s every %d %s for %d more %s."
2635
- msgstr "%s každý %d %s pro %d více %s."
2636
-
2637
- #: pages/levels.php:60
2638
- #, php-format
2639
- msgid "%s after %d %s."
2640
- msgstr "%s po %d %s."
2641
-
2642
- #: pages/levels.php:66
2643
- #, php-format
2644
- msgid "%s per %s."
2645
- msgstr "%s na %s."
2646
-
2647
- #: pages/levels.php:70
2648
- #, php-format
2649
- msgid "%s every %d %s."
2650
- msgstr "%s každý %d %s."
2651
-
2652
- #: pages/levels.php:113 pages/levels.php:115
2653
- msgid "Select"
2654
- msgstr "Označit"
2655
-
2656
- #: pages/levels.php:123
2657
- msgid "Renew"
2658
- msgstr "Obnovit"
2659
-
2660
- #: pages/levels.php:129 pages/levels.php:117
2661
- msgid "Your&nbsp;Level"
2662
- msgstr "Vaše&nbsp;úrověň"
2663
-
2664
- #: pages/levels.php:145 pages/levels.php:129
2665
- msgid "&larr; Return to Your Account"
2666
- msgstr "&larr; Návrat k účtu"
2667
-
2668
- #: pages/levels.php:147 pages/levels.php:131
2669
- msgid "&larr; Return to Home"
2670
- msgstr "&larr; Návrat domů"
2671
-
2672
- #: preheaders/account.php:7 preheaders/levels.php:19
2673
- msgid "Your membership status has been updated - Thank you!"
2674
- msgstr "Váš členský satus byl upraven - Děkujeme!"
2675
-
2676
- #: preheaders/account.php:11 preheaders/levels.php:23
2677
- msgid ""
2678
- "Sorry, your request could not be completed - please try again in a few "
2679
- "moments."
2680
- msgstr "Váš požadavek nemůže bát dokončen - zkuste to prosím později."
2681
-
2682
- #: preheaders/billing.php:258 preheaders/checkout.php:481
2683
- #: preheaders/checkout.php:464
2684
- msgid "Please complete all required fields."
2685
- msgstr "Vyplňte všechna poviná pole."
2686
-
2687
- #: preheaders/billing.php:263 preheaders/checkout.php:491
2688
- #: preheaders/checkout.php:474
2689
- msgid "Your email addresses do not match. Please try again."
2690
- msgstr "Vaše e-mailová adresa nesouhlasí. Zadejte ji znovu"
2691
-
2692
- #: preheaders/billing.php:268 preheaders/checkout.php:497
2693
- #: preheaders/checkout.php:480
2694
- msgid "The email address entered is in an invalid format. Please try again."
2695
- msgstr ""
2696
- "Vaše e-mailová adresa nebyla vložena ve správném formátu. Zkuste to znovu."
2697
-
2698
- #: preheaders/billing.php:274
2699
- msgid "All good!"
2700
- msgstr "Vše v pořádku!"
2701
-
2702
- #: preheaders/billing.php:340
2703
- #, php-format
2704
- msgid "Information updated. <a href=\"%s\">&laquo; back to my account</a>"
2705
- msgstr "Informace upraveny. <a href=\"%s\">&laquo; zpět k Vašemu účtu</a>"
2706
-
2707
- #: preheaders/billing.php:347
2708
- msgid "Error updating billing information."
2709
- msgstr "Chyba při aktualizaci faktruačních údajů."
2710
-
2711
- #: preheaders/cancel.php:24
2712
- msgid "Your membership has been cancelled."
2713
- msgstr "Vaše členství bylo ukončeno."
2714
-
2715
- #: preheaders/checkout.php:28 preheaders/checkout.php:508
2716
- #: preheaders/checkout.php:491
2717
- msgid "Invalid gateway."
2718
- msgstr "Neplatná brána."
2719
-
2720
- #: preheaders/checkout.php:96
2721
- msgid "Checkout: Payment Information"
2722
- msgstr "Pokladna: Informace o platbě"
2723
-
2724
- #: preheaders/checkout.php:109
2725
- msgid "Setup Your Account"
2726
- msgstr "Nastavit S´áš účet"
2727
-
2728
- #: preheaders/checkout.php:485 preheaders/checkout.php:468
2729
- msgid "Your passwords do not match. Please try again."
2730
- msgstr "Vaše heslo se neshoduje. Zkuste to prosím znovu."
2731
-
2732
- #: preheaders/checkout.php:503 preheaders/checkout.php:486
2733
- #, php-format
2734
- msgid "Please check the box to agree to the %s."
2735
- msgstr "Prosím, proveďte kontrolu políčka k odsouhlasení %s."
2736
-
2737
- #: preheaders/checkout.php:512 preheaders/checkout.php:495
2738
- msgid "Are you a spammer?"
2739
- msgstr "Jste spamer?"
2740
-
2741
- #: preheaders/checkout.php:535 preheaders/checkout.php:518
2742
- msgid "That username is already taken. Please try another."
2743
- msgstr "Toto uživatelské heslo je již použito. Prosím zkuste to znovu."
2744
-
2745
- #: preheaders/checkout.php:541 preheaders/checkout.php:524
2746
- msgid "That email address is already taken. Please try another."
2747
- msgstr "Tato e-mailová adresa je již použita. Zkuste prosím jinou."
2748
-
2749
- #: preheaders/checkout.php:561 preheaders/checkout.php:544
2750
- #, php-format
2751
- msgid "reCAPTCHA failed. (%s) Please try again."
2752
- msgstr "reCAPTCHA neúspěšna. (%s) Zkuste to prosím znovu."
2753
-
2754
- #: preheaders/checkout.php:701 preheaders/checkout.php:683
2755
- msgid "Payment accepted."
2756
- msgstr "Platba potvrzena."
2757
-
2758
- #: preheaders/checkout.php:709 preheaders/checkout.php:691
2759
- msgid ""
2760
- "Unknown error generating account. Please contact us to setup your membership."
2761
- msgstr ""
2762
- "Neznámá chyba generování uživatelského účtu. Kontaktujte vlastníka webu."
2763
-
2764
- #: preheaders/checkout.php:753 preheaders/checkout.php:822
2765
- #: preheaders/checkout.php:735 preheaders/checkout.php:803
2766
- msgid "The PayPal Token was lost."
2767
- msgstr "Paypal Token byl ztracen."
2768
-
2769
- #: preheaders/checkout.php:859 preheaders/checkout.php:825
2770
- #: preheaders/checkout.php:844
2771
- msgid ""
2772
- "Your payment was accepted, but there was an error setting up your account. "
2773
- "Please contact us."
2774
- msgstr ""
2775
- "Vaše platba byla přijata, ale ve vašem účtu byla objevena chyba. Prosím, "
2776
- "kontaktujte nás."
2777
-
2778
- #: preheaders/checkout.php:1045 preheaders/checkout.php:983
2779
- #: preheaders/checkout.php:1030
2780
- msgid ""
2781
- "IMPORTANT: Something went wrong during membership creation. Your credit card "
2782
- "authorized, but we cancelled the order immediately. You should not try to "
2783
- "submit this form again. Please contact the site owner to fix this issue."
2784
- msgstr ""
2785
- "DŮLEŽITÉ: Při vytváření členství se něco pokazilo. Vaše kreditní karta je "
2786
- "autorizována, ale objednávka byla okamžitě zrušena. Obraťte se na vlastníka "
2787
- "stránky, který tento problém vyřeší."
2788
-
2789
- #: preheaders/checkout.php:1050 preheaders/checkout.php:988
2790
- #: preheaders/checkout.php:1035
2791
- msgid ""
2792
- "IMPORTANT: Something went wrong during membership creation. Your credit card "
2793
- "was charged, but we couldn't assign your membership. You should not submit "
2794
- "this form again. Please contact the site owner to fix this issue."
2795
- msgstr ""
2796
- "DŮLEŽITÉ: Při vytváření členství se něco pokazilo. Vaše kreditní karta byla "
2797
- "nabitá, ale jsme se nemohli aktivovat vaše členství. Obraťte se na vlastníka "
2798
- "stránky, který tento problém vyřeší."
2799
-
2800
- #: preheaders/checkout.php:1063 preheaders/checkout.php:1001
2801
- #: preheaders/checkout.php:1048
2802
- #, php-format
2803
- msgid ""
2804
- "You must <a href=\"%s\">setup a Payment Gateway</a> before any payments will "
2805
- "be processed."
2806
- msgstr ""
2807
- "Před započetím plateb musíte <a href=\"%s\">nastavit platební bránu</a>."
2808
-
2809
- #: preheaders/checkout.php:1065 preheaders/checkout.php:1003
2810
- #: preheaders/checkout.php:1050
2811
- msgid "A Payment Gateway must be setup before any payments will be processed."
2812
- msgstr ""
2813
- "Platební brána musí být nastavena předtím, než budou zpracovány veškeré "
2814
- "platby."
2815
-
2816
- #: scheduled/crons.php:31 scheduled/crons.php:61
2817
- #, php-format
2818
- msgid "Membership expired email sent to %s. "
2819
- msgstr "Členství skončílo pomocí e-mailu zaslaného na% s."
2820
-
2821
- #: scheduled/crons.php:74 scheduled/crons.php:27
2822
- #, php-format
2823
- msgid "Membership expiring email sent to %s. "
2824
- msgstr "Členství skončí pomocí e-mailu zaslaného na% s."
2825
-
2826
- #: scheduled/crons.php:143
2827
- #, php-format
2828
- msgid "Credit card expiring email sent to %s. "
2829
- msgstr "Kreditní karta skončí pomocí e-mailu zaslaného na% s."
2830
-
2831
- #: scheduled/crons.php:196 scheduled/crons.php:104
2832
- #, php-format
2833
- msgid "Trial ending email sent to %s. "
2834
- msgstr "Zkušební doba zkončí po zaslání emailu %s."
2835
-
2836
- #: services/applydiscountcode.php:82
2837
- #, php-format
2838
- msgid "The <strong>%s</strong> code has been applied to your order."
2839
- msgstr "<strong>%s</strong> kupón byl použit k Vaší objednávce."
2840
-
2841
- #: services/authnet-silent-post.php:133
2842
- msgid ""
2843
- "<p>A payment is being held for review within Authorize.net.</p><p>Payment "
2844
- "Information From Authorize.net"
2845
- msgstr ""
2846
- "<p>Platba se uskuteční v rámci Authorize.net. </p><p> Informace o platbě od "
2847
- "Authorize.net"
2848
-
2849
- #: services/stripe-webhook.php:176
2850
- #, php-format
2851
- msgid ""
2852
- "%s has had their payment subscription cancelled by Stripe. Please check that "
2853
- "this user's membership is cancelled on your site if it should be."
2854
- msgstr ""
2855
- "% s má své předplatné zrušeno Stripem. Zkontrolujte prosím, zda se "
2856
- "uživatelovo členství zruší na vašich stránkách, pokud by to tak mělo být."
2857
-
2858
- #: adminpages/membershiplevels.php:398
2859
- msgid ""
2860
- "2Checkout integration does not currently support custom trials. You can do "
2861
- "one period trials by setting an initial payment different from the billing "
2862
- "amount."
2863
- msgstr ""
2864
- "Integrace 2Checkout v současné době nepodporuje vlastní zkušební dobu. "
2865
- "Můžete to udělat v jednom období zkušební doby, nastavením počáteční platby "
2866
- "lišící se od fakturační částky."
2867
-
2868
- #: adminpages/paymentsettings.php:170
2869
- msgid ""
2870
- "Payflow Pro currently only supports one-time payments. Users will not be "
2871
- "able to checkout for levels with recurring payments."
2872
- msgstr ""
2873
- "Payflow Pro v současné době podporuje pouze jednorázové platby. Uživatelé "
2874
- "nebudou moci zaplatit pro úrovně opakujících se plateb."
2875
-
2876
- #: adminpages/paymentsettings.php:410 adminpages/paymentsettings.php:421
2877
- msgid "Use SSL"
2878
- msgstr "Použít SSL"
2879
-
2880
- #: adminpages/paymentsettings.php:425
2881
- msgid "Required by this Gateway Option"
2882
- msgstr "Vyžadované nastavením brány"
2883
-
2884
- #: pages/confirmation.php:12
2885
- msgid ""
2886
- "Your payment has been submitted to PayPal. Your membership will be activated "
2887
- "shortly."
2888
- msgstr ""
2889
- "Vaše platba byla odeslána na PayPal. Vaše členství bude zakrátko aktivní."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/pmpro-da_DK.mo DELETED
Binary file
languages/pmpro-da_DK.po DELETED
@@ -1,3502 +0,0 @@
1
- #
2
- # Hi there! Details on how to help out translating Paid Memberships Pro can be found at:
3
- # http://www.paidmembershipspro.com/documentation/languages/
4
- #
5
- msgid ""
6
- msgstr ""
7
- "Project-Id-Version: pmpro-dk_DA\n"
8
- "POT-Creation-Date: 2014-05-05 13:29-0400\n"
9
- "PO-Revision-Date: 2014-07-26 16:43+0100\n"
10
- "Last-Translator: Miscni <miscni@hotmail.com>\n"
11
- "Language-Team: Stranger Studios DK section <miscni@hotmail.com>\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
- "Language: da_DK\n"
17
- "X-Generator: Poedit 1.6.7\n"
18
- "X-Poedit-Bookmarks: -1,-1,215,-1,-1,-1,-1,-1,-1,-1\n"
19
-
20
- #: adminpages/addons.php:5 adminpages/advancedsettings.php:5
21
- #: adminpages/discountcodes.php:5 adminpages/emailsettings.php:5
22
- #: adminpages/membershiplevels.php:5 adminpages/memberslist-csv.php:5
23
- #: adminpages/memberslist.php:5 adminpages/orders-csv.php:5
24
- #: adminpages/orders.php:5 adminpages/pagesettings.php:5
25
- #: adminpages/paymentsettings.php:5
26
- msgid "You do not have permissions to perform this action."
27
- msgstr "Du har ikke tilladelse, til at udfører denne handling."
28
-
29
- #: adminpages/addons.php:79
30
- msgid "Disabled"
31
- msgstr "Deaktiveret."
32
-
33
- #: adminpages/addons.php:79
34
- msgid "Enabled"
35
- msgstr "Aktiver"
36
-
37
- #: adminpages/admin_header.php:25
38
- msgid "Add a membership level to get started."
39
- msgstr "Tilføj et medlems niveau for at komme igang."
40
-
41
- #: adminpages/admin_header.php:27
42
- msgid "Setup the membership pages"
43
- msgstr "Sæt en medleys side op"
44
-
45
- #: adminpages/admin_header.php:29
46
- msgid "Setup your SSL certificate and payment gateway"
47
- msgstr "Sæt op din SSL certifikater og betalings gateway"
48
-
49
- #: adminpages/admin_header.php:38
50
- msgid ""
51
- "The billing details for some of your membership levels is not supported by "
52
- "Stripe."
53
- msgstr ""
54
- "Betalings detaljer, for nogle af dine medlems niveaur, understøttes ikke af "
55
- "Stripe."
56
-
57
- #: adminpages/admin_header.php:46
58
- msgid ""
59
- "The billing details for this level are not supported by Stripe. Please "
60
- "review the notes in the Billing Details section below."
61
- msgstr ""
62
- "Betalings detaljer, for dette niveau understøttes ikke af Stripe. Gennemgå "
63
- "venligst notater under Betalings Detaljer sektionen."
64
-
65
- #: adminpages/admin_header.php:50 adminpages/admin_header.php:70
66
- #: adminpages/admin_header.php:90 adminpages/admin_header.php:111
67
- msgid "The levels with issues are highlighted below."
68
- msgstr "De niveaur med problemer er fremhævet nedenfor."
69
-
70
- #: adminpages/admin_header.php:52 adminpages/admin_header.php:72
71
- #: adminpages/admin_header.php:92 adminpages/admin_header.php:113
72
- msgid "Please edit your levels"
73
- msgstr "Venlig redigere dine niveaur"
74
-
75
- #: adminpages/admin_header.php:58
76
- msgid ""
77
- "The billing details for some of your membership levels is not supported by "
78
- "Payflow."
79
- msgstr ""
80
- "Betalings detaljer for nogle af dine medlems niveauer, understøttes ikke af "
81
- "Payflow."
82
-
83
- #: adminpages/admin_header.php:66
84
- msgid ""
85
- "The billing details for this level are not supported by Payflow. Please "
86
- "review the notes in the Billing Details section below."
87
- msgstr ""
88
- "Betalings detaljer for dette niveau understøttes ikke af Payflow. Gennemgå "
89
- "venligst notater under Betalings Detajler sektionen."
90
-
91
- #: adminpages/admin_header.php:78
92
- msgid ""
93
- "The billing details for some of your membership levels is not supported by "
94
- "Braintree."
95
- msgstr ""
96
- "Betalings detaljer for nogen af dine medlems niveaur, undersøttes ikke af "
97
- "Braintree."
98
-
99
- #: adminpages/admin_header.php:86
100
- msgid ""
101
- "The billing details for this level are not supported by Braintree. Please "
102
- "review the notes in the Billing Details section below."
103
- msgstr ""
104
- "Betalings detaljer for dette niveau understøttes ikke af Braintree. Gennemgå "
105
- "venligst noter I Betalings Detaljer sektion nedenfor."
106
-
107
- #: adminpages/admin_header.php:98
108
- msgid ""
109
- "The billing details for some of your membership levels is not supported by "
110
- "TwoCheckout."
111
- msgstr ""
112
- "Betalings detaljer for nogle af dine medlemsskab niveaur, understøttes ikke "
113
- "af TwoCheckout. "
114
-
115
- #: adminpages/admin_header.php:107
116
- msgid ""
117
- "The billing details for this level are not supported by 2Checkout. Please "
118
- "review the notes in the Billing Details section below."
119
- msgstr ""
120
- "Betalings detaljer for dette niveau understøttes ikke af 2Checkout. Gennemgå "
121
- "venligst noter I Betalings Detaljer sektionen nedenfor."
122
-
123
- #: adminpages/admin_header.php:127 adminpages/admin_header.php:106
124
- msgid "Plugin Support"
125
- msgstr "Plugin Support"
126
-
127
- #: adminpages/admin_header.php:127 adminpages/admin_header.php:106
128
- msgid "User Forum"
129
- msgstr "Bruger Forum"
130
-
131
- #: adminpages/admin_header.php:149 adminpages/membershiplevels.php:498
132
- #: adminpages/pagesettings.php:69 includes/adminpages.php:107
133
- #: adminpages/admin_header.php:128 adminpages/membershiplevels.php:490
134
- #: adminpages/membershiplevels.php:496 includes/adminpages.php:44
135
- #: includes/adminpages.php:100
136
- msgid "Membership Levels"
137
- msgstr "Medlemsskab Niveaur"
138
-
139
- #: adminpages/admin_header.php:150 adminpages/pagesettings.php:120
140
- #: adminpages/admin_header.php:129 adminpages/pagesettings.php:92
141
- msgid "Pages"
142
- msgstr "Sider"
143
-
144
- #: adminpages/admin_header.php:151 adminpages/admin_header.php:130
145
- msgid "Payment Gateway &amp; SSL"
146
- msgstr "Betalings Gateway &amp; SSL"
147
-
148
- #: adminpages/admin_header.php:152 adminpages/memberslist.php:148
149
- #: pages/account.php:56 adminpages/admin_header.php:131
150
- #: adminpages/memberslist.php:115 pages/account.php:52
151
- msgid "Email"
152
- msgstr "Email"
153
-
154
- #: adminpages/admin_header.php:153 adminpages/admin_header.php:132
155
- msgid "Advanced"
156
- msgstr "Avanceret"
157
-
158
- #: adminpages/admin_header.php:154 includes/adminpages.php:52
159
- #: includes/adminpages.php:142 adminpages/admin_header.php:133
160
- #: includes/adminpages.php:14 includes/adminpages.php:69
161
- #: includes/adminpages.php:135
162
- msgid "Add Ons"
163
- msgstr "Add Ons"
164
-
165
- #: adminpages/advancedsettings.php:42 adminpages/advancedsettings.php:35
166
- msgid "Your advanced settings have been updated."
167
- msgstr "Dine advanceret indstillinger er bleven opdateret."
168
-
169
- #: adminpages/advancedsettings.php:66
170
- #, php-format
171
- msgid ""
172
- "This content is for !!levels!! members only. <a href=\"%s\">Register here</"
173
- "a>."
174
- msgstr ""
175
- "Dette indhold er kun for !!levels!! medlemmer. <a href=\"%s\">Registrerer "
176
- "her</a>."
177
-
178
- #: adminpages/advancedsettings.php:71
179
- #, php-format
180
- msgid ""
181
- "Please <a href=\"%s\">login</a> to view this content. (<a href=\"%s"
182
- "\">Register here</a>.)"
183
- msgstr ""
184
- "Vær venlig at <a href=\"%s\">Log Ind</a> for at læse dette indhold. (<a href="
185
- "\"%s\">Registerer her</a>.)"
186
-
187
- #: adminpages/advancedsettings.php:76
188
- msgid ""
189
- "This content is for members only. Visit the site and log in/register to read."
190
- msgstr ""
191
- "Dette indhold er kun for medllemmer. Besøg siden og log ind/registrerer for "
192
- "at læse."
193
-
194
- #: adminpages/advancedsettings.php:86 includes/adminpages.php:51
195
- #: includes/adminpages.php:135 adminpages/advancedsettings.php:79
196
- #: includes/adminpages.php:13 includes/adminpages.php:64
197
- #: includes/adminpages.php:128
198
- msgid "Advanced Settings"
199
- msgstr "Avanceret Indstillinger"
200
-
201
- #: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:85
202
- msgid "Message for Logged-in Non-members"
203
- msgstr "Beskeder til logget ind ikke-medlemmer"
204
-
205
- #: adminpages/advancedsettings.php:96 adminpages/advancedsettings.php:89
206
- msgid ""
207
- "This message replaces the post content for non-members. Available variables"
208
- msgstr ""
209
- "Denne besked erstatter dette indhold for ikke-medlemmer. Forskellige "
210
- "muligheder er tilgængelig"
211
-
212
- #: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:94
213
- msgid "Message for Logged-out Users"
214
- msgstr "Besked til brugere der er logget ud"
215
-
216
- #: adminpages/advancedsettings.php:105 adminpages/advancedsettings.php:98
217
- msgid "This message replaces the post content for logged-out visitors."
218
- msgstr "Denne besked erstatter det postet indhold for lbesøgende."
219
-
220
- #: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:103
221
- msgid "Message for RSS Feed"
222
- msgstr "Besked til RSS Feed"
223
-
224
- #: adminpages/advancedsettings.php:114 adminpages/advancedsettings.php:107
225
- msgid "This message replaces the post content in RSS feeds."
226
- msgstr "Denne besked erstatter postet indhold I RSS feeds."
227
-
228
- #: adminpages/advancedsettings.php:120 adminpages/advancedsettings.php:113
229
- msgid "Show Excerpts to Non-Members?"
230
- msgstr "Vis Uddrag til ikke-medlemmer?"
231
-
232
- #: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:117
233
- msgid "No - Hide excerpts."
234
- msgstr "Nej - Skjul uddrag"
235
-
236
- #: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:118
237
- msgid "Yes - Show excerpts."
238
- msgstr "Ja - Vis uddrag"
239
-
240
- #: adminpages/advancedsettings.php:135 adminpages/advancedsettings.php:194
241
- #: adminpages/advancedsettings.php:206 adminpages/membershiplevels.php:571
242
- #: adminpages/paymentsettings.php:434 adminpages/paymentsettings.php:459
243
- #: includes/profile.php:123 adminpages/advancedsettings.php:128
244
- #: adminpages/advancedsettings.php:187 adminpages/advancedsettings.php:199
245
- #: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569
246
- #: adminpages/paymentsettings.php:414 adminpages/paymentsettings.php:429
247
- #: adminpages/paymentsettings.php:454 includes/profile.php:121
248
- msgid "No"
249
- msgstr "Nej"
250
-
251
- #: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:129
252
- msgid "Hide Ads From All Members"
253
- msgstr "Skjul Reklamer For Alle Medlemmer"
254
-
255
- #: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:130
256
- msgid "Hide Ads From Certain Members"
257
- msgstr "Skjul Reklamer For Specifikke Medlemmer"
258
-
259
- #: adminpages/advancedsettings.php:144 adminpages/advancedsettings.php:137
260
- msgid "Ads from the following plugins will be automatically turned off"
261
- msgstr "Reklamer fra følgende plugins ville automatisk blive slået fra"
262
-
263
- #: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:138
264
- msgid "To hide ads in your template code, use code like the following"
265
- msgstr "For at skjule reklamer i din template kode, brug følgende"
266
-
267
- #: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:149
268
- msgid "Choose Levels to Hide Ads From"
269
- msgstr "Vælg nivauer for at Skjule Reklamer Fra"
270
-
271
- #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:183
272
- msgid "Redirect all traffic from registration page to /susbcription/?"
273
- msgstr "Omdigerer alt trafik fra Registrerings siden til /registrering/?"
274
-
275
- #: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:183
276
- msgid "multisite only"
277
- msgstr "kun for flere sites"
278
-
279
- #: adminpages/advancedsettings.php:195 adminpages/membershiplevels.php:571
280
- #: adminpages/paymentsettings.php:435 adminpages/paymentsettings.php:460
281
- #: includes/profile.php:124 adminpages/advancedsettings.php:188
282
- #: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569
283
- #: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424
284
- #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:455
285
- #: includes/profile.php:122
286
- msgid "Yes"
287
- msgstr "Ja"
288
-
289
- #: adminpages/advancedsettings.php:202 adminpages/advancedsettings.php:195
290
- msgid "Use reCAPTCHA?"
291
- msgstr "Brug reCAPTCHA?"
292
-
293
- #: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:200
294
- msgid "Yes - Free memberships only."
295
- msgstr "Ja - Kun for gratis medlemsskab."
296
-
297
- #: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:201
298
- msgid "Yes - All memberships."
299
- msgstr "Ja - Alle medlemsskaber."
300
-
301
- #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:203
302
- msgid "A free reCAPTCHA key is required."
303
- msgstr "En gratis reCAPTCHA nøgle er påkrævet."
304
-
305
- #: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:203
306
- msgid "Click here to signup for reCAPTCHA"
307
- msgstr "Klik her, for at registerer med reCAPTCHA"
308
-
309
- #: adminpages/advancedsettings.php:216 adminpages/advancedsettings.php:209
310
- msgid "reCAPTCHA Public Key"
311
- msgstr "reCAPTCHA Offentlig Nøgle"
312
-
313
- #: adminpages/advancedsettings.php:219 adminpages/advancedsettings.php:212
314
- msgid "reCAPTCHA Private Key"
315
- msgstr "reCAPTCHA Privat Nøgle"
316
-
317
- #: adminpages/advancedsettings.php:225 adminpages/advancedsettings.php:218
318
- msgid "Require Terms of Service on signups?"
319
- msgstr "Ønskes Vilkår og Betingelser med registrering? "
320
-
321
- #: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:225
322
- msgid ""
323
- "If yes, create a WordPress page containing your TOS agreement and assign it "
324
- "using the dropdown above."
325
- msgstr ""
326
- "Hvis ja er valgt, opret en Wordpress side, med indhold af din VOB aftale, og "
327
- "tilføje den, med dropdown ovenfor.t"
328
-
329
- #: adminpages/advancedsettings.php:272
330
- msgid "selected"
331
- msgstr "valgte"
332
-
333
- #: adminpages/advancedsettings.php:355 adminpages/pagesettings.php:251
334
- #: adminpages/paymentsettings.php:532 adminpages/advancedsettings.php:284
335
- #: adminpages/pagesettings.php:209 adminpages/pagesettings.php:223
336
- #: adminpages/paymentsettings.php:485 adminpages/paymentsettings.php:526
337
- msgid "Save Settings"
338
- msgstr "Gem Indstillinger"
339
-
340
- #: adminpages/discountcodes.php:48
341
- msgid "Discount code updated successfully."
342
- msgstr "Rabat kode er opdateret succesfuldt"
343
-
344
- #: adminpages/discountcodes.php:55
345
- msgid "Error updating discount code. That code may already be in use."
346
- msgstr "Fejl I at opdatere rabat kode. Denne kode er nok allerede i brug."
347
-
348
- #: adminpages/discountcodes.php:64
349
- msgid "Discount code added successfully."
350
- msgstr "Rabat kode er tilføjet succesfuldt."
351
-
352
- #: adminpages/discountcodes.php:71
353
- msgid "Error adding discount code. That code may already be in use."
354
- msgstr "Fejl i at tilføje rabat kode. Denne kode må allerede være i brug,"
355
-
356
- #: adminpages/discountcodes.php:196
357
- #, php-format
358
- msgid "Error saving values for the %s level."
359
- msgstr "Fejl i at gemme værdier til denne %s niveau."
360
-
361
- #: adminpages/discountcodes.php:204
362
- msgid "There were errors updating the level values: "
363
- msgstr "Der opstod fejl I at opdatere niveau værdier: "
364
-
365
- #: adminpages/discountcodes.php:237 adminpages/discountcodes.php:234
366
- #, php-format
367
- msgid "Code %s deleted successfully."
368
- msgstr "Kode %s slettet succesfuldt."
369
-
370
- #: adminpages/discountcodes.php:242 adminpages/discountcodes.php:239
371
- msgid ""
372
- "Error deleting discount code. The code was only partially deleted. Please "
373
- "try again."
374
- msgstr ""
375
- "Fejl opstod, med at slette rabat kode. Koden blev delvist slettet. Prøv igen."
376
-
377
- #: adminpages/discountcodes.php:248 adminpages/discountcodes.php:245
378
- msgid "Error deleting code. Please try again."
379
- msgstr "Fejl opstod I at slette koden. Prøv igen"
380
-
381
- #: adminpages/discountcodes.php:254 adminpages/discountcodes.php:251
382
- msgid "Code not found."
383
- msgstr "Kode ikke fundet."
384
-
385
- #: adminpages/discountcodes.php:267 adminpages/discountcodes.php:264
386
- msgid "Edit Discount Code"
387
- msgstr "Redigere Rabat Kode"
388
-
389
- #: adminpages/discountcodes.php:269 adminpages/discountcodes.php:529
390
- #: adminpages/discountcodes.php:266 adminpages/discountcodes.php:526
391
- msgid "Add New Discount Code"
392
- msgstr "Tilføj Ny Rabat Kode"
393
-
394
- #: adminpages/discountcodes.php:309 adminpages/discountcodes.php:557
395
- #: adminpages/membershiplevels.php:286 adminpages/membershiplevels.php:513
396
- #: adminpages/memberslist.php:144 adminpages/orders.php:900
397
- #: adminpages/reports/login.php:140 adminpages/discountcodes.php:306
398
- #: adminpages/discountcodes.php:547 adminpages/membershiplevels.php:284
399
- #: adminpages/membershiplevels.php:505 adminpages/membershiplevels.php:511
400
- #: adminpages/memberslist.php:111 adminpages/orders.php:597
401
- msgid "ID"
402
- msgstr "ID"
403
-
404
- #: adminpages/discountcodes.php:310 adminpages/orders.php:261
405
- #: adminpages/discountcodes.php:307 adminpages/orders.php:211
406
- msgid "This will be generated when you save."
407
- msgstr "Dette ville blive generet, når du gemmer."
408
-
409
- #: adminpages/discountcodes.php:314 adminpages/discountcodes.php:558
410
- #: adminpages/orders.php:265 adminpages/orders.php:901
411
- #: adminpages/discountcodes.php:311 adminpages/discountcodes.php:548
412
- #: adminpages/orders.php:215 adminpages/orders.php:598
413
- msgid "Code"
414
- msgstr "Kode"
415
-
416
- #: adminpages/discountcodes.php:352 adminpages/discountcodes.php:349
417
- msgid "Start Date"
418
- msgstr "Start Dato"
419
-
420
- #: adminpages/discountcodes.php:370 pages/billing.php:253
421
- #: pages/checkout.php:508 adminpages/discountcodes.php:367
422
- #: pages/billing.php:249 pages/checkout.php:525 pages/checkout.php:532
423
- msgid "Expiration Date"
424
- msgstr "Udløbs Dato"
425
-
426
- #: adminpages/discountcodes.php:388 adminpages/discountcodes.php:561
427
- #: adminpages/discountcodes.php:385 adminpages/discountcodes.php:551
428
- msgid "Uses"
429
- msgstr "Forbrug"
430
-
431
- #: adminpages/discountcodes.php:391 adminpages/discountcodes.php:388
432
- msgid "Leave blank for unlimited uses."
433
- msgstr "Lad dette stå blank, for uendelig brug."
434
-
435
- #: adminpages/discountcodes.php:430 adminpages/membershiplevels.php:339
436
- #: adminpages/membershiplevels.php:515 adminpages/discountcodes.php:427
437
- #: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:507
438
- #: adminpages/membershiplevels.php:513 pages/levels.php:14
439
- msgid "Initial Payment"
440
- msgstr "Begynd Betaling"
441
-
442
- #: adminpages/discountcodes.php:431 adminpages/membershiplevels.php:340
443
- #: adminpages/discountcodes.php:428 adminpages/membershiplevels.php:338
444
- msgid "The initial amount collected at registration."
445
- msgstr "Det påbegyndte beløb, er indsamlet ved registrering."
446
-
447
- #: adminpages/discountcodes.php:435 adminpages/membershiplevels.php:344
448
- #: adminpages/discountcodes.php:432 adminpages/membershiplevels.php:342
449
- msgid "Recurring Subscription"
450
- msgstr "Gentag Abonnoment"
451
-
452
- #: adminpages/discountcodes.php:436 adminpages/membershiplevels.php:345
453
- #: adminpages/discountcodes.php:433 adminpages/membershiplevels.php:343
454
- msgid "Check if this level has a recurring subscription payment."
455
- msgstr "Klik her, hvis dette niveau har en gentagene betaling."
456
-
457
- #: adminpages/discountcodes.php:440 adminpages/membershiplevels.php:349
458
- #: adminpages/membershiplevels.php:347
459
- msgid "Billing Amount"
460
- msgstr "Fakture Beløb"
461
-
462
- #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:492
463
- #: adminpages/membershiplevels.php:355 adminpages/membershiplevels.php:449
464
- #: adminpages/membershiplevels.php:353
465
- msgid "Day(s)"
466
- msgstr "Dag(e)"
467
-
468
- #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:492
469
- #: adminpages/membershiplevels.php:355 adminpages/membershiplevels.php:449
470
- #: adminpages/membershiplevels.php:353
471
- msgid "Month(s)"
472
- msgstr "Måned(er)"
473
-
474
- #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:492
475
- #: adminpages/membershiplevels.php:355 adminpages/membershiplevels.php:449
476
- #: adminpages/membershiplevels.php:353
477
- msgid "Week(s)"
478
- msgstr "Uge(r)"
479
-
480
- #: adminpages/discountcodes.php:446 adminpages/discountcodes.php:492
481
- #: adminpages/membershiplevels.php:355 adminpages/membershiplevels.php:449
482
- #: adminpages/membershiplevels.php:353
483
- msgid "Year(s)"
484
- msgstr "År()"
485
-
486
- #: adminpages/discountcodes.php:454 adminpages/membershiplevels.php:364
487
- #: adminpages/discountcodes.php:451 adminpages/membershiplevels.php:362
488
- msgid "The amount to be billed one cycle after the initial payment."
489
- msgstr ""
490
- "Det beløb, der faktureres den ene cyklus efter den oprindelige betaling."
491
-
492
- #: adminpages/discountcodes.php:459 adminpages/membershiplevels.php:382
493
- #: adminpages/discountcodes.php:456 adminpages/membershiplevels.php:380
494
- msgid "Billing Cycle Limit"
495
- msgstr "Betalings Cyklus Grænse "
496
-
497
- #: adminpages/discountcodes.php:462 adminpages/membershiplevels.php:386
498
- #: adminpages/discountcodes.php:459 adminpages/membershiplevels.php:384
499
- msgid ""
500
- "The <strong>total</strong> number of recurring billing cycles for this "
501
- "level, including the trial period (if applicable) but not including the "
502
- "initial payment. Set to zero if membership is indefinite."
503
- msgstr ""
504
- "Det <strong>totale</strong> antal af gentagende fakture cykluser for dette "
505
- "niveau, herunder prøveperioden (hvis relevant), men ikke inkluderet I den "
506
- "oprindelige betaling. Sæt til nul, hvis medlemskab er ubegrænset."
507
-
508
- #: adminpages/discountcodes.php:467 adminpages/membershiplevels.php:395
509
- #: adminpages/discountcodes.php:464 adminpages/membershiplevels.php:393
510
- msgid "Custom Trial"
511
- msgstr "Brugerdefineret Prøveperiode"
512
-
513
- #: adminpages/discountcodes.php:468 adminpages/membershiplevels.php:397
514
- #: adminpages/discountcodes.php:465 adminpages/membershiplevels.php:394
515
- #: adminpages/membershiplevels.php:395
516
- msgid "Check to add a custom trial period."
517
- msgstr "Klik her, for at tilføje en brugerdefineret prøve periode"
518
-
519
- #: adminpages/discountcodes.php:472 adminpages/membershiplevels.php:406
520
- #: adminpages/discountcodes.php:469 adminpages/membershiplevels.php:398
521
- #: adminpages/membershiplevels.php:404
522
- msgid "Trial Billing Amount"
523
- msgstr "Prøveperiode Fakture konto"
524
-
525
- #: adminpages/discountcodes.php:475 adminpages/membershiplevels.php:409
526
- #: adminpages/discountcodes.php:472 adminpages/membershiplevels.php:401
527
- #: adminpages/membershiplevels.php:407
528
- msgid "for the first"
529
- msgstr "for det første"
530
-
531
- #: adminpages/discountcodes.php:477 adminpages/membershiplevels.php:411
532
- #: adminpages/discountcodes.php:474 adminpages/membershiplevels.php:403
533
- #: adminpages/membershiplevels.php:409
534
- msgid "subscription payments"
535
- msgstr "abonnoments betalings"
536
-
537
- #: adminpages/discountcodes.php:482 adminpages/membershiplevels.php:439
538
- #: adminpages/discountcodes.php:479 adminpages/membershiplevels.php:431
539
- #: adminpages/membershiplevels.php:437
540
- msgid "Membership Expiration"
541
- msgstr "Medlemskab Udløber"
542
-
543
- #: adminpages/discountcodes.php:483 adminpages/membershiplevels.php:440
544
- #: adminpages/membershiplevels.php:432 adminpages/membershiplevels.php:438
545
- msgid "Check this to set when membership access expires."
546
- msgstr "Klik her, for at sætte, hvornår medlemsskab udløber"
547
-
548
- #: adminpages/discountcodes.php:487 adminpages/membershiplevels.php:444
549
- #: adminpages/discountcodes.php:484 adminpages/membershiplevels.php:436
550
- #: adminpages/membershiplevels.php:442
551
- msgid "Expires In"
552
- msgstr "Udløber om"
553
-
554
- #: adminpages/discountcodes.php:500 adminpages/membershiplevels.php:457
555
- #: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:455
556
- msgid ""
557
- "Set the duration of membership access. Note that the any future payments "
558
- "(recurring subscription, if any) will be cancelled when the membership "
559
- "expires."
560
- msgstr ""
561
- "Indstil varigheden af medlemskab. Bemærk, at de eventuelle fremtidige "
562
- "betalinger (tilbagevendende abonnementer, hvis nogen) vil blive annulleret, "
563
- "når medlemskabet udløber."
564
-
565
- #: adminpages/discountcodes.php:528 adminpages/discountcodes.php:525
566
- msgid "Memberships Discount Codes"
567
- msgstr "Medlemsskab Rabat Kode"
568
-
569
- #: adminpages/discountcodes.php:538 adminpages/discountcodes.php:535
570
- msgid "Search Discount Codes"
571
- msgstr "Søg efter Rabat Koder"
572
-
573
- #: adminpages/discountcodes.php:541 adminpages/reports/login.php:81
574
- #: adminpages/discountcodes.php:538
575
- msgid "Search"
576
- msgstr "Søg"
577
-
578
- #: adminpages/discountcodes.php:559 adminpages/discountcodes.php:549
579
- msgid "Starts"
580
- msgstr "Starter"
581
-
582
- #: adminpages/discountcodes.php:560 adminpages/memberslist.php:159
583
- #: adminpages/reports/login.php:145 includes/profile.php:120
584
- #: adminpages/discountcodes.php:550 adminpages/memberslist.php:121
585
- #: includes/profile.php:118
586
- msgid "Expires"
587
- msgstr "Udløber"
588
-
589
- #: adminpages/discountcodes.php:562 adminpages/discountcodes.php:552
590
- msgid "Levels"
591
- msgstr "Niveauer"
592
-
593
- #: adminpages/discountcodes.php:574 adminpages/discountcodes.php:570
594
- msgid "Create your first discount code now"
595
- msgstr "Opret din første Rabat kode nu"
596
-
597
- #: adminpages/discountcodes.php:574 adminpages/discountcodes.php:570
598
- msgid ""
599
- "Discount codes allow you to offer your memberships at discounted prices to "
600
- "select customers."
601
- msgstr ""
602
- "Rabat koder, giver dig mulighed for, at tilbyde medlemmer Rabat priser til "
603
- "udvalgte kunder."
604
-
605
- #: adminpages/discountcodes.php:619 adminpages/membershiplevels.php:572
606
- #: adminpages/orders.php:961 adminpages/discountcodes.php:614
607
- #: adminpages/membershiplevels.php:564 adminpages/membershiplevels.php:570
608
- #: adminpages/orders.php:658
609
- msgid "edit"
610
- msgstr "Redigere"
611
-
612
- #: adminpages/discountcodes.php:622 adminpages/discountcodes.php:617
613
- #, php-format
614
- msgid ""
615
- "Are you sure you want to delete the %s discount code? The subscriptions for "
616
- "existing users will not change, but new users will not be able to use this "
617
- "code anymore."
618
- msgstr ""
619
- "Er du sikker på, at du ville slette %s rabat kode?. Abonnement for den "
620
- "eksisterende bruger ville ikke ændre sig, men nye brugere har ikke mulighed "
621
- "for, at bruge koden."
622
-
623
- #: adminpages/discountcodes.php:622 adminpages/membershiplevels.php:574
624
- #: adminpages/orders.php:967 adminpages/discountcodes.php:617
625
- #: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:572
626
- #: adminpages/orders.php:664
627
- msgid "delete"
628
- msgstr "Slet"
629
-
630
- #: adminpages/emailsettings.php:69 includes/adminpages.php:50
631
- #: includes/adminpages.php:128 adminpages/emailsettings.php:60
632
- #: includes/adminpages.php:12 includes/adminpages.php:59
633
- #: includes/adminpages.php:121
634
- msgid "Email Settings"
635
- msgstr "Email Indstillinger"
636
-
637
- #: adminpages/emailsettings.php:70 adminpages/emailsettings.php:61
638
- msgid ""
639
- "By default, system generated emails are sent from "
640
- "<em><strong>wordpress@yourdomain.com</strong></em>. You can update this from "
641
- "address using the fields below."
642
- msgstr ""
643
- "Som standard, vil systemet generere email sendt fra "
644
- "<em><strong>wordpress@ditdomæne.com</strong></em>. Du har mulighed for, at "
645
- "opdatere adresse, ved at bruge felterne nedenfor. "
646
-
647
- #: adminpages/emailsettings.php:72 adminpages/emailsettings.php:63
648
- msgid ""
649
- "To modify the appearance of system generated emails, add the files "
650
- "<em>email_header.html</em> and <em>email_footer.html</em> to your theme's "
651
- "directory. This will modify both the WordPress default messages as well as "
652
- "messages generated by Paid Memberships Pro. <a title=\"Paid Memberships Pro "
653
- "- Member Communications\" target=\"_blank\" href=\"http://www."
654
- "paidmembershipspro.com/documentation/member-communications/\">Click here to "
655
- "learn more about Paid Memberships Pro emails</a>."
656
- msgstr ""
657
- "Hvis du vil ændre udseendet af systemet genererede e-mails, tilføje filerne "
658
- "<em>email_header.html</em> og <em>email_footer.html</em> til din tema mappe. "
659
- "Dette vil ændre både WordPress standard beskeder samt meddelelser genereres "
660
- "af Paid Memberships Pro.<a title=\"Paid medlemskaber Pro - Medlber "
661
- "Communications\" target=\"_blank\" href=\"http://www.paidmembershipspro.com/"
662
- "documentation/member-communications/\">Klik her for at lære mere om Paid "
663
- "Memberships Pro emails</a>."
664
-
665
- #: adminpages/emailsettings.php:78 adminpages/emailsettings.php:69
666
- msgid "From Email"
667
- msgstr "Fra Email"
668
-
669
- #: adminpages/emailsettings.php:86 adminpages/emailsettings.php:77
670
- msgid "From Name"
671
- msgstr "Fra Navn"
672
-
673
- #: adminpages/emailsettings.php:94
674
- msgid "Only Filter PMPro Emails?"
675
- msgstr "Filtere Kun PMPro Emails?"
676
-
677
- #: adminpages/emailsettings.php:98
678
- msgid "If unchecked, all emails from \"WordPress &lt;"
679
- msgstr "Hvis ikke aktiveret, alle emails fra \"WordPress &lt;"
680
-
681
- #: adminpages/emailsettings.php:115 adminpages/emailsettings.php:86
682
- #: adminpages/emailsettings.php:104
683
- msgid "Send the site admin emails"
684
- msgstr "Send site admin emails"
685
-
686
- #: adminpages/emailsettings.php:121 adminpages/emailsettings.php:92
687
- #: adminpages/emailsettings.php:110
688
- msgid "Checkout"
689
- msgstr "Gå til Kassen"
690
-
691
- #: adminpages/emailsettings.php:125 adminpages/emailsettings.php:96
692
- #: adminpages/emailsettings.php:114
693
- msgid "when a member checks out."
694
- msgstr "Når et medlem går til Kassen"
695
-
696
- #: adminpages/emailsettings.php:130 adminpages/emailsettings.php:101
697
- #: adminpages/emailsettings.php:119
698
- msgid "Admin Changes"
699
- msgstr "Admin Ændringer"
700
-
701
- #: adminpages/emailsettings.php:134 adminpages/emailsettings.php:105
702
- #: adminpages/emailsettings.php:123
703
- msgid "when an admin changes a user's membership level through the dashboard."
704
- msgstr "Når en admin ændre en bruger's medlemsskab niveau gennem kontrolpanel."
705
-
706
- #: adminpages/emailsettings.php:139 adminpages/emailsettings.php:110
707
- #: adminpages/emailsettings.php:128
708
- msgid "Cancellation"
709
- msgstr "Annullering"
710
-
711
- #: adminpages/emailsettings.php:143 adminpages/emailsettings.php:114
712
- #: adminpages/emailsettings.php:132
713
- msgid "when a user cancels his or her account."
714
- msgstr "når en bruger annullere hans eller hendes konto."
715
-
716
- #: adminpages/emailsettings.php:148 adminpages/emailsettings.php:119
717
- #: adminpages/emailsettings.php:137
718
- msgid "Bill Updates"
719
- msgstr "Fakture Opdates"
720
-
721
- #: adminpages/emailsettings.php:152 adminpages/emailsettings.php:123
722
- #: adminpages/emailsettings.php:141
723
- msgid "when a user updates his or her billing information."
724
- msgstr "når en bruger opdatere hans eller hendes betalings informationer."
725
-
726
- #: adminpages/emailsettings.php:158 adminpages/emailsettings.php:129
727
- #: adminpages/emailsettings.php:147
728
- msgid "Send members emails"
729
- msgstr "Send medlemmers email"
730
-
731
- #: adminpages/emailsettings.php:164 adminpages/emailsettings.php:135
732
- #: adminpages/emailsettings.php:153
733
- msgid "New Users"
734
- msgstr "Nye Brugere"
735
-
736
- #: adminpages/emailsettings.php:168 adminpages/emailsettings.php:139
737
- #: adminpages/emailsettings.php:157
738
- msgid ""
739
- "Default WP notification email. (Recommended: Leave unchecked. Members will "
740
- "still get an email confirmation from PMPro after checkout.)"
741
- msgstr ""
742
- "Standard WP notifikations email. (Anbefales: Ikke Aktiveret. Medlemmer vil "
743
- "stadig få email bekræftigelse fra PMPRO efter de har været kassen.)"
744
-
745
- #: adminpages/membershiplevels.php:118
746
- msgid "Membership level updated successfully."
747
- msgstr "Medlemsskab Niveau opdateret succesfuldt."
748
-
749
- #: adminpages/membershiplevels.php:124
750
- msgid "Error updating membership level."
751
- msgstr "Fejl I opdatering af medlemsskab niveau."
752
-
753
- #: adminpages/membershiplevels.php:141
754
- msgid "Membership level added successfully."
755
- msgstr "Medlemsskab niveau tilføjet succesfuldt."
756
-
757
- #: adminpages/membershiplevels.php:146
758
- msgid "Error adding membership level."
759
- msgstr "Fejl I at tilføje medlemskabs niveau."
760
-
761
- #: adminpages/membershiplevels.php:181 adminpages/membershiplevels.php:179
762
- #, php-format
763
- msgid ""
764
- "There was an error canceling the subscription for user with ID=%d. You will "
765
- "want to check your payment gateway to see if their subscription is still "
766
- "active."
767
- msgstr ""
768
- "Der opstod en fejl, med annullering af abonnement for bruger med ID=%d. Du "
769
- "bliver nødtil at kontrollere din betalings gateway, for at se, om deres "
770
- "betaling stadig er aktiv. "
771
-
772
- #: adminpages/membershiplevels.php:184 adminpages/membershiplevels.php:182
773
- msgid "Last Invoice"
774
- msgstr "Sidste Faktura"
775
-
776
- #: adminpages/membershiplevels.php:198 adminpages/membershiplevels.php:196
777
- msgid "Membership level deleted successfully."
778
- msgstr "Medlemskabs niveau slettet succesfuldt."
779
-
780
- #: adminpages/membershiplevels.php:203 adminpages/membershiplevels.php:209
781
- #: adminpages/membershiplevels.php:201 adminpages/membershiplevels.php:207
782
- msgid "Error deleting membership level."
783
- msgstr "Fejl I at slette medlemsskab niveau."
784
-
785
- #: adminpages/membershiplevels.php:224 adminpages/membershiplevels.php:222
786
- msgid "Edit Membership Level"
787
- msgstr "Redigere medlemsskab niveau"
788
-
789
- #: adminpages/membershiplevels.php:226 adminpages/membershiplevels.php:224
790
- msgid "Add New Membership Level"
791
- msgstr "Tilføj Ny Medlemsskab Niveau"
792
-
793
- #: adminpages/membershiplevels.php:293 adminpages/membershiplevels.php:514
794
- #: adminpages/reports/login.php:142 adminpages/membershiplevels.php:291
795
- #: adminpages/membershiplevels.php:506 adminpages/membershiplevels.php:512
796
- msgid "Name"
797
- msgstr "Navn"
798
-
799
- #: adminpages/membershiplevels.php:298 adminpages/membershiplevels.php:296
800
- msgid "Description"
801
- msgstr "Beskrivelse"
802
-
803
- #: adminpages/membershiplevels.php:316 adminpages/membershiplevels.php:314
804
- msgid "Confirmation Message"
805
- msgstr "Bekræftigelses Besked"
806
-
807
- #: adminpages/membershiplevels.php:335 adminpages/membershiplevels.php:333
808
- msgid "Billing Details"
809
- msgstr "Faktura Detaljer"
810
-
811
- #: adminpages/membershiplevels.php:351 adminpages/membershiplevels.php:349
812
- msgid "per"
813
- msgstr "pr"
814
-
815
- #: adminpages/membershiplevels.php:366
816
- msgid ""
817
- "Stripe integration currently only supports billing periods of \"Week\", "
818
- "\"Month\" or \"Year\"."
819
- msgstr ""
820
- "Stripe integration understøtter kun Faktura af \"Uge\", \"Måned\" eller \"År"
821
- "\"."
822
-
823
- #: adminpages/membershiplevels.php:368 adminpages/membershiplevels.php:366
824
- msgid ""
825
- "Braintree integration currently only supports billing periods of \"Month\" "
826
- "or \"Year\"."
827
- msgstr ""
828
- "Braintree integration understøtter kun Faktura af \"Uge\", \"Måned\" eller "
829
- "\"År\"."
830
-
831
- #: adminpages/membershiplevels.php:370 adminpages/membershiplevels.php:368
832
- msgid ""
833
- "Payflow integration currently only supports billing frequencies of 1 and "
834
- "billing periods of \"Week\", \"Month\" or \"Year\"."
835
- msgstr ""
836
- "Payflow integration understøtter kun Faktura frekvens af og faktura periode "
837
- "af \"Uge\", \"Måned\" eller \"År\"."
838
-
839
- #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:372
840
- msgid ""
841
- "After saving this level, make note of the ID and create a \"Plan\" in your "
842
- "Braintree dashboard with the same settings and the \"Plan ID\" set to "
843
- "<em>pmpro_#</em>, where # is the level ID."
844
- msgstr ""
845
- "Efter at gemme dette niveau, lav en note af ID og opret en \"Plan\" i dit "
846
- "Braintree kontrolpanel, med det samme indstillinger, og at \"Plan ID\" er "
847
- "sat til <em>pmpro_#</em>, hvor # er niveau ID."
848
-
849
- #: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376
850
- #: adminpages/paymentsettings.php:174 adminpages/paymentsettings.php:179
851
- #: adminpages/membershiplevels.php:372 adminpages/paymentsettings.php:170
852
- msgid "Note"
853
- msgstr "Note"
854
-
855
- #: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:374
856
- msgid ""
857
- "You will need to create a \"Plan\" in your Braintree dashboard with the same "
858
- "settings and the \"Plan ID\" set to"
859
- msgstr ""
860
- "Du er nødtil at oprette en \"Plan\" i dit Braintree kontrolpanel med de "
861
- "samme indstillinger og hvor \"Plan ID\" er sat til"
862
-
863
- #: adminpages/membershiplevels.php:388 adminpages/membershiplevels.php:386
864
- msgid ""
865
- "Stripe integration currently does not support billing limits. You can still "
866
- "set an expiration date below."
867
- msgstr ""
868
- "Stripe integration understøtter ikke faktura begræsninger. Du kan stadig "
869
- "sætte en udløbsdato på nedenfor."
870
-
871
- #: adminpages/membershiplevels.php:400 adminpages/membershiplevels.php:398
872
- msgid ""
873
- "2Checkout integration does not support custom trials. You can do one period "
874
- "trials by setting an initial payment different from the billing amount."
875
- msgstr ""
876
- "2Checkout integration understøtter ikke brugerdefineret prøveperiode. Du kan "
877
- "lave en prøveperiode via indstillinger, og sætte betalings mulighed til en "
878
- "anden fakture."
879
-
880
- #: adminpages/membershiplevels.php:414 adminpages/membershiplevels.php:406
881
- #: adminpages/membershiplevels.php:412
882
- msgid ""
883
- "Stripe integration currently does not support trial amounts greater than $0."
884
- msgstr ""
885
- "Stripe integration understøtter ikke prøveperioder der er større en $0."
886
-
887
- #: adminpages/membershiplevels.php:418 adminpages/membershiplevels.php:410
888
- #: adminpages/membershiplevels.php:416
889
- msgid ""
890
- "Braintree integration currently does not support trial amounts greater than "
891
- "$0."
892
- msgstr "Braintree integration understøtter prøveperioder der er større end $0."
893
-
894
- #: adminpages/membershiplevels.php:422 adminpages/membershiplevels.php:414
895
- #: adminpages/membershiplevels.php:420
896
- msgid ""
897
- "Payflow integration currently does not support trial amounts greater than $0."
898
- msgstr ""
899
- "Payflow integration understøtter ikke prøveåerioder der er større end $0."
900
-
901
- #: adminpages/membershiplevels.php:430 adminpages/membershiplevels.php:422
902
- #: adminpages/membershiplevels.php:428
903
- msgid "Other Settings"
904
- msgstr "Andre Indstillinger"
905
-
906
- #: adminpages/membershiplevels.php:434 adminpages/membershiplevels.php:426
907
- #: adminpages/membershiplevels.php:432
908
- msgid "Disable New Signups"
909
- msgstr "Deaktivere Nye Tilmeldinger"
910
-
911
- #: adminpages/membershiplevels.php:435 adminpages/membershiplevels.php:427
912
- #: adminpages/membershiplevels.php:433
913
- msgid ""
914
- "Check to hide this level from the membership levels page and disable "
915
- "registration."
916
- msgstr ""
917
- "Klik her, for at skjule dette Niveau fra medlemsskabs Niveau side, og "
918
- "deaktivere registrering."
919
-
920
- #: adminpages/membershiplevels.php:465 adminpages/membershiplevels.php:457
921
- #: adminpages/membershiplevels.php:463
922
- msgid "Content Settings"
923
- msgstr "Indhols Indstillinger"
924
-
925
- #: adminpages/membershiplevels.php:469 adminpages/membershiplevels.php:461
926
- #: adminpages/membershiplevels.php:467
927
- msgid "Categories"
928
- msgstr "Kategorier"
929
-
930
- #: adminpages/membershiplevels.php:498 adminpages/membershiplevels.php:490
931
- #: adminpages/membershiplevels.php:496
932
- msgid "Add New Level"
933
- msgstr "Tilføj Ny Niveau"
934
-
935
- #: adminpages/membershiplevels.php:501 adminpages/membershiplevels.php:504
936
- #: adminpages/membershiplevels.php:493 adminpages/membershiplevels.php:496
937
- #: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:502
938
- msgid "Search Levels"
939
- msgstr "Søg Niveauer"
940
-
941
- #: adminpages/membershiplevels.php:516 adminpages/membershiplevels.php:508
942
- #: adminpages/membershiplevels.php:514
943
- msgid "Billing Cycle"
944
- msgstr "Faktura Cyklus"
945
-
946
- #: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:509
947
- #: adminpages/membershiplevels.php:515
948
- msgid "Trial Cycle"
949
- msgstr "Prøveperiode Cyklus"
950
-
951
- #: adminpages/membershiplevels.php:518 pages/confirmation.php:83
952
- #: pages/invoice.php:70 adminpages/membershiplevels.php:510
953
- #: adminpages/membershiplevels.php:516 pages/confirmation.php:81
954
- #: pages/invoice.php:68
955
- msgid "Expiration"
956
- msgstr "Udløbs"
957
-
958
- #: adminpages/membershiplevels.php:519 adminpages/membershiplevels.php:511
959
- #: adminpages/membershiplevels.php:517
960
- msgid "Allow Signups"
961
- msgstr "Tillad Registrering"
962
-
963
- #: adminpages/membershiplevels.php:542 adminpages/membershiplevels.php:534
964
- #: adminpages/membershiplevels.php:540
965
- msgid "FREE"
966
- msgstr "GRATIS"
967
-
968
- #: adminpages/membershiplevels.php:551 adminpages/membershiplevels.php:543
969
- #: adminpages/membershiplevels.php:549
970
- msgid "every"
971
- msgstr "alle"
972
-
973
- #: adminpages/membershiplevels.php:553 adminpages/membershiplevels.php:561
974
- #: adminpages/reports/memberships.php:304
975
- #: adminpages/reports/memberships.php:315 adminpages/reports/sales.php:203
976
- #: adminpages/reports/sales.php:214 adminpages/membershiplevels.php:545
977
- #: adminpages/membershiplevels.php:551 adminpages/membershiplevels.php:559
978
- #: adminpages/reports/sales.php:195 adminpages/reports/sales.php:204
979
- #: adminpages/reports/sales.php:206 adminpages/reports/sales.php:215
980
- msgid "for"
981
- msgstr "for"
982
-
983
- #: adminpages/membershiplevels.php:568 adminpages/membershiplevels.php:560
984
- #: adminpages/membershiplevels.php:566
985
- msgid "After"
986
- msgstr "Efter"
987
-
988
- #: adminpages/membershiplevels.php:573 adminpages/orders.php:964
989
- #: adminpages/membershiplevels.php:565 adminpages/membershiplevels.php:571
990
- #: adminpages/orders.php:661
991
- msgid "copy"
992
- msgstr "Kopiere"
993
-
994
- #: adminpages/membershiplevels.php:574 adminpages/membershiplevels.php:566
995
- #: adminpages/membershiplevels.php:572
996
- #, php-format
997
- msgid ""
998
- "Are you sure you want to delete membership level %s? All subscriptions will "
999
- "be cancelled."
1000
- msgstr ""
1001
- "Er du sikker på, at du ville slette medlemsskab niveau %s? Alle abonnenter "
1002
- "ville blive annulleret."
1003
-
1004
- #: adminpages/memberslist.php:25 includes/adminpages.php:53
1005
- #: includes/adminpages.php:149 includes/adminpages.php:15
1006
- #: includes/adminpages.php:74 includes/adminpages.php:142
1007
- msgid "Members List"
1008
- msgstr "Medlems Liste"
1009
-
1010
- #: adminpages/memberslist.php:26 adminpages/orders.php:591
1011
- #: adminpages/orders.php:522
1012
- msgid "Export to CSV"
1013
- msgstr "Eksportere til CSV"
1014
-
1015
- #: adminpages/memberslist.php:30 adminpages/orders.php:603
1016
- #: adminpages/reports/login.php:65 adminpages/reports/memberships.php:292
1017
- #: adminpages/reports/sales.php:193 adminpages/reports/sales.php:185
1018
- #: adminpages/reports/sales.php:194
1019
- msgid "Show"
1020
- msgstr "Vis"
1021
-
1022
- #: adminpages/memberslist.php:32 adminpages/reports/login.php:67
1023
- #: adminpages/reports/memberships.php:317 adminpages/reports/sales.php:216
1024
- #: adminpages/reports/sales.php:208 adminpages/reports/sales.php:217
1025
- msgid "All Levels"
1026
- msgstr "All Niveauer"
1027
-
1028
- #: adminpages/memberslist.php:42
1029
- msgid "Old Members"
1030
- msgstr "Gamle Medlemmer"
1031
-
1032
- #: adminpages/memberslist.php:47 adminpages/memberslist.php:50
1033
- #: adminpages/memberslist.php:46 adminpages/memberslist.php:49
1034
- msgid "Search Members"
1035
- msgstr "Søg Medlemmer"
1036
-
1037
- #: adminpages/memberslist.php:136 adminpages/memberslist.php:103
1038
- #, php-format
1039
- msgid "%d members found."
1040
- msgstr "%d medlemmer fundet."
1041
-
1042
- #: adminpages/memberslist.php:145 pages/account.php:55 pages/checkout.php:171
1043
- #: adminpages/memberslist.php:112 pages/account.php:51 pages/checkout.php:168
1044
- msgid "Username"
1045
- msgstr "Brugernavn"
1046
-
1047
- #: adminpages/memberslist.php:146 adminpages/memberslist.php:113
1048
- msgid "First&nbsp;Name"
1049
- msgstr "For&nbsp;Navn"
1050
-
1051
- #: adminpages/memberslist.php:147 adminpages/memberslist.php:114
1052
- msgid "Last&nbsp;Name"
1053
- msgstr "Efter&nbsp;Navn"
1054
-
1055
- #: adminpages/memberslist.php:150 pages/account.php:94 pages/billing.php:62
1056
- #: pages/checkout.php:298 pages/confirmation.php:61 pages/invoice.php:48
1057
- #: adminpages/memberslist.php:117 pages/account.php:90 pages/billing.php:58
1058
- #: pages/checkout.php:314 pages/checkout.php:321 pages/confirmation.php:59
1059
- #: pages/invoice.php:46
1060
- msgid "Billing Address"
1061
- msgstr "Fakture Addresse"
1062
-
1063
- #: adminpages/memberslist.php:151 adminpages/reports/login.php:143
1064
- #: classes/gateways/class.pmprogateway_authorizenet.php:187
1065
- #: adminpages/memberslist.php:118 adminpages/pagesettings.php:51
1066
- msgid "Membership"
1067
- msgstr "Medlemsskab"
1068
-
1069
- #: adminpages/memberslist.php:152 adminpages/memberslist.php:119
1070
- msgid "Fee"
1071
- msgstr "Gebyr"
1072
-
1073
- #: adminpages/memberslist.php:153 adminpages/reports/login.php:144
1074
- #: adminpages/memberslist.php:120
1075
- msgid "Joined"
1076
- msgstr "Forbundet"
1077
-
1078
- #: adminpages/memberslist.php:157
1079
- msgid "Ended"
1080
- msgstr "Sluttet"
1081
-
1082
- #: adminpages/memberslist.php:223 adminpages/reports/login.php:210
1083
- #: adminpages/memberslist.php:195
1084
- msgid "No members found."
1085
- msgstr "Ingen Medlemmer fundet."
1086
-
1087
- #: adminpages/memberslist.php:223 adminpages/reports/login.php:210
1088
- #: adminpages/memberslist.php:195
1089
- msgid "Search all levels"
1090
- msgstr "Søg efter Niveauer"
1091
-
1092
- #: adminpages/orders.php:67 adminpages/orders.php:26
1093
- msgid "Order deleted successfully."
1094
- msgstr "Ordre blev slettet succesfuldt."
1095
-
1096
- #: adminpages/orders.php:72 adminpages/orders.php:31
1097
- msgid "Error deleting order."
1098
- msgstr "Fejl i at slette ordre."
1099
-
1100
- #: adminpages/orders.php:169 adminpages/orders.php:119
1101
- msgid "Order saved successfully."
1102
- msgstr "Ordre gent succesfuldt."
1103
-
1104
- #: adminpages/orders.php:174 adminpages/orders.php:124
1105
- msgid "Error updating order timestamp."
1106
- msgstr "Fejl i at opdatere tidsstempel ordre."
1107
-
1108
- #: adminpages/orders.php:180 adminpages/orders.php:130
1109
- msgid "Error saving order."
1110
- msgstr "Fejl i at gemme ordre."
1111
-
1112
- #: adminpages/orders.php:245 adminpages/orders.php:195
1113
- msgid "Order"
1114
- msgstr "Ordre"
1115
-
1116
- #: adminpages/orders.php:247 adminpages/orders.php:197
1117
- msgid "New Order"
1118
- msgstr "Ny Ordre"
1119
-
1120
- #: adminpages/orders.php:270 adminpages/orders.php:220
1121
- msgid "Randomly generated for you."
1122
- msgstr "Tilfældig genereret kun for dig"
1123
-
1124
- #: adminpages/orders.php:275 adminpages/orders.php:225
1125
- msgid "User ID"
1126
- msgstr "Bruger ID"
1127
-
1128
- #: adminpages/orders.php:284 adminpages/orders.php:234
1129
- msgid "Membership Level ID"
1130
- msgstr "Medlems Niveau ID"
1131
-
1132
- #: adminpages/orders.php:293 adminpages/orders.php:243
1133
- msgid "Billing Name"
1134
- msgstr "Faktura Navn"
1135
-
1136
- #: adminpages/orders.php:301 adminpages/orders.php:251
1137
- msgid "Billing Street"
1138
- msgstr "Faktura Vej"
1139
-
1140
- #: adminpages/orders.php:308 adminpages/orders.php:258
1141
- msgid "Billing City"
1142
- msgstr "Faktura By"
1143
-
1144
- #: adminpages/orders.php:315 adminpages/orders.php:265
1145
- msgid "Billing State"
1146
- msgstr "Faktura Region"
1147
-
1148
- #: adminpages/orders.php:322 adminpages/orders.php:272
1149
- msgid "Billing Postal Code"
1150
- msgstr "Faktura Post Nummer"
1151
-
1152
- #: adminpages/orders.php:329 adminpages/orders.php:279
1153
- msgid "Billing Country"
1154
- msgstr "Faktura Land"
1155
-
1156
- #: adminpages/orders.php:337 adminpages/orders.php:287
1157
- msgid "Billing Phone"
1158
- msgstr "Faktura Telefon"
1159
-
1160
- #: adminpages/orders.php:346 adminpages/orders.php:296
1161
- msgid "Sub Total"
1162
- msgstr "Subtotal"
1163
-
1164
- #: adminpages/orders.php:354 pages/invoice.php:80 adminpages/orders.php:304
1165
- #: pages/invoice.php:78
1166
- msgid "Tax"
1167
- msgstr "Skat"
1168
-
1169
- #: adminpages/orders.php:362 adminpages/orders.php:312
1170
- msgid "Coupon Amount"
1171
- msgstr "Rabat Beløb"
1172
-
1173
- #: adminpages/orders.php:370 adminpages/orders.php:905 pages/invoice.php:84
1174
- #: adminpages/orders.php:320 adminpages/orders.php:602 pages/invoice.php:82
1175
- msgid "Total"
1176
- msgstr "Total"
1177
-
1178
- #: adminpages/orders.php:375 adminpages/orders.php:325
1179
- msgid "Should be subtotal + tax - couponamount."
1180
- msgstr "Skulle være subtotal + skat - rabat beløb"
1181
-
1182
- #: adminpages/orders.php:380 adminpages/orders.php:330
1183
- msgid "Payment Type"
1184
- msgstr "Betalings Type"
1185
-
1186
- #: adminpages/orders.php:385 adminpages/orders.php:335
1187
- msgid "e.g. PayPal Express, PayPal Standard, Credit Card."
1188
- msgstr "e.g. PayPal Express, PayPal Standard. Kreditkort."
1189
-
1190
- #: adminpages/orders.php:389 pages/billing.php:238 pages/checkout.php:493
1191
- #: adminpages/orders.php:339 pages/billing.php:234 pages/checkout.php:510
1192
- #: pages/checkout.php:517
1193
- msgid "Card Type"
1194
- msgstr "Kort Type"
1195
-
1196
- #: adminpages/orders.php:394 adminpages/orders.php:344
1197
- msgid "e.g. Visa, MasterCard, AMEX, etc"
1198
- msgstr "e.g Visa, MasterCard. AMEX, etc"
1199
-
1200
- #: adminpages/orders.php:398 adminpages/paymentsettings.php:352
1201
- #: adminpages/orders.php:348 adminpages/paymentsettings.php:347
1202
- msgid "Account Number"
1203
- msgstr "Konto Nummer"
1204
-
1205
- #: adminpages/orders.php:403 adminpages/orders.php:353
1206
- msgid "Obscure all but last 4 digits."
1207
- msgstr "Skjul alle personlige oplysninger, undtagen de sidste 4 cifre"
1208
-
1209
- #: adminpages/orders.php:408 adminpages/orders.php:358
1210
- msgid "Expiration Month"
1211
- msgstr "Udløbs Måned"
1212
-
1213
- #: adminpages/orders.php:415 adminpages/orders.php:365
1214
- msgid "Expiration Year"
1215
- msgstr "Udløbs År"
1216
-
1217
- #: adminpages/orders.php:423 adminpages/orders.php:909
1218
- #: adminpages/orders.php:373 adminpages/orders.php:606
1219
- msgid "Status"
1220
- msgstr "Status"
1221
-
1222
- #: adminpages/orders.php:444 adminpages/orders.php:907
1223
- #: adminpages/orders.php:394 adminpages/orders.php:604
1224
- msgid "Gateway"
1225
- msgstr "Gateway"
1226
-
1227
- #: adminpages/orders.php:448 adminpages/orders.php:398
1228
- msgid "Testing Only"
1229
- msgstr "Kun for Test"
1230
-
1231
- #: adminpages/orders.php:449 adminpages/paymentsettings.php:159
1232
- #: adminpages/orders.php:399 adminpages/paymentsettings.php:157
1233
- msgid "Pay by Check"
1234
- msgstr "Betal med Check"
1235
-
1236
- #: adminpages/orders.php:461 adminpages/paymentsettings.php:184
1237
- #: adminpages/orders.php:411 adminpages/paymentsettings.php:175
1238
- #: adminpages/paymentsettings.php:179
1239
- msgid "Gateway Environment"
1240
- msgstr "Gateway Miljø"
1241
-
1242
- #: adminpages/orders.php:465 adminpages/paymentsettings.php:188
1243
- #: adminpages/orders.php:415 adminpages/paymentsettings.php:179
1244
- #: adminpages/paymentsettings.php:183
1245
- msgid "Sandbox/Testing"
1246
- msgstr "Sandkasse/Test"
1247
-
1248
- #: adminpages/orders.php:466 adminpages/paymentsettings.php:189
1249
- #: adminpages/orders.php:416 adminpages/paymentsettings.php:180
1250
- #: adminpages/paymentsettings.php:184
1251
- msgid "Live/Production"
1252
- msgstr "Live/Produktion"
1253
-
1254
- #: adminpages/orders.php:473 adminpages/orders.php:423
1255
- msgid "Payment Transaction ID"
1256
- msgstr "Betalings Transaktions ID"
1257
-
1258
- #: adminpages/orders.php:478 adminpages/orders.php:428
1259
- msgid "Generated by the gateway. Useful to cross reference orders."
1260
- msgstr "Genereret af Gateway. Nyttigt til at krydse referencer med ordre."
1261
-
1262
- #: adminpages/orders.php:482 adminpages/orders.php:432
1263
- msgid "Subscription Transaction ID"
1264
- msgstr "Abonnoments Transaktion ID"
1265
-
1266
- #: adminpages/orders.php:487 adminpages/orders.php:437
1267
- msgid "Generated by the gateway. Useful to cross reference subscriptions."
1268
- msgstr ""
1269
- "Genereret af Gateway. Nyttigt til at krydse referencer med abonnomenter. "
1270
-
1271
- #: adminpages/orders.php:492 adminpages/orders.php:910 pages/invoice.php:107
1272
- #: adminpages/orders.php:442 adminpages/orders.php:607 pages/invoice.php:105
1273
- msgid "Date"
1274
- msgstr "Dato"
1275
-
1276
- #: adminpages/orders.php:527 adminpages/orders.php:477
1277
- msgid "Affiliate ID"
1278
- msgstr "Assosieret ID"
1279
-
1280
- #: adminpages/orders.php:535 adminpages/orders.php:485
1281
- msgid "Affiliate SubID"
1282
- msgstr "Assosieret SubID"
1283
-
1284
- #: adminpages/orders.php:545 adminpages/orders.php:495
1285
- msgid "Notes"
1286
- msgstr "Noter"
1287
-
1288
- #: adminpages/orders.php:560 adminpages/orders.php:510
1289
- msgid "Save Order"
1290
- msgstr "Gem Ordre"
1291
-
1292
- #: adminpages/orders.php:561 pages/billing.php:330 adminpages/orders.php:511
1293
- #: pages/billing.php:295 pages/billing.php:299
1294
- msgid "Cancel"
1295
- msgstr "Annullere"
1296
-
1297
- #: adminpages/orders.php:570 includes/adminpages.php:55
1298
- #: includes/adminpages.php:163 adminpages/orders.php:520
1299
- #: includes/adminpages.php:17 includes/adminpages.php:84
1300
- #: includes/adminpages.php:156
1301
- msgid "Orders"
1302
- msgstr "Ordrer"
1303
-
1304
- #: adminpages/orders.php:571 adminpages/orders.php:521
1305
- msgid "Add New Order"
1306
- msgstr "Tilføj Ny Ordrer"
1307
-
1308
- #: adminpages/orders.php:605
1309
- msgid "All"
1310
- msgstr "Alle"
1311
-
1312
- #: adminpages/orders.php:606
1313
- msgid "Within a Date Range"
1314
- msgstr "Inden for et datointerval"
1315
-
1316
- #: adminpages/orders.php:607
1317
- msgid "Predefined Date Range"
1318
- msgstr "Foruddefineret datointerval"
1319
-
1320
- #: adminpages/orders.php:608
1321
- msgid "Within a Level"
1322
- msgstr "Indenfor et Niveau"
1323
-
1324
- #: adminpages/orders.php:609
1325
- msgid "Within a Status"
1326
- msgstr "Indenfor en Status"
1327
-
1328
- #: adminpages/orders.php:612
1329
- msgid "From"
1330
- msgstr "Fra"
1331
-
1332
- #: adminpages/orders.php:624
1333
- msgid "To"
1334
- msgstr "Til"
1335
-
1336
- #: adminpages/orders.php:636
1337
- msgid "filter by "
1338
- msgstr "Filtreret af"
1339
-
1340
- #: adminpages/orders.php:674
1341
- msgid "Filter"
1342
- msgstr "Filtreret"
1343
-
1344
- #: adminpages/orders.php:777 adminpages/orders.php:780
1345
- #: adminpages/orders.php:535 adminpages/orders.php:538
1346
- msgid "Search Orders"
1347
- msgstr "Søg Ordrer"
1348
-
1349
- #: adminpages/orders.php:893 adminpages/orders.php:590
1350
- #, php-format
1351
- msgid "%d orders found."
1352
- msgstr "%d ordre fundet."
1353
-
1354
- #: adminpages/orders.php:902 adminpages/paymentsettings.php:220
1355
- #: adminpages/reports/login.php:141 adminpages/orders.php:599
1356
- #: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:215
1357
- msgid "User"
1358
- msgstr "Bruger"
1359
-
1360
- #: adminpages/orders.php:904 includes/profile.php:27 pages/checkout.php:33
1361
- #: pages/confirmation.php:47 pages/confirmation.php:64
1362
- #: pages/confirmation.php:105 pages/invoice.php:28 pages/invoice.php:51
1363
- #: adminpages/orders.php:601 includes/profile.php:25 pages/checkout.php:34
1364
- #: pages/confirmation.php:46 pages/confirmation.php:62
1365
- #: pages/confirmation.php:103 pages/invoice.php:27 pages/invoice.php:49
1366
- msgid "Membership Level"
1367
- msgstr "Medlems Niveau"
1368
-
1369
- #: adminpages/orders.php:906 adminpages/orders.php:954
1370
- #: adminpages/orders.php:603 adminpages/orders.php:651
1371
- msgid "Payment"
1372
- msgstr "Betaling"
1373
-
1374
- #: adminpages/orders.php:908 adminpages/orders.php:605
1375
- msgid "Transaction IDs"
1376
- msgstr "Transaktion ID'er"
1377
-
1378
- #: adminpages/orders.php:933 adminpages/orders.php:630
1379
- msgid "deleted"
1380
- msgstr "slettet"
1381
-
1382
- #: adminpages/orders.php:956 adminpages/orders.php:653
1383
- msgid "Subscription"
1384
- msgstr "Abonnoment"
1385
-
1386
- #: adminpages/orders.php:967 adminpages/orders.php:664
1387
- #, php-format
1388
- msgid ""
1389
- "Deleting orders is permanent and can affect active users. Are you sure you "
1390
- "want to delete order %s?"
1391
- msgstr ""
1392
- "Slette ordrer er permanent og kan ikke påvirke aktive brugere. Er du sikker "
1393
- "på, at du ville slette ordrer %s?"
1394
-
1395
- #: adminpages/orders.php:977 adminpages/orders.php:674
1396
- msgid "No orders found."
1397
- msgstr "Ingen ordrer fundet."
1398
-
1399
- #: adminpages/pagesettings.php:51
1400
- msgid "Membership Account"
1401
- msgstr "Medlems Konto"
1402
-
1403
- #: adminpages/pagesettings.php:54
1404
- msgid "Membership Billing"
1405
- msgstr "Medlems Regning"
1406
-
1407
- #: adminpages/pagesettings.php:57
1408
- msgid "Membership Cancel"
1409
- msgstr "Medlems Annullering"
1410
-
1411
- #: adminpages/pagesettings.php:60
1412
- msgid "Membership Checkout"
1413
- msgstr "Medlems Gå til Kassen"
1414
-
1415
- #: adminpages/pagesettings.php:63
1416
- msgid "Membership Confirmation"
1417
- msgstr "Medlems Bekræftigelse"
1418
-
1419
- #: adminpages/pagesettings.php:66
1420
- msgid "Membership Invoice"
1421
- msgstr "Medlems Faktura"
1422
-
1423
- #: adminpages/pagesettings.php:73
1424
- #, php-format
1425
- msgid "Membership %s"
1426
- msgstr "Medlems %s"
1427
-
1428
- #: adminpages/pagesettings.php:111 adminpages/pagesettings.php:83
1429
- msgid "The following pages have been created for you"
1430
- msgstr "De følgende sider, er bleven oprettet for dig"
1431
-
1432
- #: adminpages/pagesettings.php:126 adminpages/pagesettings.php:98
1433
- msgid ""
1434
- "Manage the WordPress pages assigned to each required Paid Memberships Pro "
1435
- "page."
1436
- msgstr ""
1437
- "Håndtere Wordpress sider, som er tildelt og påkrævet til hver Paid "
1438
- "Memberships Pro sider eller."
1439
-
1440
- #: adminpages/pagesettings.php:132 adminpages/pagesettings.php:104
1441
- msgid ""
1442
- "Assign the WordPress pages for each required Paid Memberships Pro page or"
1443
- msgstr ""
1444
- "Tildel Wordpress sider, til hver påkrævet Paid Memberships Pro sider eller"
1445
-
1446
- #: adminpages/pagesettings.php:132 adminpages/pagesettings.php:104
1447
- msgid "click here to let us generate them for you"
1448
- msgstr "Klik her, for at lade dem generere dem for dig"
1449
-
1450
- #: adminpages/pagesettings.php:140 adminpages/pagesettings.php:112
1451
- msgid "Account Page"
1452
- msgstr "Konto Side"
1453
-
1454
- #: adminpages/pagesettings.php:147 adminpages/pagesettings.php:162
1455
- #: adminpages/pagesettings.php:177 adminpages/pagesettings.php:193
1456
- #: adminpages/pagesettings.php:209 adminpages/pagesettings.php:225
1457
- #: adminpages/pagesettings.php:241 adminpages/pagesettings.php:119
1458
- #: adminpages/pagesettings.php:132 adminpages/pagesettings.php:134
1459
- #: adminpages/pagesettings.php:145 adminpages/pagesettings.php:149
1460
- #: adminpages/pagesettings.php:159 adminpages/pagesettings.php:165
1461
- #: adminpages/pagesettings.php:173 adminpages/pagesettings.php:181
1462
- #: adminpages/pagesettings.php:187 adminpages/pagesettings.php:197
1463
- #: adminpages/pagesettings.php:201 adminpages/pagesettings.php:213
1464
- msgid "edit page"
1465
- msgstr "redigere side"
1466
-
1467
- #: adminpages/pagesettings.php:149 adminpages/pagesettings.php:164
1468
- #: adminpages/pagesettings.php:179 adminpages/pagesettings.php:195
1469
- #: adminpages/pagesettings.php:211 adminpages/pagesettings.php:227
1470
- #: adminpages/pagesettings.php:243 adminpages/pagesettings.php:121
1471
- #: adminpages/pagesettings.php:136 adminpages/pagesettings.php:151
1472
- #: adminpages/pagesettings.php:167 adminpages/pagesettings.php:183
1473
- #: adminpages/pagesettings.php:199 adminpages/pagesettings.php:215
1474
- msgid "view page"
1475
- msgstr "se side"
1476
-
1477
- #: adminpages/pagesettings.php:151 adminpages/pagesettings.php:166
1478
- #: adminpages/pagesettings.php:181 adminpages/pagesettings.php:197
1479
- #: adminpages/pagesettings.php:213 adminpages/pagesettings.php:229
1480
- #: adminpages/pagesettings.php:245 adminpages/pagesettings.php:121
1481
- #: adminpages/pagesettings.php:123 adminpages/pagesettings.php:134
1482
- #: adminpages/pagesettings.php:138 adminpages/pagesettings.php:147
1483
- #: adminpages/pagesettings.php:153 adminpages/pagesettings.php:161
1484
- #: adminpages/pagesettings.php:169 adminpages/pagesettings.php:175
1485
- #: adminpages/pagesettings.php:185 adminpages/pagesettings.php:189
1486
- #: adminpages/pagesettings.php:201 adminpages/pagesettings.php:203
1487
- #: adminpages/pagesettings.php:217
1488
- msgid "Include the shortcode"
1489
- msgstr "Include kort kode"
1490
-
1491
- #: adminpages/pagesettings.php:155 adminpages/pagesettings.php:125
1492
- #: adminpages/pagesettings.php:127
1493
- msgid "Billing Information Page"
1494
- msgstr "Regnings Informations Side"
1495
-
1496
- #: adminpages/pagesettings.php:170 adminpages/pagesettings.php:138
1497
- #: adminpages/pagesettings.php:142
1498
- msgid "Cancel Page"
1499
- msgstr "Annullere Side"
1500
-
1501
- #: adminpages/pagesettings.php:186 adminpages/pagesettings.php:152
1502
- #: adminpages/pagesettings.php:158
1503
- msgid "Checkout Page"
1504
- msgstr "Gå til Kassen Side"
1505
-
1506
- #: adminpages/pagesettings.php:202 adminpages/pagesettings.php:166
1507
- #: adminpages/pagesettings.php:174
1508
- msgid "Confirmation Page"
1509
- msgstr "Bekræftigelses Side"
1510
-
1511
- #: adminpages/pagesettings.php:218 adminpages/pagesettings.php:180
1512
- #: adminpages/pagesettings.php:190
1513
- msgid "Invoice Page"
1514
- msgstr "Fakturer Side"
1515
-
1516
- #: adminpages/pagesettings.php:234 adminpages/pagesettings.php:194
1517
- #: adminpages/pagesettings.php:206
1518
- msgid "Levels Page"
1519
- msgstr "Nivauers Side"
1520
-
1521
- #: adminpages/paymentsettings.php:77 adminpages/paymentsettings.php:82
1522
- msgid "Your payment settings have been updated."
1523
- msgstr "Din betalings indstillinger er bleven opdatert."
1524
-
1525
- #: adminpages/paymentsettings.php:146 adminpages/paymentsettings.php:154
1526
- #: adminpages/paymentsettings.php:144 adminpages/paymentsettings.php:152
1527
- msgid "Payment Gateway"
1528
- msgstr "Betalings Gateway"
1529
-
1530
- #: adminpages/paymentsettings.php:146 adminpages/paymentsettings.php:144
1531
- msgid "SSL Settings"
1532
- msgstr "SSL Indstillinger"
1533
-
1534
- #: adminpages/paymentsettings.php:148
1535
- msgid ""
1536
- "Learn more about <a title=\"Paid Memberships Pro - SSL Settings\" target="
1537
- "\"_blank\" href=\"http://www.paidmembershipspro.com/support/initial-plugin-"
1538
- "setup/ssl/\">SSL</a> or <a title=\"Paid Memberships Pro - Payment Gateway "
1539
- "Settings\" target=\"_blank\" href=\"http://www.paidmembershipspro.com/"
1540
- "support/initial-plugin-setup/payment-gateway/\">Payment Gateway Settings</a>."
1541
- msgstr ""
1542
- "Lær mere omkring <a title=\"Paid Memberships Pro - SSL Indstillinger\" "
1543
- "target=\"_blank\" href=\"http://www.paidmembershipspro.com/support/initial-"
1544
- "plugin-setup/ssl/\">SSL</a> eller <a title=\"Paid Memberships Pro - Betaling "
1545
- "Gateway Indstillinger\" target=\"_blank\" href=\"http://www."
1546
- "paidmembershipspro.com/support/initial-plugin-setup/payment-gateway/"
1547
- "\">Betalings Gateway Indstillinger</a>."
1548
-
1549
- #: adminpages/paymentsettings.php:174
1550
- msgid ""
1551
- "This gateway option is in beta. Some functionality may not be available. "
1552
- "Please contact Paid Memberships Pro with any issues you run into. "
1553
- "<strong>Please be sure to upgrade Paid Memberships Pro to the latest "
1554
- "versions when available.</strong>"
1555
- msgstr ""
1556
- "Denne gateway funktion er I beta. Nogle funktioner er nok ikke tilgængelig. "
1557
- "Venlig kontakt Paid Memberships Pro med de problemer, du oplever. "
1558
- "<strong>Husk at opgradere Paid Memberships Pro til den seneste version, når "
1559
- "det er tilgængeligt.</strong>"
1560
-
1561
- #: adminpages/paymentsettings.php:179
1562
- msgid ""
1563
- "We do not recommend using PayPal Standard. We suggest using PayPal Express, "
1564
- "Website Payments Pro (Legacy), or PayPal Pro (Payflow Pro). <a target="
1565
- "\"_blank\" href=\"http://www.paidmembershipspro.com/2013/09/read-using-"
1566
- "paypal-standard-paid-memberships-pro/\">More information on why can be found "
1567
- "here.</a>"
1568
- msgstr ""
1569
- "Vi anbefaler ikke, at bruge Paypal Standard. Vi forslår at brute PayPal "
1570
- "Express, Website Payments Pro (Legacy), eller PayPal Pro (Payflow Pro). <a "
1571
- "target=\"_blank\" href=\"http://www.paidmembershipspro.com/2013/09/read-"
1572
- "using-paypal-standard-paid-memberships-pro/\">Mere information om hvorfor, "
1573
- "kan findes her.</a>"
1574
-
1575
- #: adminpages/paymentsettings.php:204 adminpages/paymentsettings.php:195
1576
- #: adminpages/paymentsettings.php:199
1577
- msgid "Partner"
1578
- msgstr "Partner"
1579
-
1580
- #: adminpages/paymentsettings.php:212 adminpages/paymentsettings.php:203
1581
- #: adminpages/paymentsettings.php:207
1582
- msgid "Vendor"
1583
- msgstr "Sælger"
1584
-
1585
- #: adminpages/paymentsettings.php:228 pages/checkout.php:180
1586
- #: adminpages/paymentsettings.php:219 adminpages/paymentsettings.php:223
1587
- #: pages/checkout.php:177
1588
- msgid "Password"
1589
- msgstr "Adgangskode"
1590
-
1591
- #: adminpages/paymentsettings.php:236 adminpages/paymentsettings.php:227
1592
- #: adminpages/paymentsettings.php:231
1593
- msgid "Gateway Account Email"
1594
- msgstr "Gateway Konto Email"
1595
-
1596
- #: adminpages/paymentsettings.php:244 adminpages/paymentsettings.php:336
1597
- #: adminpages/paymentsettings.php:235 adminpages/paymentsettings.php:239
1598
- #: adminpages/paymentsettings.php:331
1599
- msgid "API Username"
1600
- msgstr "API Brugernavn"
1601
-
1602
- #: adminpages/paymentsettings.php:252 adminpages/paymentsettings.php:344
1603
- #: adminpages/paymentsettings.php:243 adminpages/paymentsettings.php:247
1604
- #: adminpages/paymentsettings.php:339
1605
- msgid "API Password"
1606
- msgstr "API Adgangskode"
1607
-
1608
- #: adminpages/paymentsettings.php:260 adminpages/paymentsettings.php:251
1609
- #: adminpages/paymentsettings.php:255
1610
- msgid "API Signature"
1611
- msgstr "API Signatur"
1612
-
1613
- #: adminpages/paymentsettings.php:269 adminpages/paymentsettings.php:260
1614
- #: adminpages/paymentsettings.php:264
1615
- msgid "Login Name"
1616
- msgstr "Login Navn"
1617
-
1618
- #: adminpages/paymentsettings.php:277 adminpages/paymentsettings.php:268
1619
- #: adminpages/paymentsettings.php:272
1620
- msgid "Transaction Key"
1621
- msgstr "Transaktions Nøgle"
1622
-
1623
- #: adminpages/paymentsettings.php:286 adminpages/paymentsettings.php:277
1624
- #: adminpages/paymentsettings.php:281
1625
- msgid "Secret Key"
1626
- msgstr "Hemmelig Nøgle"
1627
-
1628
- #: adminpages/paymentsettings.php:294 adminpages/paymentsettings.php:285
1629
- #: adminpages/paymentsettings.php:289
1630
- msgid "Publishable Key"
1631
- msgstr "Publicerbar Nøgle"
1632
-
1633
- #: adminpages/paymentsettings.php:303 adminpages/paymentsettings.php:369
1634
- #: adminpages/paymentsettings.php:294 adminpages/paymentsettings.php:298
1635
- #: adminpages/paymentsettings.php:364
1636
- msgid "Merchant ID"
1637
- msgstr "Købmands ID"
1638
-
1639
- #: adminpages/paymentsettings.php:311 adminpages/paymentsettings.php:302
1640
- #: adminpages/paymentsettings.php:306
1641
- msgid "Public Key"
1642
- msgstr "Offentlig Nøgle"
1643
-
1644
- #: adminpages/paymentsettings.php:319 adminpages/paymentsettings.php:310
1645
- #: adminpages/paymentsettings.php:314
1646
- msgid "Private Key"
1647
- msgstr "Privat Nøgle"
1648
-
1649
- #: adminpages/paymentsettings.php:327 adminpages/paymentsettings.php:318
1650
- #: adminpages/paymentsettings.php:322
1651
- msgid "Client-Side Encryption Key"
1652
- msgstr "Klient-Side Krypteret Nøgle"
1653
-
1654
- #: adminpages/paymentsettings.php:360 adminpages/paymentsettings.php:355
1655
- msgid "Secret Word"
1656
- msgstr "Hemmlig Ord"
1657
-
1658
- #: adminpages/paymentsettings.php:377 adminpages/paymentsettings.php:372
1659
- msgid "Transaction Security Key"
1660
- msgstr "Transaktion Sikkerheds Nøgle"
1661
-
1662
- #: adminpages/paymentsettings.php:386 adminpages/paymentsettings.php:327
1663
- #: adminpages/paymentsettings.php:337 adminpages/paymentsettings.php:356
1664
- #: adminpages/paymentsettings.php:381
1665
- msgid "Currency"
1666
- msgstr "Valuta"
1667
-
1668
- #: adminpages/paymentsettings.php:400
1669
- msgid ""
1670
- "Not all currencies will be supported by every gateway. Please check with "
1671
- "your gateway."
1672
- msgstr ""
1673
- "Ikke alt Valuta understøtter alle gateways. Kontrollere venligst din Gateway."
1674
-
1675
- #: adminpages/paymentsettings.php:406 adminpages/paymentsettings.php:375
1676
- #: adminpages/paymentsettings.php:401
1677
- msgid "Accepted Credit Card Types"
1678
- msgstr "Accepteret Kreditkort Typer"
1679
-
1680
- #: adminpages/paymentsettings.php:420 adminpages/paymentsettings.php:389
1681
- #: adminpages/paymentsettings.php:415
1682
- msgid "Instructions"
1683
- msgstr "Instruktioner"
1684
-
1685
- #: adminpages/paymentsettings.php:424 adminpages/paymentsettings.php:393
1686
- #: adminpages/paymentsettings.php:419
1687
- msgid ""
1688
- "Who to write the check out to. Where to mail it. Shown on checkout, "
1689
- "confirmation, and invoice pages."
1690
- msgstr ""
1691
- "Hvem skal checken udskrives til. Hvor skal den mails til. Vis ved gå til "
1692
- "kassen, bekræftigelse, og faktura sider."
1693
-
1694
- #: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:425
1695
- msgid "Show Billing Address Fields"
1696
- msgstr "Vis Regnings Adresse Felter."
1697
-
1698
- #: adminpages/paymentsettings.php:437
1699
- msgid ""
1700
- "Stripe doesn't require billing address fields. Choose 'No' to hide them on "
1701
- "the checkout page.<br /><strong>If No, make sure you disable address "
1702
- "verification in the Stripe dashboard settings.</strong>"
1703
- msgstr ""
1704
- "Stripe behøver ikke regnings adresse felter. Vælg 'Nej' for at skjule dem "
1705
- "ved gå til kassen side.<br/><strong>Hvis Nej, så vær sikker på, at du har "
1706
- "deaktiveret bekræftigelse I Strip Kontrolpanel Indstillinger.</strong>"
1707
-
1708
- #: adminpages/paymentsettings.php:443 adminpages/paymentsettings.php:398
1709
- #: adminpages/paymentsettings.php:438
1710
- msgid "Sales Tax"
1711
- msgstr "Moms"
1712
-
1713
- #: adminpages/paymentsettings.php:443 pages/billing.php:82
1714
- #: adminpages/paymentsettings.php:398 adminpages/paymentsettings.php:438
1715
- #: pages/billing.php:78
1716
- msgid "optional"
1717
- msgstr "valgfri"
1718
-
1719
- #: adminpages/paymentsettings.php:446 adminpages/paymentsettings.php:401
1720
- #: adminpages/paymentsettings.php:441
1721
- msgid "Tax State"
1722
- msgstr "Moms ialt"
1723
-
1724
- #: adminpages/paymentsettings.php:447 adminpages/paymentsettings.php:402
1725
- #: adminpages/paymentsettings.php:442
1726
- msgid "abbreviation, e.g. \"PA\""
1727
- msgstr "forkortelse, e.g. \"PA\""
1728
-
1729
- #: adminpages/paymentsettings.php:449 adminpages/paymentsettings.php:404
1730
- #: adminpages/paymentsettings.php:444
1731
- msgid "decimal, e.g. \"0.06\""
1732
- msgstr "decimal, e.g \"0.06\""
1733
-
1734
- #: adminpages/paymentsettings.php:450
1735
- msgid ""
1736
- "US only. If values are given, tax will be applied for any members ordering "
1737
- "from the selected state.<br />For non-US or more complex tax rules, use the "
1738
- "<a target=\"_blank\" href=\"http://www.paidmembershipspro.com/2013/10/non-us-"
1739
- "taxes-paid-memberships-pro/\">pmpro_tax filter</a>."
1740
- msgstr ""
1741
- "Kun for US. Hvis værdien er sat korret op, så ville skat blive tilføjet til "
1742
- "hvilken som helst medlems ordre fra den valgte stat.<br> For ikke-US eller "
1743
- "mere komplekse skatte regler, brug dette <a target=\"_blank\" href=\"http://"
1744
- "www.paidmembershipspro.com/2013/10/non-us-taxes-paid-memberships-pro/"
1745
- "\">pmpro_tax filter</a>."
1746
-
1747
- #: adminpages/paymentsettings.php:455 adminpages/paymentsettings.php:450
1748
- msgid "Force SSL"
1749
- msgstr "Tving SSL"
1750
-
1751
- #: adminpages/paymentsettings.php:461 adminpages/paymentsettings.php:456
1752
- msgid "Yes (with JavaScript redirects)"
1753
- msgstr "Ja (med JavaScript omdirigering)"
1754
-
1755
- #: adminpages/paymentsettings.php:468 adminpages/paymentsettings.php:430
1756
- #: adminpages/paymentsettings.php:463
1757
- msgid "SSL Seal Code"
1758
- msgstr "SSL Seal Kode"
1759
-
1760
- #: adminpages/paymentsettings.php:477 adminpages/paymentsettings.php:438
1761
- #: adminpages/paymentsettings.php:471
1762
- msgid "HTTPS Nuclear Option"
1763
- msgstr "HTTPS Nuclear Funktioner"
1764
-
1765
- #: adminpages/paymentsettings.php:480 adminpages/paymentsettings.php:441
1766
- #: adminpages/paymentsettings.php:474
1767
- msgid ""
1768
- "Use the \"Nuclear Option\" to use secure (HTTPS) URLs on your secure pages. "
1769
- "Check this if you are using SSL and have warnings on your checkout pages."
1770
- msgstr ""
1771
- "Brug \"Nuclear Funktion\" for at sikre (HTTPS) URLs på dine sikre sider. "
1772
- "Tjek hvis du bruger SSL og har advarsler på din gå til kassen sider."
1773
-
1774
- #: adminpages/paymentsettings.php:485 adminpages/paymentsettings.php:446
1775
- #: adminpages/paymentsettings.php:479
1776
- msgid "IPN Handler URL"
1777
- msgstr "IPN Handler URL"
1778
-
1779
- #: adminpages/paymentsettings.php:488 adminpages/paymentsettings.php:449
1780
- #: adminpages/paymentsettings.php:482
1781
- msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to "
1782
- msgstr ""
1783
- "For at integrerer fuldt ud med PayPal, vær sikker på, sæt din IPN Handler "
1784
- "URL til "
1785
-
1786
- #: adminpages/paymentsettings.php:493 adminpages/paymentsettings.php:487
1787
- msgid "TwoCheckout INS URL"
1788
- msgstr "TwoCheckout INS URL"
1789
-
1790
- #: adminpages/paymentsettings.php:496 adminpages/paymentsettings.php:490
1791
- msgid ""
1792
- "To fully integrate with 2Checkout, be sure to set your 2Checkout INS URL "
1793
- msgstr ""
1794
- "For at kunne integrerer fuldtud med 2Checkout, vær sikker på, at sætte din "
1795
- "2Checkout INS URL"
1796
-
1797
- #: adminpages/paymentsettings.php:501 adminpages/paymentsettings.php:454
1798
- #: adminpages/paymentsettings.php:495
1799
- msgid "Silent Post URL"
1800
- msgstr "Skjul Post URL"
1801
-
1802
- #: adminpages/paymentsettings.php:504 adminpages/paymentsettings.php:457
1803
- #: adminpages/paymentsettings.php:498
1804
- msgid ""
1805
- "To fully integrate with Authorize.net, be sure to set your Silent Post URL to"
1806
- msgstr ""
1807
- "For at kunne integrerer fuldtud med Authorize.net, vær sikker på, at sætte "
1808
- "din Silent Post URL til"
1809
-
1810
- #: adminpages/paymentsettings.php:509 adminpages/paymentsettings.php:517
1811
- #: adminpages/paymentsettings.php:462 adminpages/paymentsettings.php:470
1812
- #: adminpages/paymentsettings.php:503 adminpages/paymentsettings.php:511
1813
- msgid "Web Hook URL"
1814
- msgstr "Web Hook URL"
1815
-
1816
- #: adminpages/paymentsettings.php:512 adminpages/paymentsettings.php:465
1817
- #: adminpages/paymentsettings.php:506
1818
- msgid "To fully integrate with Stripe, be sure to set your Web Hook URL to"
1819
- msgstr ""
1820
- "For at kunne integrerer fuldtud med Stripe, vær sikker på, at sætte din web "
1821
- "Hook URL til"
1822
-
1823
- #: adminpages/paymentsettings.php:521 adminpages/paymentsettings.php:474
1824
- #: adminpages/paymentsettings.php:515
1825
- msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to"
1826
- msgstr ""
1827
- "For at kunne integrerer fuldtud med Braintree, vær sikker på, at sætte din "
1828
- "Silent Post URL til"
1829
-
1830
- #: adminpages/reports.php:40 adminpages/reports.php:26
1831
- #: adminpages/reports.php:37
1832
- msgid "Details"
1833
- msgstr "Detaljer"
1834
-
1835
- #: adminpages/reports/login.php:16
1836
- msgid "Visits, Views, and Logins"
1837
- msgstr "Besøgende, Set, og Logget Ind"
1838
-
1839
- #: adminpages/reports/login.php:26
1840
- msgid "Visits Today"
1841
- msgstr "Besøgende Idag"
1842
-
1843
- #: adminpages/reports/login.php:27 adminpages/reports/login.php:147
1844
- msgid "Visits This Month"
1845
- msgstr "Besøgende I denne Måned"
1846
-
1847
- #: adminpages/reports/login.php:28
1848
- msgid "Visits All Time"
1849
- msgstr "Besøgende Hele Tiden"
1850
-
1851
- #: adminpages/reports/login.php:31
1852
- msgid "Views Today"
1853
- msgstr "Set Idag"
1854
-
1855
- #: adminpages/reports/login.php:32 adminpages/reports/login.php:149
1856
- msgid "Views This Month"
1857
- msgstr "Set I Denne Måned"
1858
-
1859
- #: adminpages/reports/login.php:33
1860
- msgid "Views All Time"
1861
- msgstr "Set Hele Tiden"
1862
-
1863
- #: adminpages/reports/login.php:36
1864
- msgid "Logins Today"
1865
- msgstr "Logget ind Idag"
1866
-
1867
- #: adminpages/reports/login.php:37 adminpages/reports/login.php:152
1868
- msgid "Logins This Month"
1869
- msgstr "Logget ind I denne måned"
1870
-
1871
- #: adminpages/reports/login.php:38
1872
- msgid "Logins All Time"
1873
- msgstr "Logget ind hele Tiden"
1874
-
1875
- #: adminpages/reports/login.php:61
1876
- msgid "Visits, Views, and Logins Report"
1877
- msgstr "Besøgende, Set. og Logget Ind Report"
1878
-
1879
- #: adminpages/reports/login.php:66
1880
- msgid "All Users"
1881
- msgstr "Alle Brugere"
1882
-
1883
- #: adminpages/reports/login.php:146
1884
- msgid "Last Visit"
1885
- msgstr "Sidst Besøgt"
1886
-
1887
- #: adminpages/reports/login.php:148
1888
- msgid "Total Visits"
1889
- msgstr "Total Besøgende"
1890
-
1891
- #: adminpages/reports/login.php:150
1892
- msgid "Total Views"
1893
- msgstr "Total Set"
1894
-
1895
- #: adminpages/reports/login.php:151
1896
- msgid "Last Login"
1897
- msgstr "Sidst Logget Ind"
1898
-
1899
- #: adminpages/reports/login.php:153
1900
- msgid "Total Logins"
1901
- msgstr "Logget ind Total"
1902
-
1903
- #: adminpages/reports/memberships.php:18
1904
- #: adminpages/reports/memberships.php:288
1905
- msgid "Membership Stats"
1906
- msgstr "Medlems Statestikker"
1907
-
1908
- #: adminpages/reports/memberships.php:48
1909
- msgid "Signups"
1910
- msgstr "Regestreringer"
1911
-
1912
- #: adminpages/reports/memberships.php:50 adminpages/reports/memberships.php:69
1913
- msgid "All Time"
1914
- msgstr "Hele Tiden"
1915
-
1916
- #: adminpages/reports/memberships.php:54 adminpages/reports/memberships.php:73
1917
- msgid "This Year"
1918
- msgstr "Dette År"
1919
-
1920
- #: adminpages/reports/memberships.php:58 adminpages/reports/memberships.php:77
1921
- msgid "This Month"
1922
- msgstr "Denne Måned"
1923
-
1924
- #: adminpages/reports/memberships.php:62 adminpages/reports/memberships.php:81
1925
- msgid "Today"
1926
- msgstr "Idag"
1927
-
1928
- #: adminpages/reports/memberships.php:67
1929
- msgid "Cancellations"
1930
- msgstr "Annulleringer"
1931
-
1932
- #: adminpages/reports/memberships.php:86
1933
- msgid "Other Stats"
1934
- msgstr "Andre Statestikker"
1935
-
1936
- #: adminpages/reports/memberships.php:88
1937
- msgid "Monthly Recurring Revenue (MRR)"
1938
- msgstr "Månedligt Tilbagevendende Indtægter (MTI)"
1939
-
1940
- #: adminpages/reports/memberships.php:92
1941
- msgid "Cancellation Rate"
1942
- msgstr "Annullerings Rate"
1943
-
1944
- #: adminpages/reports/memberships.php:96
1945
- msgid "Lifetime Value (LTV)"
1946
- msgstr "Livstids Værdi (LTV)"
1947
-
1948
- #: adminpages/reports/memberships.php:294 adminpages/reports/sales.php:195
1949
- #: adminpages/reports/sales.php:187 adminpages/reports/sales.php:196
1950
- msgid "Daily"
1951
- msgstr "Daglig"
1952
-
1953
- #: adminpages/reports/memberships.php:295 adminpages/reports/sales.php:196
1954
- #: adminpages/reports/sales.php:188 adminpages/reports/sales.php:197
1955
- msgid "Monthly"
1956
- msgstr "Månedelig"
1957
-
1958
- #: adminpages/reports/memberships.php:296 adminpages/reports/sales.php:197
1959
- #: adminpages/reports/sales.php:189 adminpages/reports/sales.php:198
1960
- msgid "Annual"
1961
- msgstr "Årlig"
1962
-
1963
- #: adminpages/reports/memberships.php:299
1964
- msgid "Signups vs. Cancellations"
1965
- msgstr "Regestreringer vs Annulleringer"
1966
-
1967
- #: adminpages/reports/memberships.php:331 adminpages/reports/sales.php:230
1968
- #: adminpages/reports/sales.php:222 adminpages/reports/sales.php:231
1969
- msgid "Generate Report"
1970
- msgstr "Genereret Report"
1971
-
1972
- #: adminpages/reports/sales.php:18
1973
- msgid "Sales and Revenue (Testing/Sandbox)"
1974
- msgstr "Salg og Indtægter (Test/Sandkasse)"
1975
-
1976
- #: adminpages/reports/sales.php:20 adminpages/reports/sales.php:189
1977
- #: adminpages/reports/sales.php:180
1978
- msgid "Sales and Revenue"
1979
- msgstr "Salg og Indtægter"
1980
-
1981
- #: adminpages/reports/sales.php:200 adminpages/reports/sales.php:192
1982
- #: adminpages/reports/sales.php:201
1983
- msgid "Revenue"
1984
- msgstr "Indtægter"
1985
-
1986
- #: adminpages/reports/sales.php:201 adminpages/reports/sales.php:193
1987
- #: adminpages/reports/sales.php:202
1988
- msgid "Sales"
1989
- msgstr "Salg"
1990
-
1991
- #: classes/class.memberorder.php:564 classes/class.memberorder.php:553
1992
- #: classes/class.memberorder.php:561 includes/cleanup.php:24
1993
- #, php-format
1994
- msgid ""
1995
- "There was an error canceling the subscription for user with ID=%s. You will "
1996
- "want to check your payment gateway to see if their subscription is still "
1997
- "active."
1998
- msgstr ""
1999
- "Der var en fejl, med annullering af abonnement for bruger med ID=%s. Du "
2000
- "ville nok kontrollere din betalings gateway, for at kunne se om deres "
2001
- "abonnement stadig er aktiv"
2002
-
2003
- #: classes/class.pmproemail.php:37
2004
- #, php-format
2005
- msgid "An Email From %s"
2006
- msgstr "En Email Fra %s"
2007
-
2008
- #: classes/class.pmproemail.php:122 classes/class.pmproemail.php:120
2009
- #, php-format
2010
- msgid "Your membership at %s has been CANCELLED"
2011
- msgstr "Dit medlemskab hos %s er blevet ANNULLERET"
2012
-
2013
- #: classes/class.pmproemail.php:144 classes/class.pmproemail.php:142
2014
- #, php-format
2015
- msgid "Membership for %s at %s has been CANCELLED"
2016
- msgstr "Medlemskab for %s hos %s er blevet ANNULLERET"
2017
-
2018
- #: classes/class.pmproemail.php:175 classes/class.pmproemail.php:172
2019
- #: classes/class.pmproemail.php:173
2020
- #, php-format
2021
- msgid "Your membership confirmation for %s"
2022
- msgstr "Dit medlemskab bekræftigelse for %s"
2023
-
2024
- #: classes/class.pmproemail.php:228 classes/class.pmproemail.php:237
2025
- #: classes/class.pmproemail.php:246 classes/class.pmproemail.php:325
2026
- #: classes/class.pmproemail.php:334 classes/class.pmproemail.php:645
2027
- #: pages/checkout.php:66 pages/checkout.php:76 pages/checkout.php:549
2028
- #: pages/confirmation.php:52 pages/invoice.php:33
2029
- #: classes/class.pmproemail.php:216 classes/class.pmproemail.php:218
2030
- #: classes/class.pmproemail.php:225 classes/class.pmproemail.php:227
2031
- #: classes/class.pmproemail.php:234 classes/class.pmproemail.php:236
2032
- #: classes/class.pmproemail.php:304 classes/class.pmproemail.php:307
2033
- #: classes/class.pmproemail.php:313 classes/class.pmproemail.php:316
2034
- #: classes/class.pmproemail.php:532 classes/class.pmproemail.php:580
2035
- #: pages/checkout.php:67 pages/checkout.php:77 pages/checkout.php:566
2036
- #: pages/checkout.php:573 pages/confirmation.php:51 pages/invoice.php:32
2037
- msgid "Discount Code"
2038
- msgstr "Rabat Kode"
2039
-
2040
- #: classes/class.pmproemail.php:253 classes/class.pmproemail.php:346
2041
- #: classes/class.pmproemail.php:651 classes/class.pmproemail.php:241
2042
- #: classes/class.pmproemail.php:243 classes/class.pmproemail.php:325
2043
- #: classes/class.pmproemail.php:328 classes/class.pmproemail.php:538
2044
- #: classes/class.pmproemail.php:586
2045
- #, php-format
2046
- msgid "This membership will expire on %s."
2047
- msgstr "Dette medlemskab udløber den %s."
2048
-
2049
- #: classes/class.pmproemail.php:275 classes/class.pmproemail.php:263
2050
- #: classes/class.pmproemail.php:265
2051
- #, php-format
2052
- msgid "Member Checkout for %s at %s"
2053
- msgstr "Medlem gå til kassen ved %s hos %s"
2054
-
2055
- #: classes/class.pmproemail.php:363 classes/class.pmproemail.php:342
2056
- #: classes/class.pmproemail.php:345
2057
- #, php-format
2058
- msgid "Your billing information has been udpated at %s"
2059
- msgstr "Dine betalings informationer er blevet opdateret hos %s"
2060
-
2061
- #: classes/class.pmproemail.php:416 classes/class.pmproemail.php:386
2062
- #: classes/class.pmproemail.php:390
2063
- #, php-format
2064
- msgid "Billing information has been udpated for %s at %s"
2065
- msgstr "Betalings informationer er blevet opdateret ved %s hos %s"
2066
-
2067
- #: classes/class.pmproemail.php:464 classes/class.pmproemail.php:425
2068
- #: classes/class.pmproemail.php:430
2069
- #, php-format
2070
- msgid "Membership Payment Failed at %s"
2071
- msgstr "Medlemsskabs Betaling Fejlet hos %s"
2072
-
2073
- #: classes/class.pmproemail.php:510 classes/class.pmproemail.php:462
2074
- #: classes/class.pmproemail.php:468
2075
- #, php-format
2076
- msgid "Membership Payment Failed For %s at %s"
2077
- msgstr "Medlemsskat Betaling Fejlet for %s ved %s"
2078
-
2079
- #: classes/class.pmproemail.php:557 classes/class.pmproemail.php:508
2080
- #, php-format
2081
- msgid "Credit Card on File Expiring Soon at %s"
2082
- msgstr "Kreditkort udløber snart hos %s"
2083
-
2084
- #: classes/class.pmproemail.php:605 classes/class.pmproemail.php:501
2085
- #: classes/class.pmproemail.php:548
2086
- #, php-format
2087
- msgid "INVOICE for %s membership"
2088
- msgstr "FAKTURA for %s medlemsskab"
2089
-
2090
- #: classes/class.pmproemail.php:676 classes/class.pmproemail.php:563
2091
- #: classes/class.pmproemail.php:611
2092
- #, php-format
2093
- msgid "Your trial at %s is ending soon"
2094
- msgstr "Din prøveperiode ved %s ender snart"
2095
-
2096
- #: classes/class.pmproemail.php:710 classes/class.pmproemail.php:596
2097
- #: classes/class.pmproemail.php:645
2098
- #, php-format
2099
- msgid "Your membership at %s has ended"
2100
- msgstr "Dit medlemskab hos %s er endt"
2101
-
2102
- #: classes/class.pmproemail.php:735 classes/class.pmproemail.php:621
2103
- #: classes/class.pmproemail.php:670
2104
- #, php-format
2105
- msgid "Your membership at %s will end soon"
2106
- msgstr "Dit medlemsskab hos %s vil snart ende"
2107
-
2108
- #: classes/class.pmproemail.php:755 classes/class.pmproemail.php:641
2109
- #: classes/class.pmproemail.php:690
2110
- #, php-format
2111
- msgid "Your membership at %s has been changed"
2112
- msgstr "Dit medlemsskab hos %s er belven ændret"
2113
-
2114
- #: classes/class.pmproemail.php:759
2115
- #, php-format
2116
- msgid "The new level is %s."
2117
- msgstr "Det nye niveau er %s."
2118
-
2119
- #: classes/class.pmproemail.php:761 classes/class.pmproemail.php:647
2120
- #: classes/class.pmproemail.php:696
2121
- msgid "Your membership has been cancelled"
2122
- msgstr "Dit medlskabskab er bleven annulleret"
2123
-
2124
- #: classes/class.pmproemail.php:765 classes/class.pmproemail.php:803
2125
- #: classes/class.pmproemail.php:651 classes/class.pmproemail.php:689
2126
- #: classes/class.pmproemail.php:700 classes/class.pmproemail.php:738
2127
- #, php-format
2128
- msgid "This membership will expire on %s"
2129
- msgstr "Dette medlemsskab ville udløbe hos %s"
2130
-
2131
- #: classes/class.pmproemail.php:769 classes/class.pmproemail.php:807
2132
- #: classes/class.pmproemail.php:655 classes/class.pmproemail.php:693
2133
- #: classes/class.pmproemail.php:704 classes/class.pmproemail.php:742
2134
- msgid "This membership does not expire"
2135
- msgstr "Dette medlemsskab udløber ikke"
2136
-
2137
- #: classes/class.pmproemail.php:793 classes/class.pmproemail.php:679
2138
- #: classes/class.pmproemail.php:728
2139
- #, php-format
2140
- msgid "Membership for %s at %s has been changed"
2141
- msgstr "Medlemsskab for %s hos %s er bleven ændret"
2142
-
2143
- #: classes/class.pmproemail.php:797 classes/class.pmproemail.php:645
2144
- #: classes/class.pmproemail.php:683 classes/class.pmproemail.php:694
2145
- #: classes/class.pmproemail.php:732
2146
- #, php-format
2147
- msgid "The new level is %s. This membership is free"
2148
- msgstr "Det nye niveau er %s. Dette medlemsskab er gratis"
2149
-
2150
- #: classes/class.pmproemail.php:799
2151
- msgid "Membership has been cancelled"
2152
- msgstr "Medlemsskab er bleven annulleret"
2153
-
2154
- #: classes/gateways/class.pmprogateway.php:55
2155
- #: classes/gateways/class.pmprogateway_authorizenet.php:55
2156
- #: classes/gateways/class.pmprogateway_check.php:60
2157
- #: classes/gateways/class.pmprogateway_cybersource.php:57
2158
- #: classes/gateways/class.pmprogateway_payflowpro.php:27
2159
- #: classes/gateways/class.pmprogateway_paypal.php:27
2160
- msgid "Unknown error: Authorization failed."
2161
- msgstr "Ukendt fejl: Godkendelse fejlet."
2162
-
2163
- #: classes/gateways/class.pmprogateway.php:106
2164
- #: classes/gateways/class.pmprogateway.php:111
2165
- #: classes/gateways/class.pmprogateway.php:129
2166
- #: classes/gateways/class.pmprogateway_authorizenet.php:106
2167
- #: classes/gateways/class.pmprogateway_authorizenet.php:111
2168
- #: classes/gateways/class.pmprogateway_authorizenet.php:128
2169
- #: classes/gateways/class.pmprogateway_check.php:111
2170
- #: classes/gateways/class.pmprogateway_check.php:116
2171
- #: classes/gateways/class.pmprogateway_check.php:134
2172
- #: classes/gateways/class.pmprogateway_cybersource.php:108
2173
- #: classes/gateways/class.pmprogateway_cybersource.php:113
2174
- #: classes/gateways/class.pmprogateway_cybersource.php:131
2175
- #: classes/gateways/class.pmprogateway_payflowpro.php:50
2176
- #: classes/gateways/class.pmprogateway_payflowpro.php:55
2177
- #: classes/gateways/class.pmprogateway_paypal.php:50
2178
- msgid "Unknown error: Payment failed."
2179
- msgstr "Ukendt fejl. Betaling fejlet."
2180
-
2181
- #: classes/gateways/class.pmprogateway.php:113
2182
- #: classes/gateways/class.pmprogateway_authorizenet.php:112
2183
- #: classes/gateways/class.pmprogateway_check.php:118
2184
- #: classes/gateways/class.pmprogateway_cybersource.php:115
2185
- msgid ""
2186
- "A partial payment was made that we could not void. Please contact the site "
2187
- "owner immediately to correct this."
2188
- msgstr ""
2189
- "Noget af betaling var sket, som vi ikke kunne stoppe. Kontakt venligst site "
2190
- "admin med det sammme, for at få det rettet."
2191
-
2192
- #: classes/gateways/class.pmprogateway_authorizenet.php:787
2193
- #: classes/gateways/class.pmprogateway_authorizenet.php:788
2194
- #: classes/gateways/class.pmprogateway_authorizenet.php:789
2195
- msgid "Could not connect to Authorize.net"
2196
- msgstr "Kunne ikke forbinde til Authorize.net"
2197
-
2198
- #: classes/gateways/class.pmprogateway_braintree.php:61
2199
- #: classes/gateways/class.pmprogateway_stripe.php:53
2200
- msgid "Unknown error: Initial payment failed."
2201
- msgstr "Ukendt fejl: Indledende betaling mislykkedes."
2202
-
2203
- #: classes/gateways/class.pmprogateway_braintree.php:120
2204
- msgid "Error during settlement:"
2205
- msgstr "Fejl under afvikling:"
2206
-
2207
- #: classes/gateways/class.pmprogateway_braintree.php:129
2208
- msgid "Error during charge:"
2209
- msgstr "Fejl under ændrening:"
2210
-
2211
- #: classes/gateways/class.pmprogateway_braintree.php:198
2212
- msgid "Failed to update customer."
2213
- msgstr "Fejlet I at opdatere kunde."
2214
-
2215
- #: classes/gateways/class.pmprogateway_braintree.php:246
2216
- msgid "Failed to create customer."
2217
- msgstr "Fejlret I at oprette kunde."
2218
-
2219
- #: classes/gateways/class.pmprogateway_braintree.php:253
2220
- msgid "Error creating customer record with Braintree:"
2221
- msgstr "Fejl I at oprette en kunde rekord med Braintree:"
2222
-
2223
- #: classes/gateways/class.pmprogateway_braintree.php:344
2224
- #: classes/gateways/class.pmprogateway_braintree.php:345
2225
- msgid "Error subscribing customer to plan with Braintree:"
2226
- msgstr "Fejl i at abonnere kunde til plan med Braintree:"
2227
-
2228
- #: classes/gateways/class.pmprogateway_braintree.php:359
2229
- #: classes/gateways/class.pmprogateway_braintree.php:360
2230
- msgid "Failed to subscribe with Braintree:"
2231
- msgstr "Fejl i at abonnere med Braintree:"
2232
-
2233
- #: classes/gateways/class.pmprogateway_braintree.php:397
2234
- #: classes/gateways/class.pmprogateway_braintree.php:410
2235
- #: classes/gateways/class.pmprogateway_braintree.php:417
2236
- #: classes/gateways/class.pmprogateway_stripe.php:396
2237
- #: classes/gateways/class.pmprogateway_braintree.php:398
2238
- #: classes/gateways/class.pmprogateway_braintree.php:411
2239
- #: classes/gateways/class.pmprogateway_braintree.php:418
2240
- #: classes/gateways/class.pmprogateway_stripe.php:343
2241
- #: classes/gateways/class.pmprogateway_stripe.php:344
2242
- #: classes/gateways/class.pmprogateway_stripe.php:351
2243
- #: classes/gateways/class.pmprogateway_stripe.php:353
2244
- #: classes/gateways/class.pmprogateway_stripe.php:354
2245
- #: classes/gateways/class.pmprogateway_stripe.php:361
2246
- msgid "Could not find the subscription."
2247
- msgstr "Kunne ikke finde abonnere."
2248
-
2249
- #: classes/gateways/class.pmprogateway_payflowpro.php:57
2250
- #: classes/gateways/class.pmprogateway_paypal.php:57
2251
- msgid ""
2252
- "A partial payment was made that we could not refund. Please contact the site "
2253
- "owner immediately to correct this."
2254
- msgstr ""
2255
- "Noget af betaling gik igennem, men vi kunne ikke refundere beløbet. Kontakt "
2256
- "venligst site admin med det samme, for at få det rettet."
2257
-
2258
- #: classes/gateways/class.pmprogateway_paypal.php:385
2259
- #: classes/gateways/class.pmprogateway_paypalexpress.php:305
2260
- #: classes/gateways/class.pmprogateway_paypalstandard.php:220
2261
- #: classes/gateways/class.pmprogateway_paypalexpress.php:301
2262
- #: classes/gateways/class.pmprogateway_paypalstandard.php:216
2263
- msgid ""
2264
- "Please contact the site owner or cancel your subscription from within PayPal "
2265
- "to make sure you are not charged going forward."
2266
- msgstr ""
2267
- "Kontakt venligst site admin eller annullere dit abonnement gennem PAyPal, "
2268
- "for at være sikker på, at du ikke bliver trukket I betaling."
2269
-
2270
- #: classes/gateways/class.pmprogateway_stripe.php:199
2271
- #: classes/gateways/class.pmprogateway_stripe.php:190
2272
- #: classes/gateways/class.pmprogateway_stripe.php:192
2273
- msgid "Error creating customer record with Stripe:"
2274
- msgstr "Fejl i at oprette kunde rekord med Stripe;"
2275
-
2276
- #: classes/gateways/class.pmprogateway_stripe.php:302
2277
- #: classes/gateways/class.pmprogateway_stripe.php:278
2278
- #: classes/gateways/class.pmprogateway_stripe.php:279
2279
- #: classes/gateways/class.pmprogateway_stripe.php:286
2280
- msgid "Error creating plan with Stripe:"
2281
- msgstr "Fejl I at oprette plan med Stripe:"
2282
-
2283
- #: classes/gateways/class.pmprogateway_stripe.php:318
2284
- #: classes/gateways/class.pmprogateway_stripe.php:294
2285
- #: classes/gateways/class.pmprogateway_stripe.php:295
2286
- #: classes/gateways/class.pmprogateway_stripe.php:302
2287
- msgid "Error subscribing customer to plan with Stripe:"
2288
- msgstr "Fejl I at abonnere kunde til plan med Stripe:"
2289
-
2290
- #: classes/gateways/class.pmprogateway_stripe.php:383
2291
- msgid "Could not cancel old subscription."
2292
- msgstr "Kunne ikke annullere gammel abonnement."
2293
-
2294
- #: includes/adminpages.php:47 includes/adminpages.php:100
2295
- #: includes/adminpages.php:9 includes/adminpages.php:39
2296
- #: includes/adminpages.php:93
2297
- msgid "Memberships"
2298
- msgstr "Medlemsskaber"
2299
-
2300
- #: includes/adminpages.php:48 includes/adminpages.php:114
2301
- #: includes/adminpages.php:10 includes/adminpages.php:49
2302
- #: includes/adminpages.php:107
2303
- msgid "Page Settings"
2304
- msgstr "Side Indstilinger"
2305
-
2306
- #: includes/adminpages.php:49 includes/adminpages.php:121
2307
- #: includes/adminpages.php:11 includes/adminpages.php:54
2308
- #: includes/adminpages.php:114
2309
- msgid "Payment Settings"
2310
- msgstr "Betalings Indstillinger"
2311
-
2312
- #: includes/adminpages.php:54 includes/adminpages.php:156
2313
- #: includes/adminpages.php:16 includes/adminpages.php:79
2314
- #: includes/adminpages.php:149
2315
- msgid "Reports"
2316
- msgstr "Reporter"
2317
-
2318
- #: includes/adminpages.php:56 includes/adminpages.php:170
2319
- #: includes/adminpages.php:18 includes/adminpages.php:89
2320
- #: includes/adminpages.php:163
2321
- msgid "Discount Codes"
2322
- msgstr "Rabat Kode"
2323
-
2324
- #: includes/currencies.php:7 includes/currencies.php:44
2325
- #: includes/currencies.php:37
2326
- msgid "US Dollars (&#36;)"
2327
- msgstr "US Dollar (&#36;)"
2328
-
2329
- #: includes/currencies.php:8 includes/currencies.php:47
2330
- #: includes/currencies.php:40
2331
- msgid "Euros (&euro;)"
2332
- msgstr "Euro (&euro;)"
2333
-
2334
- #: includes/currencies.php:9 includes/currencies.php:46
2335
- #: includes/currencies.php:39
2336
- msgid "Pounds Sterling (&pound;)"
2337
- msgstr "Pound Sterling (&pound;)"
2338
-
2339
- #: includes/currencies.php:10
2340
- msgid "Australian Dollars (&#36;)"
2341
- msgstr "Australsk Dollar (&#36;)"
2342
-
2343
- #: includes/currencies.php:11
2344
- msgid "Brazilian Real (&#36;)"
2345
- msgstr "Brasilian Real (&#36;)"
2346
-
2347
- #: includes/currencies.php:12 includes/currencies.php:45
2348
- #: includes/currencies.php:38
2349
- msgid "Canadian Dollars (&#36;)"
2350
- msgstr "Canadisk Dollar (&#36;)"
2351
-
2352
- #: includes/currencies.php:13
2353
- msgid "Chinese Yuan"
2354
- msgstr "Kinesisk Yuan"
2355
-
2356
- #: includes/currencies.php:14 includes/currencies.php:13
2357
- msgid "Czech Koruna"
2358
- msgstr "Tjekkisk Koruna"
2359
-
2360
- #: includes/currencies.php:15 includes/currencies.php:14
2361
- msgid "Danish Krone"
2362
- msgstr "Dansk Krone"
2363
-
2364
- #: includes/currencies.php:16 includes/currencies.php:15
2365
- msgid "Hong Kong Dollar (&#36;)"
2366
- msgstr "Kong Kong Dollar (&#36;)"
2367
-
2368
- #: includes/currencies.php:17 includes/currencies.php:16
2369
- msgid "Hungarian Forint"
2370
- msgstr "Ungarnsk Forint"
2371
-
2372
- #: includes/currencies.php:18
2373
- msgid "Indian Rupee"
2374
- msgstr "Indisk Rupee"
2375
-
2376
- #: includes/currencies.php:19
2377
- msgid "Indonesia Rupiah"
2378
- msgstr "Indonesien Rupiah"
2379
-
2380
- #: includes/currencies.php:20 includes/currencies.php:17
2381
- msgid "Israeli Shekel"
2382
- msgstr "Isralsk Shekel"
2383
-
2384
- #: includes/currencies.php:21 includes/currencies.php:18
2385
- msgid "Japanese Yen (&yen;)"
2386
- msgstr "Japansk Yen (&yen;)"
2387
-
2388
- #: includes/currencies.php:22 includes/currencies.php:19
2389
- msgid "Malaysian Ringgits"
2390
- msgstr "Malaysisk Ringgits"
2391
-
2392
- #: includes/currencies.php:23 includes/currencies.php:20
2393
- msgid "Mexican Peso (&#36;)"
2394
- msgstr "Mexicansk Peso (&#36;)"
2395
-
2396
- #: includes/currencies.php:24 includes/currencies.php:21
2397
- msgid "New Zealand Dollar (&#36;)"
2398
- msgstr "New Zealand Dollar (8#36;)"
2399
-
2400
- #: includes/currencies.php:25 includes/currencies.php:22
2401
- msgid "Norwegian Krone"
2402
- msgstr "Norsk Krone"
2403
-
2404
- #: includes/currencies.php:26 includes/currencies.php:23
2405
- msgid "Philippine Pesos"
2406
- msgstr "Filippinsk Pesos"
2407
-
2408
- #: includes/currencies.php:27 includes/currencies.php:24
2409
- msgid "Polish Zloty"
2410
- msgstr "Polsk Zloty"
2411
-
2412
- #: includes/currencies.php:28 includes/currencies.php:25
2413
- msgid "Singapore Dollar (&#36;)"
2414
- msgstr "Singapore Dollar (&#36;)"
2415
-
2416
- #: includes/currencies.php:29
2417
- msgid "South African Rand"
2418
- msgstr "Syd Afrikansk Rand"
2419
-
2420
- #: includes/currencies.php:30
2421
- msgid "South Korean Won"
2422
- msgstr "Syd Korea Won"
2423
-
2424
- #: includes/currencies.php: