Paid Memberships Pro - Version 1.8.10

Version Description

  • SECURITY: Patched a cross site scripting (XSS) vulnerability on the Memberships -> Addons page in the dashboard. Thanks to Burak Kelebek for the discovery and responsible disclosure of this vulnerability.
  • BUG: Added pmpro_btn-submit-checkout class to the PayPal checkout buttons.
  • BUG: Updated Stripe and Braintree gateways to load billing fields and JavaScript when it's the default gateway (if not the current gateway specified).
  • BUG: Fixed bug where cancelation emails weren't being sent to users if they originated from PayPal.
  • BUG: Fixed bug where unsucessful invoices were shown on the Membership Account page. We aren't showing refunded invoices here now either, but plan to in the future.
  • BUG: The update billing page now uses the pmpro_include_billing_address_fields filter so gateways and addons can properly override the payment fields when needed.
  • BUG: The update billing page now uses the validatecreditcard.js script to set the Card Type in the background, just like checkout. Fixes some issues with updating credit cards on certain gateways.
  • BUG: Reintroduced the pmpro_members_list_sql filter.
  • BUG/ENHANCEMENT: Switched the Japanese Yen and South Korean Won to not use decimals by default. (Thanks, flatworld21 on wp.org)
  • ENHANCEMENT: Added an option to skip the confirmation step with PayPal Express.
  • ENHANCEMENT: Added the pmpro_membership_levels_table filter on the membership levels page of the dashboard to allow addons (like the upcoming MMPU addon) to override the HTML for the table shown.
  • ENHANCEMENT: Added the checkout_id column to the pmpro_membership_orders table. This will be used by addons and possible core in the future to track multiple orders that happen during the same checkout process.
  • ENHANCEMENT: Added support for the Serian language. (Thanks, Sasa Trifkovic)
  • NOTE: We are planning to remove the certificate_id and certificate_amount columns from the pmpro_membership_orders table. Please contact us if you are using this column for something to come up with a work around.
Download this release

Release Info

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

Code changes from version 1.8.9.3 to 1.8.10

adminpages/addons.php CHANGED
@@ -31,7 +31,10 @@
31
//get plugin status for filters
32
if(!empty($_REQUEST['plugin_status']))
33
$status = $_REQUEST['plugin_status'];
34
- else
35
$status = "all";
36
37
//split addons into groups for filtering
@@ -76,7 +79,7 @@
76
<li class="all"><a href="admin.php?page=pmpro-addons&plugin_status=all" <?php if(empty($status) || $status == "all") { ?>class="current"<?php } ?>><?php _e('All', 'pmpro'); ?> <span class="count">(<?php echo count($addons);?>)</span></a> |</li>
77
<li class="active"><a href="admin.php?page=pmpro-addons&plugin_status=active" <?php if($status == "active") { ?>class="current"<?php } ?>><?php _e('Active', 'pmpro'); ?> <span class="count">(<?php echo count($addons_active);?>)</span></a> |</li>
78
<li class="inactive"><a href="admin.php?page=pmpro-addons&plugin_status=inactive" <?php if($status == "inactive") { ?>class="current"<?php } ?>><?php _e('Inactive', 'pmpro'); ?> <span class="count">(<?php echo count($addons_inactive);?>)</span></a> |</li>
79
- <li class="update"><a href="admin.php?page=pmpro-addons&plugin_status=update" <?php if($status == "update") { ?>class="current"<?php } ?>><?php _e('Update Available', 'pmpro'); ?><span class="count">(<?php echo count($addons_update);?>)</span></a> |</li>
80
<li class="uninstalled"><a href="admin.php?page=pmpro-addons&plugin_status=uninstalled" <?php if($status == "uninstalled") { ?>class="current"<?php } ?>><?php _e('Not Installed', 'pmpro'); ?> <span class="count">(<?php echo count($addons_uninstalled);?>)</span></a></li>
81
</ul>
82
@@ -259,7 +262,7 @@
259
__( 'Visit plugin site' )
260
);
261
}
262
- $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data );
263
echo implode( ' | ', $plugin_meta );
264
?>
265
</div>
31
//get plugin status for filters
32
if(!empty($_REQUEST['plugin_status']))
33
$status = $_REQUEST['plugin_status'];
34
+
35
+ //make sure we have an approved status
36
+ $approved_statuses = array('all', 'active', 'inactive', 'update', 'uninstalled');
37
+ if(empty($status) || !in_array($status, $approved_statuses))
38
$status = "all";
39
40
//split addons into groups for filtering
79
<li class="all"><a href="admin.php?page=pmpro-addons&plugin_status=all" <?php if(empty($status) || $status == "all") { ?>class="current"<?php } ?>><?php _e('All', 'pmpro'); ?> <span class="count">(<?php echo count($addons);?>)</span></a> |</li>
80
<li class="active"><a href="admin.php?page=pmpro-addons&plugin_status=active" <?php if($status == "active") { ?>class="current"<?php } ?>><?php _e('Active', 'pmpro'); ?> <span class="count">(<?php echo count($addons_active);?>)</span></a> |</li>
81
<li class="inactive"><a href="admin.php?page=pmpro-addons&plugin_status=inactive" <?php if($status == "inactive") { ?>class="current"<?php } ?>><?php _e('Inactive', 'pmpro'); ?> <span class="count">(<?php echo count($addons_inactive);?>)</span></a> |</li>
82
+ <li class="update"><a href="admin.php?page=pmpro-addons&plugin_status=update" <?php if($status == "update") { ?>class="current"<?php } ?>><?php _e('Update Available', 'pmpro'); ?> <span class="count">(<?php echo count($addons_update);?>)</span></a> |</li>
83
<li class="uninstalled"><a href="admin.php?page=pmpro-addons&plugin_status=uninstalled" <?php if($status == "uninstalled") { ?>class="current"<?php } ?>><?php _e('Not Installed', 'pmpro'); ?> <span class="count">(<?php echo count($addons_uninstalled);?>)</span></a></li>
84
</ul>
85
262
__( 'Visit plugin site' )
263
);
264
}
265
+ $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status);
266
echo implode( ' | ', $plugin_meta );
267
?>
268
</div>
adminpages/membershiplevels.php CHANGED
@@ -631,6 +631,10 @@
631
<p><?php _e('Drag and drop membership levels to reorder them on the Levels page.', 'pmpro'); ?></p>
632
<?php } ?>
633
634
<table class="widefat membership-levels">
635
<thead>
636
<tr>
@@ -675,6 +679,18 @@
675
</tbody>
676
</table>
677
<?php
678
}
679
?>
680
631
<p><?php _e('Drag and drop membership levels to reorder them on the Levels page.', 'pmpro'); ?></p>
632
<?php } ?>
633
634
+ <?php
635
+ //going to capture the output of this table so we can filter it
636
+ ob_start();
637
+ ?>
638
<table class="widefat membership-levels">
639
<thead>
640
<tr>
679
</tbody>
680
</table>
681
<?php
682
+ $table_html = ob_get_clean();
683
+
684
+ /**
685
+ * Filter to change the Membership Levels table
686
+ * @since 1.8.10
687
+ *
688
+ * @param string $table_html HTML of the membership levels table
689
+ * @param array $reordered_levels Array of membership levels
690
+ */
691
+ $table_html = apply_filters('pmpro_membership_levels_table', $table_html, $reordered_levels);
692
+
693
+ echo $table_html;
694
}
695
?>
696
adminpages/memberslist-csv.php CHANGED
@@ -197,6 +197,12 @@
197
if(!empty($limit))
198
$sqlQuery .= "LIMIT {$start}, {$limit}";
199
200
// Generate a temporary file to store the data in.
201
$tmp_dir = sys_get_temp_dir();
202
$filename = tempnam( $tmp_dir, 'pmpro_ml_');
197
if(!empty($limit))
198
$sqlQuery .= "LIMIT {$start}, {$limit}";
199
200
+ /**
201
+ * Filter to change/manipulate the SQL for the list of members export
202
+ * @since v1.9.0 Re-introduced
203
+ */
204
+ $sqlQuery = apply_filters('pmpro_members_list_sql', $sqlQuery);
205
+
206
// Generate a temporary file to store the data in.
207
$tmp_dir = sys_get_temp_dir();
208
$filename = tempnam( $tmp_dir, 'pmpro_ml_');
adminpages/orders.php CHANGED
@@ -1199,6 +1199,9 @@ require_once( dirname( __FILE__ ) . "/admin_header.php" );
1199
<?php if ( ! empty( $order->accountnumber ) ) { ?>
1200
<?php echo $order->cardtype; ?>: x<?php echo last4( $order->accountnumber ); ?><br/>
1201
<?php } ?>
1202
<?php if ( ! empty( $order->billing->street ) ) { ?>
1203
<?php echo $order->billing->street; ?><br/>
1204
<?php if ( $order->billing->city && $order->billing->state ) { ?>
1199
<?php if ( ! empty( $order->accountnumber ) ) { ?>
1200
<?php echo $order->cardtype; ?>: x<?php echo last4( $order->accountnumber ); ?><br/>
1201
<?php } ?>
1202
+ <?php if ( ! empty( $order->billing->name ) ) { ?>
1203
+ <?php echo $order->billing->name; ?><br/>
1204
+ <?php } ?>
1205
<?php if ( ! empty( $order->billing->street ) ) { ?>
1206
<?php echo $order->billing->street; ?><br/>
1207
<?php if ( $order->billing->city && $order->billing->state ) { ?>
classes/class.memberorder.php CHANGED
@@ -39,6 +39,7 @@
39
$order->subtotal = "";
40
$order->tax = "";
41
$order->couponamount = "";
42
$order->total = "";
43
$order->payment_type = "";
44
$order->cardtype = "";
@@ -116,6 +117,7 @@
116
$this->subtotal = $dbobj->subtotal;
117
$this->tax = $dbobj->tax;
118
$this->couponamount = $dbobj->couponamount;
119
$this->certificate_id = $dbobj->certificate_id;
120
$this->certificateamount = $dbobj->certificateamount;
121
$this->total = $dbobj->total;
39
$order->subtotal = "";
40
$order->tax = "";
41
$order->couponamount = "";
42
+ $order->checkout_id = "";
43
$order->total = "";
44
$order->payment_type = "";
45
$order->cardtype = "";
117
$this->subtotal = $dbobj->subtotal;
118
$this->tax = $dbobj->tax;
119
$this->couponamount = $dbobj->couponamount;
120
+ $this->checkout_id = $dbobj->checkout_id;
121
$this->certificate_id = $dbobj->certificate_id;
122
$this->certificateamount = $dbobj->certificateamount;
123
$this->total = $dbobj->total;
classes/gateways/class.pmprogateway_braintree.php CHANGED
@@ -55,8 +55,9 @@
55
add_filter('pmpro_payment_option_fields', array('PMProGateway_braintree', 'pmpro_payment_option_fields'), 10, 2);
56
57
//code to add at checkout if Braintree is the current gateway
58
- $gateway = pmpro_getGateway();
59
- if($gateway == "braintree")
60
{
61
add_action('pmpro_checkout_before_submit_button', array('PMProGateway_braintree', 'pmpro_checkout_before_submit_button'));
62
add_filter('pmpro_checkout_order', array('PMProGateway_braintree', 'pmpro_checkout_order'));
55
add_filter('pmpro_payment_option_fields', array('PMProGateway_braintree', 'pmpro_payment_option_fields'), 10, 2);
56
57
//code to add at checkout if Braintree is the current gateway
58
+ $default_gateway = pmpro_getOption('gateway');
59
+ $current_gateway = pmpro_getGateway();
60
+ if($default_gateway == "braintree" || $current_gateway == "braintree")
61
{
62
add_action('pmpro_checkout_before_submit_button', array('PMProGateway_braintree', 'pmpro_checkout_before_submit_button'));
63
add_filter('pmpro_checkout_order', array('PMProGateway_braintree', 'pmpro_checkout_order'));
classes/gateways/class.pmprogateway_check.php CHANGED
@@ -145,6 +145,7 @@
145
*/
146
static function pmpro_checkout_after_payment_information_fields() {
147
global $gateway;
148
149
if($gateway == "check" && !pmpro_isLevelFree($pmpro_level)) {
150
$instructions = pmpro_getOption("instructions");
145
*/
146
static function pmpro_checkout_after_payment_information_fields() {
147
global $gateway;
148
+ global $pmpro_level;
149
150
if($gateway == "check" && !pmpro_isLevelFree($pmpro_level)) {
151
$instructions = pmpro_getOption("instructions");
classes/gateways/class.pmprogateway_paypal.php CHANGED
@@ -43,9 +43,20 @@
43
{
44
add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypal', 'pmpro_checkout_default_submit_button'));
45
add_action('pmpro_checkout_after_form', array('PMProGateway_paypal', 'pmpro_checkout_after_form'));
46
}
47
}
48
49
/**
50
* Make sure this gateway is in the gateways list
51
*
@@ -78,7 +89,8 @@
78
'use_ssl',
79
'tax_state',
80
'tax_rate',
81
- 'accepted_credit_cards'
82
);
83
84
return $options;
@@ -150,6 +162,17 @@
150
<input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($values['apisignature'])?>" />
151
</td>
152
</tr>
153
<tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
154
<th scope="row" valign="top">
155
<label><?php _e('IPN Handler URL', 'pmpro');?>:</label>
@@ -175,7 +198,7 @@
175
<?php if($gateway == "paypal" || $gateway == "paypalexpress" || $gateway == "paypalstandard") { ?>
176
<span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
177
<input type="hidden" name="submit-checkout" value="1" />
178
- <input type="image" value="<?php _e('Check Out with PayPal', 'pmpro');?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif");?>" />
179
</span>
180
<?php } ?>
181
43
{
44
add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypal', 'pmpro_checkout_default_submit_button'));
45
add_action('pmpro_checkout_after_form', array('PMProGateway_paypal', 'pmpro_checkout_after_form'));
46
+ add_action('http_api_curl', array('PMProGateway_paypal', 'http_api_curl'), 10, 3);
47
}
48
}
49
50
+ /**
51
+ * Update the SSLVERSION for CURL to support PayPal Express moving to TLS 1.2
52
+ *
53
+ * @since 1.8.9.1
54
+ */
55
+ static function http_api_curl($handle) {
56
+ if(strpos($url, 'paypal.com') !== false)
57
+ curl_setopt( $handle, CURLOPT_SSLVERSION, 6 );
58
+ }
59
+
60
/**
61
* Make sure this gateway is in the gateways list
62
*
89
'use_ssl',
90
'tax_state',
91
'tax_rate',
92
+ 'accepted_credit_cards',
93
+ 'paypalexpress_skip_confirmation'
94
);
95
96
return $options;
162
<input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($values['apisignature'])?>" />
163
</td>
164
</tr>
165
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
166
+ <th scope="row" valign="top">
167
+ <label for="paypalexpress_skip_confirmation"><?php _e('Confirmation Step', 'pmpro');?>:</label>
168
+ </th>
169
+ <td>
170
+ <select id="paypalexpress_skip_confirmation" name="paypalexpress_skip_confirmation">
171
+ <option value="0" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 0);?>>Require an extra confirmation after users return from PayPal Express.</option>
172
+ <option value="1" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 1);?>>Skip the extra confirmation after users return from PayPal Express.</option>
173
+ </select>
174
+ </td>
175
+ </tr>
176
<tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
177
<th scope="row" valign="top">
178
<label><?php _e('IPN Handler URL', 'pmpro');?>:</label>
198
<?php if($gateway == "paypal" || $gateway == "paypalexpress" || $gateway == "paypalstandard") { ?>
199
<span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
200
<input type="hidden" name="submit-checkout" value="1" />
201
+ <input type="image" class="pmpro_btn-submit-checkout" value="<?php _e('Check Out with PayPal', 'pmpro');?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif");?>" />
202
</span>
203
<?php } ?>
204
classes/gateways/class.pmprogateway_paypalexpress.php CHANGED
@@ -59,9 +59,20 @@
59
add_action('pmpro_checkout_before_processing', array('PMProGateway_paypalexpress', 'pmpro_checkout_before_processing'));
60
add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button'));
61
add_action('pmpro_checkout_after_form', array('PMProGateway_paypalexpress', 'pmpro_checkout_after_form'));
62
}
63
}
64
65
/**
66
* Make sure this gateway is in the gateways list
67
*
@@ -93,7 +104,8 @@
93
'currency',
94
'use_ssl',
95
'tax_state',
96
- 'tax_rate'
97
);
98
99
return $options;
@@ -165,6 +177,17 @@
165
<input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($values['apisignature'])?>" />
166
</td>
167
</tr>
168
<tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
169
<th scope="row" valign="top">
170
<label><?php _e('IPN Handler URL', 'pmpro');?>:</label>
@@ -279,7 +302,11 @@
279
$pmpro_msgt = "pmpro_error";
280
}
281
}
282
- elseif(!empty($_REQUEST['confirm']))
283
{
284
$morder = new MemberOrder();
285
$morder->getMemberOrderByPayPalToken($_REQUEST['token']);
@@ -408,7 +435,7 @@
408
?>
409
<span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
410
<input type="hidden" name="submit-checkout" value="1" />
411
- <input type="image" value="<?php _e('Check Out with PayPal', 'pmpro');?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif");?>" />
412
</span>
413
414
<span id="pmpro_submit_span" <?php if(($gateway == "paypalexpress" || $gateway == "paypalstandard") && $pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
@@ -527,8 +554,8 @@
527
$nvpStr .= "&CANCELURL=" . urlencode(pmpro_url("levels"));
528
529
$account_optional = apply_filters('pmpro_paypal_account_optional', true);
530
- if ($account_optional)
531
- $nvpStr .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing';
532
533
$nvpStr = apply_filters("pmpro_set_express_checkout_nvpstr", $nvpStr, $order);
534
59
add_action('pmpro_checkout_before_processing', array('PMProGateway_paypalexpress', 'pmpro_checkout_before_processing'));
60
add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button'));
61
add_action('pmpro_checkout_after_form', array('PMProGateway_paypalexpress', 'pmpro_checkout_after_form'));
62
+ add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3);
63
}
64
}
65
66
+ /**
67
+ * Update the SSLVERSION for CURL to support PayPal Express moving to TLS 1.2
68
+ *
69
+ * @since 1.8.9.1
70
+ */
71
+ static function http_api_curl($handle, $r, $url) {
72
+ if(strpos($url, 'paypal.com') !== false)
73
+ curl_setopt( $handle, CURLOPT_SSLVERSION, 6 );
74
+ }
75
+
76
/**
77
* Make sure this gateway is in the gateways list
78
*
104
'currency',
105
'use_ssl',
106
'tax_state',
107
+ 'tax_rate',
108
+ 'paypalexpress_skip_confirmation'
109
);
110
111
return $options;
177
<input type="text" id="apisignature" name="apisignature" size="60" value="<?php echo esc_attr($values['apisignature'])?>" />
178
</td>
179
</tr>
180
+ <tr class="gateway gateway_paypal gateway_paypalexpress" <?php if($gateway != "paypal" && $gateway != "paypalexpress") { ?>style="display: none;"<?php } ?>>
181
+ <th scope="row" valign="top">
182
+ <label for="paypalexpress_skip_confirmation"><?php _e('Confirmation Step', 'pmpro');?>:</label>
183
+ </th>
184
+ <td>
185
+ <select id="paypalexpress_skip_confirmation" name="paypalexpress_skip_confirmation">
186
+ <option value="0" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 0);?>>Require an extra confirmation after users return from PayPal Express.</option>
187
+ <option value="1" <?php selected(pmpro_getOption('paypalexpress_skip_confirmation'), 1);?>>Skip the extra confirmation after users return from PayPal Express.</option>
188
+ </select>
189
+ </td>
190
+ </tr>
191
<tr class="gateway gateway_paypal gateway_paypalexpress gateway_paypalstandard" <?php if($gateway != "paypal" && $gateway != "paypalexpress" && $gateway != "paypalstandard") { ?>style="display: none;"<?php } ?>>
192
<th scope="row" valign="top">
193
<label><?php _e('IPN Handler URL', 'pmpro');?>:</label>
302
$pmpro_msgt = "pmpro_error";
303
}
304
}
305
+
306
+ if(empty($pmpro_msg) &&
307
+ (!empty($_REQUEST['confirm']) ||
308
+ (pmpro_getOption('paypalexpress_skip_confirmation') && $pmpro_review))
309
+ )
310
{
311
$morder = new MemberOrder();
312
$morder->getMemberOrderByPayPalToken($_REQUEST['token']);
435
?>
436
<span id="pmpro_paypalexpress_checkout" <?php if(($gateway != "paypalexpress" && $gateway != "paypalstandard") || !$pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
437
<input type="hidden" name="submit-checkout" value="1" />
438
+ <input type="image" class="pmpro_btn-submit-checkout" value="<?php _e('Check Out with PayPal', 'pmpro');?> &raquo;" src="<?php echo apply_filters("pmpro_paypal_button_image", "https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif");?>" />
439
</span>
440
441
<span id="pmpro_submit_span" <?php if(($gateway == "paypalexpress" || $gateway == "paypalstandard") && $pmpro_requirebilling) { ?>style="display: none;"<?php } ?>>
554
$nvpStr .= "&CANCELURL=" . urlencode(pmpro_url("levels"));
555
556
$account_optional = apply_filters('pmpro_paypal_account_optional', true);
557
+ if ($account_optional)
558
+ $nvpStr .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing';
559
560
$nvpStr = apply_filters("pmpro_set_express_checkout_nvpstr", $nvpStr, $order);
561
classes/gateways/class.pmprogateway_stripe.php CHANGED
@@ -33,7 +33,7 @@
33
$this->loadStripeLibrary();
34
Stripe::setApiKey(pmpro_getOption("stripe_secretkey"));
35
Stripe::setAPIVersion("2015-07-13");
36
-
37
return $this->gateway;
38
}
39
@@ -106,8 +106,9 @@
106
//add_filter('pmpro_next_payment', array('PMProGateway_stripe', 'pmpro_next_payment'), 10, 3);
107
108
//code to add at checkout if Stripe is the current gateway
109
- $gateway = pmpro_getGateway();
110
- if($gateway == "stripe")
111
{
112
add_action('pmpro_checkout_preheader', array('PMProGateway_stripe', 'pmpro_checkout_preheader'));
113
add_filter('pmpro_checkout_order', array('PMProGateway_stripe', 'pmpro_checkout_order'));
@@ -231,7 +232,9 @@
231
{
232
global $gateway, $pmpro_level;
233
234
- if($gateway == "stripe" && !pmpro_isLevelFree($pmpro_level))
235
{
236
//stripe js library
237
wp_enqueue_script("stripe", "https://js.stripe.com/v2/", array(), NULL);
@@ -1198,8 +1201,8 @@
1198
else
1199
{
1200
//find the user's last stripe order
1201
- $last_order = new MemberOrder();
1202
- $last_order->getLastMemberOrder($user_id, array('success', 'cancelled'), NULL, 'stripe', $order->gateway_environment);
1203
if(!empty($last_order->payment_transaction_id))
1204
$payment_transaction_id = $last_order->payment_transaction_id;
1205
}
33
$this->loadStripeLibrary();
34
Stripe::setApiKey(pmpro_getOption("stripe_secretkey"));
35
Stripe::setAPIVersion("2015-07-13");
36
+
37
return $this->gateway;
38
}
39
106
//add_filter('pmpro_next_payment', array('PMProGateway_stripe', 'pmpro_next_payment'), 10, 3);
107
108
//code to add at checkout if Stripe is the current gateway
109
+ $default_gateway = pmpro_getOption('gateway');
110
+ $current_gateway = pmpro_getGateway();
111
+ if($default_gateway == "stripe" || $current_gateway == "stripe")
112
{
113
add_action('pmpro_checkout_preheader', array('PMProGateway_stripe', 'pmpro_checkout_preheader'));
114
add_filter('pmpro_checkout_order', array('PMProGateway_stripe', 'pmpro_checkout_order'));
232
{
233
global $gateway, $pmpro_level;
234
235
+ $default_gateway = pmpro_getOption("gateway");
236
+
237
+ if(($gateway == "stripe" || $default_gateway == "stripe") && !pmpro_isLevelFree($pmpro_level))
238
{
239
//stripe js library
240
wp_enqueue_script("stripe", "https://js.stripe.com/v2/", array(), NULL);
1201
else
1202
{
1203
//find the user's last stripe order
1204
+ $last_order = new MemberOrder();
1205
+ $last_order->getLastMemberOrder($user_id, array('success', 'cancelled'), NULL, 'stripe', $order->Gateway->gateway_environment);
1206
if(!empty($last_order->payment_transaction_id))
1207
$payment_transaction_id = $last_order->payment_transaction_id;
1208
}
css/frontend.css CHANGED
@@ -113,7 +113,7 @@ form.pmpro_form .leftmar {
113
margin: 8px 0 0 210px;
114
}
115
form.pmpro_form .pmpro_captcha {
116
- margin: 0 0 0 210px !important;
117
}
118
form.pmpro_form .pmpro_captcha div {
119
clear: none;
@@ -413,7 +413,7 @@ li.pmpro_more {
413
text-wrap: normal;
414
white-space: normal;
415
}
416
- form.pmpro_form .leftmar {
417
margin: 2px 0 0 0;
418
}
419
form.pmpro_form .pmpro_submit {
113
margin: 8px 0 0 210px;
114
}
115
form.pmpro_form .pmpro_captcha {
116
+ margin: 0 0 0 210px;
117
}
118
form.pmpro_form .pmpro_captcha div {
119
clear: none;
413
text-wrap: normal;
414
white-space: normal;
415
}
416
+ form.pmpro_form .leftmar, form.pmpro_form .pmpro_captcha {
417
margin: 2px 0 0 0;
418
}
419
form.pmpro_form .pmpro_submit {
includes/currencies.php CHANGED
@@ -51,7 +51,8 @@
51
'JPY' => array(
52
'name' => __('Japanese Yen (&yen;)', 'pmpro'),
53
'symbol' => '&yen;',
54
- 'position' => 'right'
55
),
56
'MYR' => __('Malaysian Ringgits', 'pmpro'),
57
'MXN' => __('Mexican Peso (&#36;)', 'pmpro'),
@@ -70,13 +71,19 @@
70
'symbol' => 'R ',
71
'position' => 'left'
72
),
73
- 'KRW' => __('South Korean Won', 'pmpro'),
74
'SEK' => __('Swedish Krona', 'pmpro'),
75
'CHF' => __('Swiss Franc', 'pmpro'),
76
'TWD' => __('Taiwan New Dollars', 'pmpro'),
77
'THB' => __('Thai Baht', 'pmpro'),
78
'TRY' => __('Turkish Lira', 'pmpro'),
79
- 'VND' => __('Vietnamese Dong', 'pmpro')
80
);
81
82
$pmpro_currencies = apply_filters("pmpro_currencies", $pmpro_currencies);
51
'JPY' => array(
52
'name' => __('Japanese Yen (&yen;)', 'pmpro'),
53
'symbol' => '&yen;',
54
+ 'position' => 'right',
55
+ 'decimals' => 0,
56
),
57
'MYR' => __('Malaysian Ringgits', 'pmpro'),
58
'MXN' => __('Mexican Peso (&#36;)', 'pmpro'),
71
'symbol' => 'R ',
72
'position' => 'left'
73
),
74
+ 'KRW' => array(
75
+ 'name' => __('South Korean Won', 'pmpro'),
76
+ 'decimals' => 0,
77
+ ),
78
'SEK' => __('Swedish Krona', 'pmpro'),
79
'CHF' => __('Swiss Franc', 'pmpro'),
80
'TWD' => __('Taiwan New Dollars', 'pmpro'),
81
'THB' => __('Thai Baht', 'pmpro'),
82
'TRY' => __('Turkish Lira', 'pmpro'),
83
+ 'VND' => array(
84
+ 'name' => __('Vietnamese Dong', 'pmpro'),
85
+ 'decimals' => 0,
86
+ ),
87
);
88
89
$pmpro_currencies = apply_filters("pmpro_currencies", $pmpro_currencies);
includes/functions.php CHANGED
@@ -644,14 +644,12 @@ function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
644
if(empty($user_id)) //no user_id passed, check the current user
645
{
646
$user_id = $current_user->ID;
647
- $membership_levels = $current_user->membership_levels;
648
}
649
- elseif(is_numeric($user_id)) //get membership levels for given user
650
- {
651
$membership_levels = pmpro_getMembershipLevelsForUser($user_id);
652
- }
653
else
654
- return false; //invalid user_id
655
656
if($levels === "0" || $levels === 0) //if 0 was passed, return true if they have no level and false if they have any
657
{
@@ -668,18 +666,29 @@ function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
668
$levels = array($levels);
669
}
670
671
- if(empty($membership_levels))
672
{
673
- //user has no levels just check if 0, L, -1, or e was sent in one of the levels
674
- if(in_array(0, $levels, true) || in_array("0", $levels))
675
- $return = true;
676
elseif(in_array("L", $levels) || in_array("l", $levels))
677
- $return = (!empty($user_id) && $user_id == $current_user->ID);
678
elseif(in_array("-L", $levels) || in_array("-l", $levels))
679
- $return = (empty($user_id) || $user_id != $current_user->ID);
680
elseif(in_array("E", $levels) || in_array("e", $levels)) {
681
$sql = "SELECT id FROM $wpdb->pmpro_memberships_users WHERE user_id=$user_id AND status='expired' LIMIT 1";
682
- $expired = $wpdb->get_var($sql);
683
$return = !empty($expired);
684
}
685
}
@@ -699,7 +708,7 @@ function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
699
if(empty($user_id) || $user_id != $current_user->ID)
700
$return = true;
701
}
702
- elseif($level == "0" || strtoupper($level) == "E")
703
{
704
continue; //user with levels so not a "non-member" or expired
705
}
@@ -709,6 +718,7 @@ function pmpro_hasMembershipLevel($levels = NULL, $user_id = NULL)
709
$level_obj = pmpro_getLevel(is_numeric($level) ? abs(intval($level)) : $level); //make sure our level is in a proper format
710
if(empty($level_obj)){continue;} //invalid level
711
$found_level = false;
712
foreach($membership_levels as $membership_level)
713
{
714
if($membership_level->id == $level_obj->id) //found a match
@@ -823,8 +833,9 @@ function pmpro_changeMembershipLevel($level, $user_id = NULL, $old_level_status
823
*
824
* @param int $level_id ID of the level changed to.
825
* @param int $user_id ID of the user changed.
826
*/
827
- do_action("pmpro_before_change_membership_level", $level_id, $user_id);
828
829
//should we cancel their gateway subscriptions?
830
$pmpro_cancel_previous_subscriptions = true;
@@ -1411,8 +1422,19 @@ function pmpro_checkDiscountCode($code, $level_id = NULL, $return_errors = false
1411
}
1412
}
1413
1414
- //allow filter
1415
- $pmpro_check_discount_code = apply_filters("pmpro_check_discount_code", !$error, $dbcode, $level_id, $code);
1416
if(is_string($pmpro_check_discount_code))
1417
$error = $pmpro_check_discount_code; //string returned, this is an error
1418
elseif(!$pmpro_check_discount_code && !$error)
@@ -2096,7 +2118,7 @@ function pmpro_formatPrice($price)
2096
global $pmpro_currency, $pmpro_currency_symbol, $pmpro_currencies;
2097
2098
//start with the price formatted with two decimals
2099
- $formatted = number_format($price, 2);
2100
2101
//settings stored in array?
2102
if(!empty($pmpro_currencies[$pmpro_currency]) && is_array($pmpro_currencies[$pmpro_currency]))
644
if(empty($user_id)) //no user_id passed, check the current user
645
{
646
$user_id = $current_user->ID;
647
}
648
+
649
+ if(!empty($user_id) && is_numeric($user_id)) //get membership levels for given user
650
$membership_levels = pmpro_getMembershipLevelsForUser($user_id);
651
else
652
+ $membership_levels = NULL; //non-users don't have levels
653
654
if($levels === "0" || $levels === 0) //if 0 was passed, return true if they have no level and false if they have any
655
{
666
$levels = array($levels);
667
}
668
669
+ if(empty($membership_levels)) //user has no levels just check if 0, L, -1, or e was sent in one of the levels
670
{
671
+ //check for negative level
672
+ $negative_level = false;
673
+ foreach($levels as $level) {
674
+ if(intval($level) < 0) {
675
+ $negative_level = true;
676
+ break;
677
+ }
678
+ }
679
+
680
+ //are we looking for non-members or not?
681
+ if($negative_level)
682
+ return true; //-1/etc, negative level
683
+ elseif(in_array(0, $levels, true) || in_array("0", $levels))
684
+ $return = true; //0 level
685
elseif(in_array("L", $levels) || in_array("l", $levels))
686
+ $return = (!empty($user_id) && $user_id == $current_user->ID); //L, logged in users
687
elseif(in_array("-L", $levels) || in_array("-l", $levels))
688
+ $return = (empty($user_id) || $user_id != $current_user->ID); //-L, not logged in users
689
elseif(in_array("E", $levels) || in_array("e", $levels)) {
690
$sql = "SELECT id FROM $wpdb->pmpro_memberships_users WHERE user_id=$user_id AND status='expired' LIMIT 1";
691
+ $expired = $wpdb->get_var($sql); //E, expired members
692
$return = !empty($expired);
693
}
694
}
708
if(empty($user_id) || $user_id != $current_user->ID)
709
$return = true;
710
}
711
+ elseif($level === "0" || $level === 0 || strtoupper($level) === "E")
712
{
713
continue; //user with levels so not a "non-member" or expired
714
}
718
$level_obj = pmpro_getLevel(is_numeric($level) ? abs(intval($level)) : $level); //make sure our level is in a proper format
719
if(empty($level_obj)){continue;} //invalid level
720
$found_level = false;
721
+
722
foreach($membership_levels as $membership_level)
723
{
724
if($membership_level->id == $level_obj->id) //found a match
833
*
834
* @param int $level_id ID of the level changed to.
835
* @param int $user_id ID of the user changed.
836
+ * @param array $old_levels array of prior levels the user belonged to.
837
*/
838
+ do_action("pmpro_before_change_membership_level", $level_id, $user_id, $old_levels);
839
840
//should we cancel their gateway subscriptions?
841
$pmpro_cancel_previous_subscriptions = true;
1422
}
1423
}
1424
1425
+ /**
1426
+ * Filter the results of the discount code check.
1427
+ * @since 1.7.13.1
1428
+ *
1429
+ * @param bool $okay true if code check is okay or false if there was an error
1430
+ * @param object $dbcode Object containing code data from the database row
1431
+ * @param int $level_id ID of the level the user is checking out for.
1432
+ * @param string $code Discount code string.
1433
+ *
1434
+ * @return mixed $okay true if okay, false or error message string if not okay
1435
+ */
1436
+ $okay = !$error;
1437
+ $pmpro_check_discount_code = apply_filters("pmpro_check_discount_code", $okay, $dbcode, $level_id, $code);
1438
if(is_string($pmpro_check_discount_code))
1439
$error = $pmpro_check_discount_code; //string returned, this is an error
1440
elseif(!$pmpro_check_discount_code && !$error)
2118
global $pmpro_currency, $pmpro_currency_symbol, $pmpro_currencies;
2119
2120
//start with the price formatted with two decimals
2121
+ $formatted = number_format((double)$price, 2);
2122
2123
//settings stored in array?
2124
if(!empty($pmpro_currencies[$pmpro_currency]) && is_array($pmpro_currencies[$pmpro_currency]))
includes/setup.sql CHANGED
@@ -133,6 +133,7 @@ CREATE TABLE `wp_pmpro_membership_orders` (
133
`subtotal` varchar(16) NOT NULL DEFAULT '',
134
`tax` varchar(16) NOT NULL DEFAULT '',
135
`couponamount` varchar(16) NOT NULL DEFAULT '',
136
`certificate_id` int(11) NOT NULL DEFAULT '0',
137
`certificateamount` varchar(16) NOT NULL DEFAULT '',
138
`total` varchar(16) NOT NULL DEFAULT '',
@@ -162,7 +163,8 @@ CREATE TABLE `wp_pmpro_membership_orders` (
162
KEY `payment_transaction_id` (`payment_transaction_id`),
163
KEY `subscription_transaction_id` (`subscription_transaction_id`),
164
KEY `affiliate_id` (`affiliate_id`),
165
- KEY `affiliate_subid` (`affiliate_subid`)
166
);
167
168
-- --------------------------------------------------------
133
`subtotal` varchar(16) NOT NULL DEFAULT '',
134
`tax` varchar(16) NOT NULL DEFAULT '',
135
`couponamount` varchar(16) NOT NULL DEFAULT '',
136
+ `checkout_id` int(11) NOT NULL DEFAULT '0',
137
`certificate_id` int(11) NOT NULL DEFAULT '0',
138
`certificateamount` varchar(16) NOT NULL DEFAULT '',
139
`total` varchar(16) NOT NULL DEFAULT '',
163
KEY `payment_transaction_id` (`payment_transaction_id`),
164
KEY `subscription_transaction_id` (`subscription_transaction_id`),
165
KEY `affiliate_id` (`affiliate_id`),
166
+ KEY `affiliate_subid` (`affiliate_subid`),
167
+ KEY `checkout_id` (`checkout_id`)
168
);
169
170
-- --------------------------------------------------------
includes/upgradecheck.php CHANGED
@@ -169,11 +169,11 @@ function pmpro_checkForUpgrades()
169
v1.8.9.2 (db v1.9)
170
* Changed 'code' column of pmpro_membership_orders table to 32 characters.
171
*/
172
- if($pmpro_db_version < 1.9) {
173
pmpro_db_delta();
174
175
- $pmpro_db_version = 1.9;
176
- pmpro_setOption("db_version", "1.9");
177
}
178
179
/*
@@ -184,6 +184,30 @@ function pmpro_checkForUpgrades()
184
if($pmpro_db_version < 1.91) {
185
$pmpro_db_version = pmpro_upgrade_1_8_9_3();
186
}
187
}
188
189
function pmpro_db_delta()
@@ -246,6 +270,7 @@ function pmpro_db_delta()
246
`subtotal` varchar(16) NOT NULL DEFAULT '',
247
`tax` varchar(16) NOT NULL DEFAULT '',
248
`couponamount` varchar(16) NOT NULL DEFAULT '',
249
`certificate_id` int(11) NOT NULL DEFAULT '0',
250
`certificateamount` varchar(16) NOT NULL DEFAULT '',
251
`total` varchar(16) NOT NULL DEFAULT '',
@@ -275,7 +300,8 @@ function pmpro_db_delta()
275
KEY `payment_transaction_id` (`payment_transaction_id`),
276
KEY `subscription_transaction_id` (`subscription_transaction_id`),
277
KEY `affiliate_id` (`affiliate_id`),
278
- KEY `affiliate_subid` (`affiliate_subid`)
279
);
280
";
281
dbDelta($sqlQuery);
169
v1.8.9.2 (db v1.9)
170
* Changed 'code' column of pmpro_membership_orders table to 32 characters.
171
*/
172
+ if($pmpro_db_version < 1.892) {
173
pmpro_db_delta();
174
175
+ $pmpro_db_version = 1.892;
176
+ pmpro_setOption("db_version", "1.892");
177
}
178
179
/*
184
if($pmpro_db_version < 1.91) {
185
$pmpro_db_version = pmpro_upgrade_1_8_9_3();
186
}
187
+
188
+ /*
189
+ v1.8.10 (db v1.92)
190
+
191
+ Added checkout_id column to pmpro_membership_orders
192
+ */
193
+ if($pmpro_db_version < 1.92) {
194
+ pmpro_db_delta();
195
+
196
+ $pmpro_db_version = 1.92;
197
+ pmpro_setOption("db_version", "1.92");
198
+ }
199
+
200
+ /*
201
+ v1.8.10.2 (db v1.93)
202
+
203
+ Run dbDelta again to fix broken/missing orders tables.
204
+ */
205
+ if($pmpro_db_version < 1.93) {
206
+ pmpro_db_delta();
207
+
208
+ $pmpro_db_version = 1.93;
209
+ pmpro_setOption("db_version", "1.93");
210
+ }
211
}
212
213
function pmpro_db_delta()
270
`subtotal` varchar(16) NOT NULL DEFAULT '',
271
`tax` varchar(16) NOT NULL DEFAULT '',
272
`couponamount` varchar(16) NOT NULL DEFAULT '',
273
+ `checkout_id` int(11) NOT NULL DEFAULT '0',
274
`certificate_id` int(11) NOT NULL DEFAULT '0',
275
`certificateamount` varchar(16) NOT NULL DEFAULT '',
276
`total` varchar(16) NOT NULL DEFAULT '',
300
KEY `payment_transaction_id` (`payment_transaction_id`),
301
KEY `subscription_transaction_id` (`subscription_transaction_id`),
302
KEY `affiliate_id` (`affiliate_id`),
303
+ KEY `affiliate_subid` (`affiliate_subid`),
304
+ KEY `checkout_id` (`checkout_id`)
305
);
306
";
307
dbDelta($sqlQuery);
languages/pmpro-sr_RS.mo ADDED
Binary file
languages/pmpro-sr_RS.po ADDED
@@ -0,0 +1,2758 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: pmpro\n"
4
+ "POT-Creation-Date: 2014-01-31 10:16+0100\n"
5
+ "PO-Revision-Date: 2016-07-16 15:03+0200\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: Stranger Studios <jason@strangerstudios.com>\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "X-Generator: Poedit 1.8.8\n"
12
+ "X-Poedit-KeywordsList: __;_;_e;_ex;_x;_n\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Language: en_GB\n"
15
+ "X-Poedit-SearchPath-0: includes\n"
16
+ "X-Poedit-SearchPath-1: .\n"
17
+ "X-Poedit-SearchPath-2: classes\n"
18
+ "X-Poedit-SearchPath-3: preheaders\n"
19
+ "X-Poedit-SearchPath-4: pages\n"
20
+ "X-Poedit-SearchPath-5: adminpages\n"
21
+ "X-Poedit-SearchPath-6: classes/gateways\n"
22
+ "X-Poedit-SearchPath-7: services\n"
23
+ "X-Poedit-SearchPath-8: shortcodes\n"
24
+ "X-Poedit-SearchPath-9: scheduled\n"
25
+
26
+ #: includes/localization.php:23
27
+ msgid "Day"
28
+ msgstr "Dan"
29
+
30
+ #: includes/localization.php:25
31
+ msgid "Week"
32
+ msgstr "Sedmica"
33
+
34
+ #: includes/localization.php:27
35
+ msgid "Month"
36
+ msgstr "Mjesec"
37
+
38
+ #: includes/localization.php:29
39
+ msgid "Year"
40
+ msgstr "Godina"
41
+
42
+ #: includes/currencies.php:7 includes/currencies.php:44
43
+ msgid "US Dollars (&#36;)"
44
+ msgstr "Američki dolar"
45
+
46
+ #: includes/currencies.php:8 includes/currencies.php:47
47
+ msgid "Euros (&euro;)"
48
+ msgstr "Evro"
49
+
50
+ #: includes/currencies.php:9 includes/currencies.php:46
51
+ msgid "Pounds Sterling (&pound;)"
52
+ msgstr "Funta"
53
+
54
+ #: includes/currencies.php:10
55
+ msgid "Australian Dollars (&#36;)"
56
+ msgstr "Australijski dolar"
57
+
58
+ #: includes/currencies.php:11
59
+ msgid "Brazilian Real (&#36;)"
60
+ msgstr ""
61
+
62
+ #: includes/currencies.php:12 includes/currencies.php:45
63
+ msgid "Canadian Dollars (&#36;)"
64
+ msgstr "Kanadski dolar"
65
+
66
+ #: includes/currencies.php:13
67
+ msgid "Chinese Yuan"
68
+ msgstr "Kineski jen"
69
+
70
+ #: includes/currencies.php:14
71
+ msgid "Czech Koruna"
72
+ msgstr "Češka kruna"
73
+
74
+ #: includes/currencies.php:15
75
+ msgid "Danish Krone"
76
+ msgstr "Danska kruna"
77
+
78
+ #: includes/currencies.php:16
79
+ msgid "Hong Kong Dollar (&#36;)"
80
+ msgstr ""
81
+
82
+ #: includes/currencies.php:17
83
+ msgid "Hungarian Forint"
84
+ msgstr ""
85
+
86
+ #: includes/currencies.php:18
87
+ msgid "Indian Rupee"
88
+ msgstr ""
89
+
90
+ #: includes/currencies.php:19
91
+ msgid "Indonesia Rupiah"
92
+ msgstr ""
93
+
94
+ #: includes/currencies.php:20
95
+ msgid "Israeli Shekel"
96
+ msgstr ""
97
+
98
+ #: includes/currencies.php:21
99
+ msgid "Japanese Yen (&yen;)"
100
+ msgstr ""
101
+
102
+ #: includes/currencies.php:22
103
+ msgid "Malaysian Ringgits"
104
+ msgstr ""
105
+
106
+ #: includes/currencies.php:23
107
+ msgid "Mexican Peso (&#36;)"
108
+ msgstr ""
109
+
110
+ #: includes/currencies.php:24
111
+ msgid "New Zealand Dollar (&#36;)"
112
+ msgstr ""
113
+
114
+ #: includes/currencies.php:25
115
+ msgid "Norwegian Krone"
116
+ msgstr ""
117
+
118
+ #: includes/currencies.php:26
119
+ msgid "Philippine Pesos"
120
+ msgstr ""
121
+
122
+ #: includes/currencies.php:27
123
+ msgid "Polish Zloty"
124
+ msgstr ""
125
+
126
+ #: includes/currencies.php:28
127
+ msgid "Singapore Dollar (&#36;)"
128
+ msgstr ""
129
+
130
+ #: includes/currencies.php:29
131
+ msgid "South African Rand"
132
+ msgstr ""
133
+
134
+ #: includes/currencies.php:30
135
+ msgid "South Korean Won"
136
+ msgstr ""
137
+
138
+ #: includes/currencies.php:31
139
+ msgid "Swedish Krona"
140
+ msgstr ""
141
+
142
+ #: includes/currencies.php:32
143
+ msgid "Swiss Franc"
144
+ msgstr ""
145
+
146
+ #: includes/currencies.php:33
147
+ msgid "Taiwan New Dollars"
148
+ msgstr ""
149
+
150
+ #: includes/currencies.php:34
151
+ msgid "Thai Baht"
152
+ msgstr ""
153
+
154
+ #: includes/currencies.php:35
155
+ msgid "Turkish Lira"
156
+ msgstr ""
157
+
158
+ #: includes/currencies.php:36
159
+ msgid "Vietnamese Dong"
160
+ msgstr ""
161
+
162
+ #: includes/metaboxes.php:38
163
+ msgid ""
164
+ "This post is already protected for this level because it is within a category "
165
+ "that requires membership."
166
+ msgstr ""
167
+ "Ovaj post je već zaštićen za ovaj nivo jer se nalazi u kategoriji za koju je "
168
+ "potrebno članstvo."
169
+
170
+ #: includes/metaboxes.php:99 includes/metaboxes.php:100
171
+ msgid "Require Membership"
172
+ msgstr "Potrebno Članstvo"
173
+
174
+ #: includes/adminpages.php:9 includes/adminpages.php:39
175
+ msgid "Memberships"
176
+ msgstr "Članstvo"
177
+
178
+ #: includes/adminpages.php:10 includes/adminpages.php:49
179
+ msgid "Page Settings"
180
+ msgstr "Postavke Stranice."
181
+
182
+ #: includes/adminpages.php:11 includes/adminpages.php:54
183
+ msgid "Payment Settings"
184
+ msgstr "Postavke Plaćanja."
185
+
186
+ #: includes/adminpages.php:12 includes/adminpages.php:59
187
+ #: adminpages/emailsettings.php:60
188
+ msgid "Email Settings"
189
+ msgstr "Email postavke"
190
+
191
+ #: includes/adminpages.php:13 includes/adminpages.php:64
192
+ #: adminpages/advancedsettings.php:79
193
+ msgid "Advanced Settings"
194
+ msgstr "Napredne Postavke"
195
+
196
+ #: includes/adminpages.php:14 includes/adminpages.php:69
197
+ #: adminpages/admin_header.php:154
198
+ msgid "Add Ons"
199
+ msgstr "Dodaci"
200
+
201
+ #: includes/adminpages.php:15 includes/adminpages.php:74
202
+ #: adminpages/memberslist.php:25
203
+ msgid "Members List"
204
+ msgstr "Lista Članova"
205
+
206
+ #: includes/adminpages.php:16 includes/adminpages.php:79
207
+ msgid "Reports"
208
+ msgstr "Izvještaji"
209
+
210
+ #: includes/adminpages.php:17 includes/adminpages.php:84
211
+ #: adminpages/orders.php:520
212
+ msgid "Orders"
213
+ msgstr "Narudžbe"
214
+
215
+ #: includes/adminpages.php:18 includes/adminpages.php:89
216
+ msgid "Discount Codes"
217
+ msgstr "Kodovi za Popuste"
218
+
219
+ #: includes/adminpages.php:44 adminpages/membershiplevels.php:496
220
+ #: adminpages/admin_header.php:149
221
+ msgid "Membership Levels"
222
+ msgstr "Nivoi Članstva"
223
+
224
+ #: includes/profile.php:27 pages/invoice.php:28 pages/invoice.php:51
225
+ #: pages/checkout.php:33 pages/confirmation.php:47 pages/confirmation.php:64
226
+ #: pages/confirmation.php:105 adminpages/orders.php:601
227
+ msgid "Membership Level"
228
+ msgstr "Nivo Članstva"
229
+
230
+ #: includes/profile.php:36
231
+ msgid "Current Level"
232
+ msgstr "Trenutni Nivo"
233
+
234
+ #: includes/profile.php:39
235
+ msgid "None"
236
+ msgstr "Nijedan"
237
+
238
+ #: includes/profile.php:84
239
+ msgid "User is not paying."
240
+ msgstr "Korisnik ne plaća."
241
+
242
+ #: includes/profile.php:120 adminpages/memberslist.php:159
243
+ #: adminpages/discountcodes.php:550 adminpages/reports/login.php:145
244
+ msgid "Expires"
245
+ msgstr "Ističe"
246
+
247
+ #: includes/profile.php:123 adminpages/membershiplevels.php:569
248
+ #: adminpages/paymentsettings.php:448 adminpages/paymentsettings.php:473
249
+ #: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:187
250
+ #: adminpages/advancedsettings.php:199
251
+ msgid "No"
252
+ msgstr "Ne"
253
+
254
+ #: includes/profile.php:124 adminpages/membershiplevels.php:569
255
+ #: adminpages/paymentsettings.php:449 adminpages/paymentsettings.php:474
256
+ #: adminpages/advancedsettings.php:188
257
+ msgid "Yes"
258
+ msgstr "Da"
259
+
260
+ #: includes/functions.php:196
261
+ #, php-format
262
+ msgid "The price for membership is <strong>%s</strong> now"
263
+ msgstr "Cijena članstva je <strong>%s</strong> sada"
264
+
265
+ #: includes/functions.php:205
266
+ #, php-format
267
+ msgid " and then <strong>%s per %s for %d more %s</strong>."
268
+ msgstr "pa onda <strong>%s po %s za %d više %s</strong>."
269
+
270
+ #: includes/functions.php:209
271
+ #, php-format
272
+ msgid " and then <strong>%s every %d %s for %d more %s</strong>."
273
+ msgstr "a onda <strong> %s svaki %d %s za %d više %s</strong>."
274
+
275
+ #: includes/functions.php:214
276
+ #, php-format
277
+ msgid " and then <strong>%s after %d %s</strong>."
278
+ msgstr "a ond <strong> %s poslije %d %s</string>."
279
+
280
+ #: includes/functions.php:220
281
+ #, php-format
282
+ msgid " and then <strong>%s per %s</strong>."
283
+ msgstr "a onda <strong>%s po %s</strong>."
284
+
285
+ #: includes/functions.php:224
286
+ #, php-format
287
+ msgid " and then <strong>%s every %d %s</strong>."
288
+ msgstr "a onda <strong> %s svaki %d %s</strong>."
289
+
290
+ #: includes/functions.php:241 pages/levels.php:82
291
+ msgid "After your initial payment, your first payment is Free."
292
+ msgstr "Naredna uplaata nakon vaše početne uplate je besplatna"
293
+
294
+ #: includes/functions.php:245 pages/levels.php:86
295
+ #, php-format
296
+ msgid "After your initial payment, your first %d payments are Free."
297
+ msgstr "Poslije vaše prvobitne uplate, vaša naredna %d uplata je Besplatna."
298
+
299
+ #: includes/functions.php:252 pages/levels.php:93
300
+ #, php-format
301
+ msgid "After your initial payment, your first payment will cost %s."
302
+ msgstr "Nakon vaše prvobitne uplate, vaša naredna uplata će da iznosi %s."
303
+
304
+ #: includes/functions.php:256 pages/levels.php:97
305
+ #, php-format
306
+ msgid "After your initial payment, your first %d payments will cost %s."
307
+ msgstr "Nakon vaše prvobitne uplate , vaša naredna %d uplata će da iznosi %s."
308
+
309
+ #: includes/functions.php:267
310
+ #, php-format
311
+ msgid "Customers in %s will be charged %s%% tax."
312
+ msgstr "Korisnici u %s će biti naplaćeni %s%% tax."
313
+
314
+ #: includes/functions.php:281
315
+ #, php-format
316
+ msgid "Membership expires after %d %s."
317
+ msgstr "Članstvo ističe nakon %d %s."
318
+
319
+ #: includes/functions.php:517
320
+ msgid "User ID not found."
321
+ msgstr "Korisnički ID nije pronađen."
322
+
323
+ #: includes/functions.php:534
324
+ msgid "Invalid level."
325
+ msgstr "Nevažećo nivo."
326
+
327
+ #: includes/functions.php:545
328
+ msgid "not changing?"
329
+ msgstr "Ne mijenjate?"
330
+
331
+ #: includes/functions.php:562 includes/functions.php:609
332
+ #: includes/functions.php:618
333
+ msgid "Error interacting with database"
334
+ msgstr "Greška u interakciji sa bazom podataka."
335
+
336
+ #: includes/functions.php:659 includes/functions.php:698
337
+ msgid "Membership level not found."
338
+ msgstr "Nivo Članstva nije pronađen."
339
+
340
+ #: includes/functions.php:1080
341
+ msgid "The discount code could not be found."
342
+ msgstr "Kod za popust nije pronađen."
343
+
344
+ #: includes/functions.php:1096
345
+ #, php-format
346
+ msgid "This discount code goes into effect on %s."
347
+ msgstr "Kod za popust važi za %s"
348
+
349
+ #: includes/functions.php:1105
350
+ #, php-format
351
+ msgid "This discount code expired on %s."
352
+ msgstr "Kod za popust je istekao %s."
353
+
354
+ #: includes/functions.php:1117
355
+ msgid "This discount code is no longer valid."
356
+ msgstr "Kod za popust nije više važeći."
357
+
358
+ #: includes/functions.php:1132
359
+ msgid "This discount code does not apply to this membership level."
360
+ msgstr "Kod za popust ne važi za ovaj nivo članstva."
361
+
362
+ #: includes/functions.php:1140
363
+ msgid "This discount code is okay."
364
+ msgstr "Kod za popust je važeći."
365
+
366
+ #: includes/functions.php:1164
367
+ msgid "and"
368
+ msgstr "i"
369
+
370
+ #: includes/functions.php:1349
371
+ msgid "Sign Up for !!name!! Now"
372
+ msgstr "Prijavite Se za !!name!! Sada"
373
+
374
+ #: includes/functions.php:1355
375
+ msgid "Please specify a level id."
376
+ msgstr "Molimo Vas da odredite ID nivoa."
377
+
378
+ #: pages/invoice.php:22 pages/confirmation.php:41
379
+ #, php-format
380
+ msgid "Invoice #%s on %s"
381
+ msgstr "Faktura #%s na %s"
382
+
383
+ #: pages/invoice.php:27 pages/confirmation.php:46 pages/confirmation.php:104
384
+ msgid "Account"
385
+ msgstr "Nalog"
386
+
387
+ #: pages/invoice.php:30 pages/account.php:29 pages/confirmation.php:49
388
+ msgid "Membership Expires"
389
+ msgstr "Članstvo ističe"
390
+
391
+ #: pages/invoice.php:33 pages/checkout.php:66 pages/checkout.php:76
392
+ #: pages/checkout.php:577 pages/confirmation.php:52
393
+ #: classes/class.pmproemail.php:228 classes/class.pmproemail.php:237
394
+ #: classes/class.pmproemail.php:246 classes/class.pmproemail.php:325
395
+ #: classes/class.pmproemail.php:334 classes/class.pmproemail.php:645
396
+ msgid "Discount Code"
397
+ msgstr "Kod za Popust"
398
+
399
+ #: pages/invoice.php:48 pages/account.php:90 pages/checkout.php:325
400
+ #: pages/confirmation.php:61 pages/billing.php:58 adminpages/memberslist.php:150
401
+ msgid "Billing Address"
402
+ msgstr "Adresa za naplatu"
403
+
404
+ #: pages/invoice.php:50 pages/account.php:105 pages/confirmation.php:63
405
+ msgid "Payment Method"
406
+ msgstr "Metoda plaćanja"
407
+
408
+ #: pages/invoice.php:52 pages/invoice.php:109 pages/confirmation.php:65
409
+ msgid "Total Billed"
410
+ msgstr "Ukupno naplaćeno"
411
+
412
+ #: pages/invoice.php:69 pages/confirmation.php:82
413
+ msgid "ending in"
414
+ msgstr "Ističe za"
415
+
416
+ #: pages/invoice.php:70 pages/confirmation.php:83
417
+ #: adminpages/membershiplevels.php:516
418
+ msgid "Expiration"
419
+ msgstr "Isticanje"
420
+
421
+ #: pages/invoice.php:79
422
+ msgid "Subtotal"
423
+ msgstr "Suma stavke"
424
+
425
+ #: pages/invoice.php:80 adminpages/orders.php:304
426
+ msgid "Tax"
427
+ msgstr "Porez"
428
+
429
+ #: pages/invoice.php:82
430
+ msgid "Coupon"
431
+ msgstr "Kupon"
432
+
433
+ #: pages/invoice.php:84 adminpages/orders.php:320 adminpages/orders.php:602
434
+ msgid "Total"
435
+ msgstr "Ukupno"
436
+
437
+ #: pages/invoice.php:107 adminpages/orders.php:442 adminpages/orders.php:607
438
+ msgid "Date"
439
+ msgstr "Datum"
440
+
441
+ #: pages/invoice.php:108
442
+ msgid "Invoice #"
443
+ msgstr "Faktura #"
444
+
445
+ #: pages/invoice.php:122
446
+ msgid "View Invoice"
447
+ msgstr "Pregled Fakture"
448
+
449
+ #: pages/invoice.php:134
450
+ msgid "No invoices found."
451
+ msgstr "Faktura nije pronađena"
452
+
453
+ #: pages/invoice.php:141 pages/confirmation.php:113
454
+ msgid "View Your Membership Account &rarr;"
455
+ msgstr "Pregled vašeg naloga članstva &rarr;"
456
+
457
+ #: pages/invoice.php:145
458
+ msgid "&larr; View All Invoices"
459
+ msgstr "&rarr; Prikaži sve Fakture"
460
+
461
+ #: pages/account.php:10
462
+ msgid "Your membership is <strong>active</strong>."
463
+ msgstr "Vaše članstvo je <strong>aktivno</strong>."
464
+
465
+ #: pages/account.php:12 pages/billing.php:16 pages/levels.php:13
466
+ msgid "Level"
467
+ msgstr "Nivo"
468
+
469
+ #: pages/account.php:14 pages/billing.php:18
470
+ msgid "Membership Fee"
471
+ msgstr "Provizija za Članstvo"
472
+
473
+ #: pages/account.php:25 pages/billing.php:29
474
+ msgid "Duration"
475
+ msgstr "Trajanje"
476
+
477
+ #: pages/account.php:34
478