From 93b9ec3567df71c16ca819f82ea0bc0373a2f972 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 1 Dec 2021 16:10:29 -0500 Subject: [PATCH 001/145] pmpro_default_level --- .../gateways/class.pmprogateway_stripe.php | 190 +++++++++++--- services/stripe-webhook.php | 233 ++++++++++++++++++ 2 files changed, 390 insertions(+), 33 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 69967a68f..2d7592a8d 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -14,6 +14,7 @@ use Stripe\WebhookEndpoint as Stripe_Webhook; use Stripe\StripeClient as Stripe_Client; // Used for deleting webhook as of 2.4 use Stripe\Account as Stripe_Account; +use Stripe\Checkout\Session as Stripe_Checkout_Session; define( "PMPRO_STRIPE_API_VERSION", "2020-03-02" ); @@ -141,6 +142,7 @@ public static function init() { // $_REQUEST['review'] here means the PayPal Express review pag if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) { + /* add_action( 'pmpro_after_checkout_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' @@ -167,6 +169,12 @@ public static function init() { 'PMProGateway_stripe', 'pmpro_checkout_before_processing' ) ); + */ + add_filter('pmpro_include_billing_address_fields', '__return_false'); + add_filter('pmpro_include_payment_information_fields', '__return_false'); + add_filter('pmpro_required_billing_fields', array('PMProGateway_stripe', 'pmpro_required_billing_fields')); + add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); + add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); } add_action( 'pmpro_payment_option_fields', array( 'PMProGateway_stripe', 'pmpro_set_up_apple_pay' ), 10, 2 ); @@ -178,6 +186,137 @@ public static function init() { add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) ); } + /** + * Swap in our submit buttons. + * + * @param bool $show + * + * @return bool + * + * @since 1.8 + */ + static function pmpro_checkout_default_submit_button($show) + { + global $gateway, $pmpro_requirebilling; + + //show our submit buttons + ?> + style="display: none;"> + + + + + style="display: none;"> + + + + user_id = $user_id; + $morder->status = 'token'; + $morder->saveOrder(); + + //save discount code use + if(!empty($discount_code_id)) { + $wpdb->query("INSERT INTO $wpdb->pmpro_discount_codes_uses (code_id, user_id, order_id, timestamp) VALUES('" . $discount_code_id . "', '" . $user_id . "', '" . $morder->id . "', now())"); + } + + // Time to send the user to pay with Stripe! + $stripe = new PMProGateway_stripe(); + + // Let's first get the customer to charge. + $customer = $stripe->update_customer_at_checkout( $morder ); + if ( empty( $customer ) ) { + // There was an issue creating/updating the Stripe customer. + // $order will have an error message, so we don't need to add one. + d($customer); + d($morder); + wp_die(); + return false; + } + + // Next, let's get the product being purchased. + $product_id = $stripe->get_product_id_for_level( $morder->membership_id ); + + // Then, we need to build the line items array to charge. + $line_items = array(); + + // First, let's handle the initial payment. + if ( ! empty( $morder->InitialPayment ) ) { + $initial_payment_price = $stripe->get_price_for_product( $product_id, $morder->InitialPayment ); + $line_items[] = array( + 'price' => $initial_payment_price->id, + 'quantity' => 1, + ); + } + + // Now, let's handle the recurring payments. + if ( pmpro_isLevelRecurring( $morder->membership_level ) ) { + $subtotal = $morder->PaymentAmount; + $tax = $morder->getTaxForPrice( $subtotal ); + $recurring_payment_amount = pmpro_round_price( (float) $subtotal + (float) $tax ); + $recurring_payment_price = $stripe->get_price_for_product( $product_id, $recurring_payment_amount, $morder->BillingPeriod, $morder->BillingFrequency ); + $line_items[] = array( + 'price' => $recurring_payment_price->id, + 'quantity' => 1, + ); + $subscription_data = array( + 'trial_period_days' => $stripe->calculate_trial_period_days( $morder ), + ); + } + + // And let's send 'em to Stripe! + $checkout_session_params = array( + 'customer' => $customer->id, + 'payment_method_types' => $pmpro_currency == 'EUR' && empty( $subscription_data ) ? array( 'card', 'bancontact', 'eps', 'giropay', 'ideal', 'p24', 'sepa_debit', 'sofort') : array('card'), + 'line_items' => $line_items, + 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', + 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ), + 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ), + //'payment_intent_data' => array( + // 'application_fee_amount' => 10000 // Get paid for orders. + //), + //'subscription_data' => array( + // 'application_fee_percent' => 2 // Get paid for subscriptions. + //), + ); + if ( ! empty( $subscription_data ) ) { + $checkout_session_params['subscription_data'] = $subscription_data; + } + try { + $checkout_session = Stripe_Checkout_Session::create( $checkout_session_params ); + // Save so that we can confirm the payment later. + update_pmpro_membership_order_meta( $morder->id, 'stripe_checkout_session_id', $checkout_session->id ); + wp_redirect( $checkout_session->url ); + exit; + } catch ( Exception $e ) { + d($e); + d($checkout_session_params); + wp_die(); + return null; + } + } + /** * Clear any saved (preserved) subscription IDs that should have been processed and are now timed out. */ @@ -621,36 +760,20 @@ public static function pmpro_checkout_after_preheader( $order ) { * Don't require address fields if they are set to hide. */ public static function pmpro_required_billing_fields( $fields ) { - global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail; - - //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required. - unset( $fields['CVV'] ); - - //if using stripe lite, remove some fields from the required array - if ( $pmpro_stripe_lite ) { - //some fields to remove - $remove = array( - 'bfirstname', - 'blastname', - 'baddress1', - 'bcity', - 'bstate', - 'bzipcode', - 'bphone', - 'bcountry', - 'CardType' - ); - //if a user is logged in, don't require bemail either - if ( ! empty( $current_user->user_email ) ) { - $remove[] = 'bemail'; - $bemail = $current_user->user_email; - $bconfirmemail = $bemail; - } - //remove the fields - foreach ( $remove as $field ) { - unset( $fields[ $field ] ); - } - } + unset($fields['bfirstname']); + unset($fields['blastname']); + unset($fields['baddress1']); + unset($fields['bcity']); + unset($fields['bstate']); + unset($fields['bzipcode']); + unset($fields['bphone']); + unset($fields['bemail']); + unset($fields['bcountry']); + unset($fields['CardType']); + unset($fields['AccountNumber']); + unset($fields['ExpirationMonth']); + unset($fields['ExpirationYear']); + unset($fields['CVV']); return $fields; } @@ -1279,6 +1402,7 @@ public static function dependencies() { * @since 1.4 */ public function process( &$order ) { + return true; $payment_transaction_id = ''; $subscription_transaction_id = ''; @@ -2229,7 +2353,7 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu if ( $is_recurring && ( empty( $price->recurring->interval_count ) || intval( $price->recurring->interval_count ) !== intval( $cycle_number ) ) ) { continue; } - return $price->id; + return $price; } } catch (\Throwable $th) { // There was an error listing prices. @@ -2255,7 +2379,7 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu try { $price = Stripe_Price::create( $price_args ); if ( ! empty( $price->id ) ) { - return $price->id; + return $price; } } catch (\Throwable $th) { // Could not create product. @@ -2336,7 +2460,7 @@ private function create_subscription_for_customer_from_order( $customer_id, $ord $subscription_params = array( 'customer' => $customer_id, 'items' => array( - array( 'price' => $price ), + array( 'price' => $price->id ), ), 'trial_period_days' => $trial_period_days, 'expand' => array( diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 9827083f9..f31389b19 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -409,6 +409,120 @@ pmpro_stripeWebhookExit(); } } + elseif($pmpro_stripe_event->type == "checkout.session.completed") + { + // First, let's get the checkout session. + $checkout_session = $pmpro_stripe_event->data->object; + + // Let's then find the PMPro order for the checkout session. + $order_id = $wpdb->get_var( $wpdb->prepare( "SELECT pmpro_membership_order_id FROM $wpdb->pmpro_membership_ordermeta WHERE meta_key = 'stripe_checkout_session_id' AND meta_value = %s LIMIT 1", $checkout_session->id ) ); + if ( empty( $order_id ) ) { + $logstr .= "Could not find an order for Checkout Session " . $checkout_session->id; + pmpro_stripeWebhookExit(); + } + $order = new MemberOrder( $order_id ); + if ( empty( $order ) ) { + $logstr .= "Order ID " . $order_id . " for Checkout Session " . $checkout_session->id . " could not be found."; + pmpro_stripeWebhookExit(); + } + + // Assign payment and subscription transaction IDs to the order. + if ( $checkout_session->mode === 'payment' ) { + // User purchased a one-time payment level. Assign the payment intent ID to the order. + $order->payment_transaction_id = $checkout_session->payment_intent; + } elseif ( $checkout_session->mode === 'subscription' ) { + // User purchased a subscription. Assign the subscription ID invoice ID to the order. + $order->subscription_transaction_id = $checkout_session->subscription; + try { + $invoices = \Stripe\Invoice::all( [ 'subscription' => $checkout_session->subscription ] ); + if ( ! empty( $invoices->data ) ) { + $order->payment_transaction_id = $invoices->data[0]->id; + } + } catch ( \Stripe\Error\Base $e ) { + // Could not get invoices. We just won't set a payment transaction ID. + } + } + + // Was the checkout session successful? + if ( $checkout_session->payment_status == "paid" ) { + // Yes. But did we already process this order? + if ( ! in_array( $order->status , array( 'token', 'pending' ) ) ) { + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " has already been processed. Ignoring."; + pmpro_stripeWebhookExit(); + } + // No we have not processed this order. Let's process it now. + if ( pmpro_webhookChangeMembershipLevel( $order, $checkout_session ) ) { + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " was processed successfully."; + } else { + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " could not be processed."; + $order->status = "error"; + $order->saveOrder(); + } + } else { + // No. The user is probably using a delayed notification payment method. + // Set to pending in the meantime and wait for the next webhook. + $order->status = "pending"; + $order->saveOrder(); + $logstr .= "Checkout Session " . $checkout_session->id . " has not yet been processed for PMPro order ID " . $order->id . "."; + } + pmpro_stripeWebhookExit(); + + } + elseif($pmpro_stripe_event->type == "checkout.session.async_payment_succeeded") + { + // First, let's get the checkout session. + $checkout_session = $pmpro_stripe_event->data->object; + + // Let's then find the PMPro order for the checkout session. + $order_id = $wpdb->get_var( $wpdb->prepare( "SELECT pmpro_membership_order_id FROM $wpdb->pmpro_membership_ordermeta WHERE meta_key = 'stripe_checkout_session_id' AND meta_value = %s LIMIT 1", $checkout_session->id ) ); + if ( empty( $order_id ) ) { + $logstr .= "Could not find an order for Checkout Session " . $checkout_session->id; + pmpro_stripeWebhookExit(); + } + $order = new MemberOrder( $order_id ); + if ( empty( $order ) ) { + $logstr .= "Order ID " . $order_id . " for Checkout Session " . $checkout_session->id . " could not be found."; + pmpro_stripeWebhookExit(); + } + + // Have we already processed this order? + if ( ! in_array( $order->status , array( 'token', 'pending' ) ) ) { + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " has already been processed. Ignoring."; + pmpro_stripeWebhookExit(); + } + // No we have not processed this order. Let's process it now. + if ( pmpro_webhookChangeMembershipLevel( $order, $checkout_session ) ) { + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " was processed successfully."; + } else { + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " could not be processed."; + $order->status = "error"; + $order->saveOrder(); + } + pmpro_stripeWebhookExit(); + } + elseif($pmpro_stripe_event->type == "checkout.session.async_payment_failed") + { + // First, let's get the checkout session. + $checkout_session = $pmpro_stripe_event->data->object; + + // Let's then find the PMPro order for the checkout session. + $order_id = $wpdb->get_var( $wpdb->prepare( "SELECT pmpro_membership_order_id FROM $wpdb->pmpro_membership_ordermeta WHERE meta_key = 'stripe_checkout_session_id' AND meta_value = %s LIMIT 1", $checkout_session->id ) ); + if ( empty( $order_id ) ) { + $logstr .= "Could not find an order for Checkout Session " . $checkout_session->id; + pmpro_stripeWebhookExit(); + } + $order = new MemberOrder( $order_id ); + if ( empty( $order ) ) { + $logstr .= "Order ID " . $order_id . " for Checkout Session " . $checkout_session->id . " could not be found."; + pmpro_stripeWebhookExit(); + } + + // Mark the order as failed. + $order->status = "error"; + $order->saveOrder(); + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " could not be processed."; + pmpro_stripeWebhookExit(); + } } else { @@ -583,3 +697,122 @@ function pmpro_stripeWebhookExit() exit; } + + /* + Change the membership level. We also update the membership order to include filtered valus. +*/ +function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { + + global $wpdb; + + // Get the membership level. + $morder->getMembershipLevel(); + + //set the start date to current_time('timestamp') but allow filters (documented in preheaders/checkout.php) + $startdate = apply_filters( "pmpro_checkout_start_date", "'" . current_time( 'mysql' ) . "'", $morder->user_id, $morder->membership_level ); + + //fix expiration date + if ( ! empty( $morder->membership_level->expiration_number ) ) { + $enddate = "'" . date_i18n( "Y-m-d", strtotime( "+ " . $morder->membership_level->expiration_number . " " . $morder->membership_level->expiration_period, current_time( "timestamp" ) ) ) . "'"; + } else { + $enddate = "NULL"; + } + + //filter the enddate (documented in preheaders/checkout.php) + $enddate = apply_filters( "pmpro_checkout_end_date", $enddate, $morder->user_id, $morder->membership_level, $startdate ); + + //get discount code + $morder->getDiscountCode(); + if ( ! empty( $morder->discount_code ) ) { + //update membership level + $morder->getMembershipLevel( true ); + $discount_code_id = $morder->discount_code->id; + } else { + $discount_code_id = ""; + } + + + //custom level to change user to + $custom_level = array( + 'user_id' => $morder->user_id, + 'membership_id' => $morder->membership_level->id, + 'code_id' => $discount_code_id, + 'initial_payment' => $morder->membership_level->initial_payment, + 'billing_amount' => $morder->membership_level->billing_amount, + 'cycle_number' => $morder->membership_level->cycle_number, + 'cycle_period' => $morder->membership_level->cycle_period, + 'billing_limit' => $morder->membership_level->billing_limit, + 'trial_amount' => $morder->membership_level->trial_amount, + 'trial_limit' => $morder->membership_level->trial_limit, + 'startdate' => $startdate, + 'enddate' => $enddate + ); + + global $pmpro_error; + if ( ! empty( $pmpro_error ) ) { + echo $pmpro_error; + ipnlog( $pmpro_error ); + } + + //change level and continue "checkout" + if ( pmpro_changeMembershipLevel( $custom_level, $morder->user_id, 'changed' ) !== false ) { + //update order status and transaction ids + $morder->status = "success"; + // TODO: Set payment and subscription IDs. + $morder->saveOrder(); + + //add discount code use + if ( ! empty( $discount_code ) && ! empty( $use_discount_code ) ) { + + $wpdb->query( + $wpdb->prepare( + "INSERT INTO {$wpdb->pmpro_discount_codes_uses} + ( code_id, user_id, order_id, timestamp ) + VALUES( %d, %d, %s, %s )", + $discount_code_id), + $morder->user_id, + $morder->id, + current_time( 'mysql' ) + ); + } + + //save first and last name fields + if ( ! empty( $_POST['first_name'] ) ) { + $old_firstname = get_user_meta( $morder->user_id, "first_name", true ); + if ( empty( $old_firstname ) ) { + update_user_meta( $morder->user_id, "first_name", $_POST['first_name'] ); + } + } + if ( ! empty( $_POST['last_name'] ) ) { + $old_lastname = get_user_meta( $morder->user_id, "last_name", true ); + if ( empty( $old_lastname ) ) { + update_user_meta( $morder->user_id, "last_name", $_POST['last_name'] ); + } + } + + //hook + do_action( "pmpro_after_checkout", $morder->user_id, $morder ); + + //setup some values for the emails + if ( ! empty( $morder ) ) { + $invoice = new MemberOrder( $morder->id ); + } else { + $invoice = null; + } + + $user = get_userdata( $morder->user_id ); + $user->membership_level = $morder->membership_level; //make sure they have the right level info + + //send email to member + $pmproemail = new PMProEmail(); + $pmproemail->sendCheckoutEmail( $user, $invoice ); + + //send email to admin + $pmproemail = new PMProEmail(); + $pmproemail->sendCheckoutAdminEmail( $user, $invoice ); + + return true; + } else { + return false; + } +} \ No newline at end of file From 0e9cd8f49ddfbdc8cd7b43efb0829c1aaec899d7 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 2 Dec 2021 11:24:22 -0500 Subject: [PATCH 002/145] Better handling of taxes with Stripe and other payment types at stripe checkout --- .../gateways/class.pmprogateway_stripe.php | 54 ++++++++++++++++++- services/stripe-webhook.php | 5 ++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 2d7592a8d..f092c4de6 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -285,12 +285,56 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) ); } + // Set up tax and billing address information. + // TODO: Make these variables into PMPro settings. + // TODO: Use $tax_type when getting/creating prices. + $tax_type = 'exclusive'; // Can be none, inclusive, or exclusive. + $collect_tax_id = true; // Can be true or false. Force to false if tax_type is none. + $collect_billing_address = true; // Can be true or false. Force to true if tax_type is not none. + if ( $tax_type === 'none' ) { + $automatic_tax = array( + 'enabled' => false, + ); + $tax_id_collection = array( + 'enabled' => false, + ); + $billing_address_collection = $collect_billing_address ? 'required' : 'auto'; + } else { + $automatic_tax = array( + 'enabled' => true, + ); + $tax_id_collection = array( + 'enabled' => $collect_tax_id, + ); + $billing_address_collection = 'required'; + } + + // Set up payment method types. + $payment_method_types = array( + 'card', + ); + if ( empty( $subscription_data ) ) { + if ( $pmpro_currency === 'USD' ) { + $payment_method_types = array( 'card', 'klarna' ); + } + if ( $pmpro_currency === 'EUR' ) { + $payment_method_types = array( 'card', 'bancontact', 'eps', 'giropay', 'ideal', 'p24', 'sepa_debit', 'sofort'); + } + } + // And let's send 'em to Stripe! $checkout_session_params = array( 'customer' => $customer->id, - 'payment_method_types' => $pmpro_currency == 'EUR' && empty( $subscription_data ) ? array( 'card', 'bancontact', 'eps', 'giropay', 'ideal', 'p24', 'sepa_debit', 'sofort') : array('card'), + 'payment_method_types' => $payment_method_types, 'line_items' => $line_items, 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', + 'automatic_tax' => $automatic_tax, + 'tax_id_collection' => $tax_id_collection, + 'billing_address_collection' => $billing_address_collection, + 'customer_update' => array( + 'address' => 'auto', + 'name' => 'auto' + ), 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ), 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ), //'payment_intent_data' => array( @@ -2353,6 +2397,11 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu if ( $is_recurring && ( empty( $price->recurring->interval_count ) || intval( $price->recurring->interval_count ) !== intval( $cycle_number ) ) ) { continue; } + // Check if tax is set up correctly. If not, continue. + // TODO: Update this to pull from PMPro settings. + if ( $price->tax_behavior !== 'exclusive' ) { + continue; + } return $price; } } catch (\Throwable $th) { @@ -2367,7 +2416,8 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu $price_args = array( 'product' => $product_id, 'currency' => strtolower( $pmpro_currency ), - 'unit_amount' => $unit_amount + 'unit_amount' => $unit_amount, + 'tax_behavior' => 'exclusive', ); if ( $is_recurring ) { $price_args['recurring'] = array( diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index f31389b19..3f78af36c 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -443,6 +443,11 @@ } } + // Update order total, subtotal, and tax. + $order->total = (float) $checkout_session->amount_total / 100; + $order->subtotal = (float) $checkout_session->amount_subtotal / 100; + $order->tax = (float) $checkout_session->total_details->amount_tax / 100; + // Was the checkout session successful? if ( $checkout_session->payment_status == "paid" ) { // Yes. But did we already process this order? From 2e6817c1a45fc01cf77efb4baa65548f66bbd6a7 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 15 Dec 2021 13:26:08 -0500 Subject: [PATCH 003/145] Saving checkout information in order meta --- .../gateways/class.pmprogateway_stripe.php | 21 +++++-- services/stripe-webhook.php | 55 ++++++++++++------- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 87616785e..7129ee9ad 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -227,7 +227,7 @@ static function pmpro_checkout_default_submit_button($show) */ static function pmpro_checkout_before_change_membership_level($user_id, $morder) { - global $discount_code_id, $wpdb, $pmpro_currency; + global $pmpro_level, $discount_code, $discount_code_id, $wpdb, $pmpro_currency; //if no order, no need to pay if(empty($morder)) @@ -237,10 +237,21 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) $morder->status = 'token'; $morder->saveOrder(); - //save discount code use - if(!empty($discount_code_id)) { - $wpdb->query("INSERT INTO $wpdb->pmpro_discount_codes_uses (code_id, user_id, order_id, timestamp) VALUES('" . $discount_code_id . "', '" . $user_id . "', '" . $morder->id . "', now())"); - } + // Save some checkout information in the order so that we can access it when the payment is complete. + // Save the request variables. + $request_vars = $_REQUEST; + unset( $request_vars['password'] ); + unset( $request_vars['password2'] ); + unset( $request_vars['password2_copy'] ); + update_pmpro_membership_order_meta( $morder->id, 'checkout_request_vars', $request_vars ); + + // Save the checkout level. + $pmpro_level_arr = (array) $pmpro_level; + update_pmpro_membership_order_meta( $morder->id, 'checkout_level', $pmpro_level_arr ); + + // Save the discount code. + $pmpro_discount_code_arr = (array) $discount_code; + update_pmpro_membership_order_meta( $morder->id, 'checkout_discount_code', $pmpro_discount_code_arr ); // Time to send the user to pay with Stripe! $stripe = new PMProGateway_stripe(); diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 3f78af36c..2a5f4e020 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -708,30 +708,45 @@ function pmpro_stripeWebhookExit() */ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { - global $wpdb; + global $wpdb, $pmpro_level, $discount_code; + + // We need to pull the checkout level and fields data from the order. + $checkout_level_arr = get_pmpro_membership_order_meta( $morder->id, 'checkout_level', true ); + $pmpro_level = (object) $checkout_level_arr; + + // TODO: Maybe set $pmpro_checkout_level_ids for MMPU compatibility. + + // Set $discount_code. + $discount_code_arr = get_pmpro_membership_order_meta( $morder->id, 'discount_code', true ); + if ( ! empty( $discount_code_arr ) ) { + $discount_code = (object) $discount_code_arr; + } + + // Set $_REQUEST. + $checkout_request_vars = get_pmpro_membership_order_meta( $morder->id, 'checkout_request_vars', true ); + $_REQUEST = array_merge( $_REQUEST, $checkout_request_vars ); - // Get the membership level. - $morder->getMembershipLevel(); + // Run the pmpro_checkout_before_change_membership_level action in case add ons need to set up. + remove_action( 'pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2 ); + do_action( 'pmpro_checkout_before_change_membership_level', $morder->user_id, $morder ); //set the start date to current_time('timestamp') but allow filters (documented in preheaders/checkout.php) - $startdate = apply_filters( "pmpro_checkout_start_date", "'" . current_time( 'mysql' ) . "'", $morder->user_id, $morder->membership_level ); + $startdate = apply_filters( "pmpro_checkout_start_date", "'" . current_time( 'mysql' ) . "'", $morder->user_id, $pmpro_level ); //fix expiration date - if ( ! empty( $morder->membership_level->expiration_number ) ) { - $enddate = "'" . date_i18n( "Y-m-d", strtotime( "+ " . $morder->membership_level->expiration_number . " " . $morder->membership_level->expiration_period, current_time( "timestamp" ) ) ) . "'"; + if ( ! empty( $pmpro_level->expiration_number ) ) { + $enddate = "'" . date_i18n( "Y-m-d", strtotime( "+ " . $pmpro_level->expiration_number . " " . $pmpro_level->expiration_period, current_time( "timestamp" ) ) ) . "'"; } else { $enddate = "NULL"; } //filter the enddate (documented in preheaders/checkout.php) - $enddate = apply_filters( "pmpro_checkout_end_date", $enddate, $morder->user_id, $morder->membership_level, $startdate ); + $enddate = apply_filters( "pmpro_checkout_end_date", $enddate, $morder->user_id, $pmpro_level, $startdate ); //get discount code - $morder->getDiscountCode(); - if ( ! empty( $morder->discount_code ) ) { + if ( ! empty( $discount_code ) ) { //update membership level - $morder->getMembershipLevel( true ); - $discount_code_id = $morder->discount_code->id; + $discount_code_id = $discount_code->id; } else { $discount_code_id = ""; } @@ -740,15 +755,15 @@ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { //custom level to change user to $custom_level = array( 'user_id' => $morder->user_id, - 'membership_id' => $morder->membership_level->id, + 'membership_id' => $pmpro_level->id, 'code_id' => $discount_code_id, - 'initial_payment' => $morder->membership_level->initial_payment, - 'billing_amount' => $morder->membership_level->billing_amount, - 'cycle_number' => $morder->membership_level->cycle_number, - 'cycle_period' => $morder->membership_level->cycle_period, - 'billing_limit' => $morder->membership_level->billing_limit, - 'trial_amount' => $morder->membership_level->trial_amount, - 'trial_limit' => $morder->membership_level->trial_limit, + 'initial_payment' => $pmpro_level->initial_payment, + 'billing_amount' => $pmpro_level->billing_amount, + 'cycle_number' => $pmpro_level->cycle_number, + 'cycle_period' => $pmpro_level->cycle_period, + 'billing_limit' => $pmpro_level->billing_limit, + 'trial_amount' => $pmpro_level->trial_amount, + 'trial_limit' => $pmpro_level->trial_limit, 'startdate' => $startdate, 'enddate' => $enddate ); @@ -806,7 +821,7 @@ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { } $user = get_userdata( $morder->user_id ); - $user->membership_level = $morder->membership_level; //make sure they have the right level info + $user->membership_level = $pmpro_level; //make sure they have the right level info //send email to member $pmproemail = new PMProEmail(); From 5b1ab2eb4085675c2ec8feea1d7c2b00f54d392b Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Mon, 10 Jan 2022 13:36:19 -0500 Subject: [PATCH 004/145] Restricting Stripe Checkout beta behind constant PMPRO_STRIPE_CHECKOUT_BETA_ENABLED --- .../gateways/class.pmprogateway_stripe.php | 536 ++++++++++-------- 1 file changed, 302 insertions(+), 234 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 7129ee9ad..f8a576a1a 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -143,39 +143,42 @@ public static function init() { // $_REQUEST['review'] here means the PayPal Express review pag if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) { - /* - add_action( 'pmpro_after_checkout_preheader', array( - 'PMProGateway_stripe', - 'pmpro_checkout_after_preheader' - ) ); - - add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) ); - add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); - add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); - add_filter( 'pmpro_include_billing_address_fields', array( - 'PMProGateway_stripe', - 'pmpro_include_billing_address_fields' - ) ); - add_filter( 'pmpro_include_cardtype_field', array( - 'PMProGateway_stripe', - 'pmpro_include_billing_address_fields' - ) ); - add_filter( 'pmpro_include_payment_information_fields', array( - 'PMProGateway_stripe', - 'pmpro_include_payment_information_fields' - ) ); - - //make sure we clean up subs we will be cancelling after checkout before processing - add_action( 'pmpro_checkout_before_processing', array( - 'PMProGateway_stripe', - 'pmpro_checkout_before_processing' - ) ); - */ - add_filter('pmpro_include_billing_address_fields', '__return_false'); - add_filter('pmpro_include_payment_information_fields', '__return_false'); - add_filter('pmpro_required_billing_fields', array('PMProGateway_stripe', 'pmpro_required_billing_fields')); - add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); - add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); + if ( ! self::stripe_checkout_enabled() ) { + // On-site checkout flow. + add_action( 'pmpro_after_checkout_preheader', array( + 'PMProGateway_stripe', + 'pmpro_checkout_after_preheader' + ) ); + + add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) ); + add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); + add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); + add_filter( 'pmpro_include_billing_address_fields', array( + 'PMProGateway_stripe', + 'pmpro_include_billing_address_fields' + ) ); + add_filter( 'pmpro_include_cardtype_field', array( + 'PMProGateway_stripe', + 'pmpro_include_billing_address_fields' + ) ); + add_filter( 'pmpro_include_payment_information_fields', array( + 'PMProGateway_stripe', + 'pmpro_include_payment_information_fields' + ) ); + + //make sure we clean up subs we will be cancelling after checkout before processing + add_action( 'pmpro_checkout_before_processing', array( + 'PMProGateway_stripe', + 'pmpro_checkout_before_processing' + ) ); + } else { + // Checkout flow for Stripe Checkout. + add_filter('pmpro_include_billing_address_fields', '__return_false'); + add_filter('pmpro_include_payment_information_fields', '__return_false'); + add_filter('pmpro_required_billing_fields', array('PMProGateway_stripe', 'pmpro_required_billing_fields')); + add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); + add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); + } } add_action( 'pmpro_payment_option_fields', array( 'PMProGateway_stripe', 'pmpro_set_up_apple_pay' ), 10, 2 ); @@ -187,192 +190,6 @@ public static function init() { add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) ); } - /** - * Swap in our submit buttons. - * - * @param bool $show - * - * @return bool - * - * @since 1.8 - */ - static function pmpro_checkout_default_submit_button($show) - { - global $gateway, $pmpro_requirebilling; - - //show our submit buttons - ?> - style="display: none;"> - - - - - style="display: none;"> - - - - user_id = $user_id; - $morder->status = 'token'; - $morder->saveOrder(); - - // Save some checkout information in the order so that we can access it when the payment is complete. - // Save the request variables. - $request_vars = $_REQUEST; - unset( $request_vars['password'] ); - unset( $request_vars['password2'] ); - unset( $request_vars['password2_copy'] ); - update_pmpro_membership_order_meta( $morder->id, 'checkout_request_vars', $request_vars ); - - // Save the checkout level. - $pmpro_level_arr = (array) $pmpro_level; - update_pmpro_membership_order_meta( $morder->id, 'checkout_level', $pmpro_level_arr ); - - // Save the discount code. - $pmpro_discount_code_arr = (array) $discount_code; - update_pmpro_membership_order_meta( $morder->id, 'checkout_discount_code', $pmpro_discount_code_arr ); - - // Time to send the user to pay with Stripe! - $stripe = new PMProGateway_stripe(); - - // Let's first get the customer to charge. - $customer = $stripe->update_customer_at_checkout( $morder ); - if ( empty( $customer ) ) { - // There was an issue creating/updating the Stripe customer. - // $order will have an error message, so we don't need to add one. - d($customer); - d($morder); - wp_die(); - return false; - } - - // Next, let's get the product being purchased. - $product_id = $stripe->get_product_id_for_level( $morder->membership_id ); - - // Then, we need to build the line items array to charge. - $line_items = array(); - - // First, let's handle the initial payment. - if ( ! empty( $morder->InitialPayment ) ) { - $initial_payment_price = $stripe->get_price_for_product( $product_id, $morder->InitialPayment ); - $line_items[] = array( - 'price' => $initial_payment_price->id, - 'quantity' => 1, - ); - } - - // Now, let's handle the recurring payments. - if ( pmpro_isLevelRecurring( $morder->membership_level ) ) { - $subtotal = $morder->PaymentAmount; - $tax = $morder->getTaxForPrice( $subtotal ); - $recurring_payment_amount = pmpro_round_price( (float) $subtotal + (float) $tax ); - $recurring_payment_price = $stripe->get_price_for_product( $product_id, $recurring_payment_amount, $morder->BillingPeriod, $morder->BillingFrequency ); - $line_items[] = array( - 'price' => $recurring_payment_price->id, - 'quantity' => 1, - ); - $subscription_data = array( - 'trial_period_days' => $stripe->calculate_trial_period_days( $morder ), - ); - } - - // Set up tax and billing address information. - // TODO: Make these variables into PMPro settings. - // TODO: Use $tax_type when getting/creating prices. - $tax_type = 'exclusive'; // Can be none, inclusive, or exclusive. - $collect_tax_id = true; // Can be true or false. Force to false if tax_type is none. - $collect_billing_address = true; // Can be true or false. Force to true if tax_type is not none. - if ( $tax_type === 'none' ) { - $automatic_tax = array( - 'enabled' => false, - ); - $tax_id_collection = array( - 'enabled' => false, - ); - $billing_address_collection = $collect_billing_address ? 'required' : 'auto'; - } else { - $automatic_tax = array( - 'enabled' => true, - ); - $tax_id_collection = array( - 'enabled' => $collect_tax_id, - ); - $billing_address_collection = 'required'; - } - - // Set up payment method types. - $payment_method_types = array( - 'card', - ); - if ( empty( $subscription_data ) ) { - if ( $pmpro_currency === 'USD' ) { - $payment_method_types = array( 'card', 'klarna' ); - } - if ( $pmpro_currency === 'EUR' ) { - $payment_method_types = array( 'card', 'bancontact', 'eps', 'giropay', 'ideal', 'p24', 'sepa_debit', 'sofort'); - } - } - - // And let's send 'em to Stripe! - $checkout_session_params = array( - 'customer' => $customer->id, - 'payment_method_types' => $payment_method_types, - 'line_items' => $line_items, - 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', - 'automatic_tax' => $automatic_tax, - 'tax_id_collection' => $tax_id_collection, - 'billing_address_collection' => $billing_address_collection, - 'customer_update' => array( - 'address' => 'auto', - 'name' => 'auto' - ), - 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ), - 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ), - //'payment_intent_data' => array( - // 'application_fee_amount' => 10000 // Get paid for orders. - //), - //'subscription_data' => array( - // 'application_fee_percent' => 2 // Get paid for subscriptions. - //), - ); - if ( ! empty( $subscription_data ) ) { - $checkout_session_params['subscription_data'] = $subscription_data; - } - try { - $checkout_session = Stripe_Checkout_Session::create( $checkout_session_params ); - // Save so that we can confirm the payment later. - update_pmpro_membership_order_meta( $morder->id, 'stripe_checkout_session_id', $checkout_session->id ); - wp_redirect( $checkout_session->url ); - exit; - } catch ( Exception $e ) { - d($e); - d($checkout_session_params); - wp_die(); - return null; - } - } - /** * Clear any saved (preserved) subscription IDs that should have been processed and are now timed out. */ @@ -816,20 +633,53 @@ public static function pmpro_checkout_after_preheader( $order ) { * Don't require address fields if they are set to hide. */ public static function pmpro_required_billing_fields( $fields ) { - unset($fields['bfirstname']); - unset($fields['blastname']); - unset($fields['baddress1']); - unset($fields['bcity']); - unset($fields['bstate']); - unset($fields['bzipcode']); - unset($fields['bphone']); - unset($fields['bemail']); - unset($fields['bcountry']); - unset($fields['CardType']); - unset($fields['AccountNumber']); - unset($fields['ExpirationMonth']); - unset($fields['ExpirationYear']); - unset($fields['CVV']); + if ( ! self::stripe_checkout_enabled() ) { + global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail; + + //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required. + unset( $fields['CVV'] ); + + //if using stripe lite, remove some fields from the required array + if ( $pmpro_stripe_lite ) { + //some fields to remove + $remove = array( + 'bfirstname', + 'blastname', + 'baddress1', + 'bcity', + 'bstate', + 'bzipcode', + 'bphone', + 'bcountry', + 'CardType' + ); + //if a user is logged in, don't require bemail either + if ( ! empty( $current_user->user_email ) ) { + $remove[] = 'bemail'; + $bemail = $current_user->user_email; + $bconfirmemail = $bemail; + } + //remove the fields + foreach ( $remove as $field ) { + unset( $fields[ $field ] ); + } + } + } else { + unset($fields['bfirstname']); + unset($fields['blastname']); + unset($fields['baddress1']); + unset($fields['bcity']); + unset($fields['bstate']); + unset($fields['bzipcode']); + unset($fields['bphone']); + unset($fields['bemail']); + unset($fields['bcountry']); + unset($fields['CardType']); + unset($fields['AccountNumber']); + unset($fields['ExpirationMonth']); + unset($fields['ExpirationYear']); + unset($fields['CVV']); + } return $fields; } @@ -1544,6 +1394,220 @@ public static function dependencies() { return true; } + /** + * Check if the user has opted into the Stripe Checkout beta. + * + * @return bool + */ + public static function stripe_checkout_beta_enabled() { + return ( defined( 'PMPRO_STRIPE_CHECKOUT_BETA_ENABLED' ) && PMPRO_STRIPE_CHECKOUT_BETA_ENABLED ); + } + + /** + * Check if Stripe Checkout is enabled. + * + * @return bool + */ + public static function stripe_checkout_enabled() { + // While Stripe Checkout is in beta, only enable it if the constant is set. + if ( ! self::stripe_checkout_beta_enabled() ) { + return false; + } + + // Check if Stripe Checkout is enabled. + if ( ! pmpro_getOption( 'stripe_checkout_enabled' ) ) { + return false; + } + + return true; + } + + /** + * Swap in our submit buttons. + * + * @param bool $show + * + * @return bool + * + * @since 1.8 + */ + static function pmpro_checkout_default_submit_button($show) + { + global $gateway, $pmpro_requirebilling; + + //show our submit buttons + ?> + style="display: none;"> + + + + + style="display: none;"> + + + + user_id = $user_id; + $morder->status = 'token'; + $morder->saveOrder(); + + // Save some checkout information in the order so that we can access it when the payment is complete. + // Save the request variables. + $request_vars = $_REQUEST; + unset( $request_vars['password'] ); + unset( $request_vars['password2'] ); + unset( $request_vars['password2_copy'] ); + update_pmpro_membership_order_meta( $morder->id, 'checkout_request_vars', $request_vars ); + + // Save the checkout level. + $pmpro_level_arr = (array) $pmpro_level; + update_pmpro_membership_order_meta( $morder->id, 'checkout_level', $pmpro_level_arr ); + + // Save the discount code. + $pmpro_discount_code_arr = (array) $discount_code; + update_pmpro_membership_order_meta( $morder->id, 'checkout_discount_code', $pmpro_discount_code_arr ); + + // Time to send the user to pay with Stripe! + $stripe = new PMProGateway_stripe(); + + // Let's first get the customer to charge. + $customer = $stripe->update_customer_at_checkout( $morder ); + if ( empty( $customer ) ) { + // There was an issue creating/updating the Stripe customer. + // $order will have an error message, so we don't need to add one. + d($customer); + d($morder); + wp_die(); + return false; + } + + // Next, let's get the product being purchased. + $product_id = $stripe->get_product_id_for_level( $morder->membership_id ); + + // Then, we need to build the line items array to charge. + $line_items = array(); + + // First, let's handle the initial payment. + if ( ! empty( $morder->InitialPayment ) ) { + $initial_payment_price = $stripe->get_price_for_product( $product_id, $morder->InitialPayment ); + $line_items[] = array( + 'price' => $initial_payment_price->id, + 'quantity' => 1, + ); + } + + // Now, let's handle the recurring payments. + if ( pmpro_isLevelRecurring( $morder->membership_level ) ) { + $subtotal = $morder->PaymentAmount; + $tax = $morder->getTaxForPrice( $subtotal ); + $recurring_payment_amount = pmpro_round_price( (float) $subtotal + (float) $tax ); + $recurring_payment_price = $stripe->get_price_for_product( $product_id, $recurring_payment_amount, $morder->BillingPeriod, $morder->BillingFrequency ); + $line_items[] = array( + 'price' => $recurring_payment_price->id, + 'quantity' => 1, + ); + $subscription_data = array( + 'trial_period_days' => $stripe->calculate_trial_period_days( $morder ), + ); + } + + // Set up tax and billing address information. + // TODO: Make these variables into PMPro settings. + // TODO: Use $tax_type when getting/creating prices. + $tax_type = 'exclusive'; // Can be none, inclusive, or exclusive. + $collect_tax_id = true; // Can be true or false. Force to false if tax_type is none. + $collect_billing_address = true; // Can be true or false. Force to true if tax_type is not none. + if ( $tax_type === 'none' ) { + $automatic_tax = array( + 'enabled' => false, + ); + $tax_id_collection = array( + 'enabled' => false, + ); + $billing_address_collection = $collect_billing_address ? 'required' : 'auto'; + } else { + $automatic_tax = array( + 'enabled' => true, + ); + $tax_id_collection = array( + 'enabled' => $collect_tax_id, + ); + $billing_address_collection = 'required'; + } + + // Set up payment method types. + $payment_method_types = array( + 'card', + ); + if ( empty( $subscription_data ) ) { + if ( $pmpro_currency === 'USD' ) { + $payment_method_types = array( 'card', 'klarna' ); + } + if ( $pmpro_currency === 'EUR' ) { + $payment_method_types = array( 'card', 'bancontact', 'eps', 'giropay', 'ideal', 'p24', 'sepa_debit', 'sofort'); + } + } + + // And let's send 'em to Stripe! + $checkout_session_params = array( + 'customer' => $customer->id, + 'payment_method_types' => $payment_method_types, + 'line_items' => $line_items, + 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', + 'automatic_tax' => $automatic_tax, + 'tax_id_collection' => $tax_id_collection, + 'billing_address_collection' => $billing_address_collection, + 'customer_update' => array( + 'address' => 'auto', + 'name' => 'auto' + ), + 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ), + 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ), + //'payment_intent_data' => array( + // 'application_fee_amount' => 10000 // Get paid for orders. + //), + //'subscription_data' => array( + // 'application_fee_percent' => 2 // Get paid for subscriptions. + //), + ); + if ( ! empty( $subscription_data ) ) { + $checkout_session_params['subscription_data'] = $subscription_data; + } + try { + $checkout_session = Stripe_Checkout_Session::create( $checkout_session_params ); + // Save so that we can confirm the payment later. + update_pmpro_membership_order_meta( $morder->id, 'stripe_checkout_session_id', $checkout_session->id ); + wp_redirect( $checkout_session->url ); + exit; + } catch ( Exception $e ) { + d($e); + d($checkout_session_params); + wp_die(); + return null; + } + } + /**************************************** ************ PUBLIC METHODS ************ ****************************************/ @@ -1553,7 +1617,11 @@ public static function dependencies() { * @since 1.4 */ public function process( &$order ) { - return true; + if ( self::stripe_checkout_enabled() ) { + // If using Stripe Checkout, we will try to collect the payment later. + return true; + } + $payment_transaction_id = ''; $subscription_transaction_id = ''; From 9a78647c84f08748f80bacf611ec828ec95701e7 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Mon, 10 Jan 2022 16:25:15 -0500 Subject: [PATCH 005/145] Implemented most Stripe Checkout settings --- .../gateways/class.pmprogateway_stripe.php | 149 ++++++++++++++---- 1 file changed, 116 insertions(+), 33 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index f8a576a1a..c01416308 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -143,7 +143,7 @@ public static function init() { // $_REQUEST['review'] here means the PayPal Express review pag if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) { - if ( ! self::stripe_checkout_enabled() ) { + if ( ! self::using_stripe_checkout() ) { // On-site checkout flow. add_action( 'pmpro_after_checkout_preheader', array( 'PMProGateway_stripe', @@ -258,6 +258,14 @@ public static function getGatewayOptions() { 'stripe_payment_request_button', ); + if ( self::stripe_checkout_beta_enabled() ) { + $options[] = 'stripe_payment_flow'; // 'onsite' or 'checkout' + $options[] = 'stripe_checkout_billing_address'; + $options[] = 'stripe_tax'; // 'none', 'inclusive', 'exclusive' + $options[] = 'stripe_vat'; // true, false + $options[] = 'enabled_payment_methods'; // array of enabled payment methods. + } + return $options; } @@ -484,7 +492,66 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { echo ' style="display: none;"'; } echo '> 

' . sprintf( wp_kses( __( 'Optional: Offer PayPal Express as an option at checkout using the Add PayPal Express Add On.', 'paid-memberships-pro' ), $allowed_appe_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-add-paypal-express-option-checkout/?utm_source=plugin&utm_medium=pmpro-paymentsettings&utm_campaign=add-ons&utm_content=pmpro-add-paypal-express-option-checkout' ) . '

'; - } ?> + } + if ( ! self::stripe_checkout_beta_enabled() ) { + // Don't show Stripe Checkout settings if the beta is not enabled. + return; + } + ?> + style="display: none;"> + +
+

+ + + style="display: none;"> + + + + + + + + style="display: none;"> + + + + + +

+ + + style="display: none;"> + + + + + + +

+ + style="display: none;"> + + + + + +

+ + true, + ) : array( + 'enabled' => false, + ); + $tax_id_collection = ! empty( pmpro_getOption( 'stripe_vat' ) ) ? array( + 'enabled' => true, + ) : array( + 'enabled' => false, + ); + $billing_address_collection = ! empty( pmpro_getOption( 'stripe_checkout_billing_address' ) ) ? 'required' : 'auto'; // Set up payment method types. $payment_method_types = array( @@ -1617,7 +1690,7 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) * @since 1.4 */ public function process( &$order ) { - if ( self::stripe_checkout_enabled() ) { + if ( self::using_stripe_checkout() ) { // If using Stripe Checkout, we will try to collect the payment later. return true; } @@ -2551,6 +2624,12 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu $unit_amount = intval( $amount * 100 ); // TODO: Change this based on currency. $cycle_period = strtolower( $cycle_period ); + // Only for use with Stripe Checkout. + $tax_behavior = pmpro_getOption( 'stripe_tax' ); + if ( ! self::using_stripe_checkout() || empty( $tax_behavior ) ) { + $tax_behavior = 'no'; + } + $price_search_args = array( 'product' => $product_id, 'type' => $is_recurring ? 'recurring' : 'one_time', @@ -2562,23 +2641,6 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu try { $prices = Stripe_Price::all( $price_search_args ); - - foreach ( $prices as $price ) { - // Check whether price is the same. If not, continue. - if ( intval( $price->unit_amount ) !== intval( $unit_amount ) ) { - continue; - } - // Check if recurring structure is the same. If not, continue. - if ( $is_recurring && ( empty( $price->recurring->interval_count ) || intval( $price->recurring->interval_count ) !== intval( $cycle_number ) ) ) { - continue; - } - // Check if tax is set up correctly. If not, continue. - // TODO: Update this to pull from PMPro settings. - if ( $price->tax_behavior !== 'exclusive' ) { - continue; - } - return $price; - } } catch (\Throwable $th) { // There was an error listing prices. return; @@ -2586,13 +2648,28 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu // There was an error listing prices. return; } + foreach ( $prices as $price ) { + // Check whether price is the same. If not, continue. + if ( intval( $price->unit_amount ) !== intval( $unit_amount ) ) { + continue; + } + // Check if recurring structure is the same. If not, continue. + if ( $is_recurring && ( empty( $price->recurring->interval_count ) || intval( $price->recurring->interval_count ) !== intval( $cycle_number ) ) ) { + continue; + } + // Check if tax is enabled and set up correctly. If not, continue. + if ( 'no' !== $tax_behavior && $price->tax_behavior !== $tax_behavior ) { + continue; + } + return $price; + } + d('hit'); // Create a new Price. $price_args = array( 'product' => $product_id, 'currency' => strtolower( $pmpro_currency ), 'unit_amount' => $unit_amount, - 'tax_behavior' => 'exclusive', ); if ( $is_recurring ) { $price_args['recurring'] = array( @@ -2600,6 +2677,10 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu 'interval_count' => $cycle_number ); } + if ( 'no' !== $tax_behavior ) { + $price_args['tax_behavior'] = $tax_behavior; + } + d($tax_behavior); try { $price = Stripe_Price::create( $price_args ); @@ -2607,8 +2688,10 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu return $price; } } catch (\Throwable $th) { + d($th); // Could not create product. } catch (\Exception $e) { + d($e); // Could not create product. } } From d7fb6fed2fd5dad5a3ae3e5c327c0cc46de16e36 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Tue, 11 Jan 2022 11:34:23 -0500 Subject: [PATCH 006/145] Tweaked some Stripe Checkout settings --- classes/gateways/class.pmprogateway_stripe.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index c01416308..640cbb570 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -260,9 +260,9 @@ public static function getGatewayOptions() { if ( self::stripe_checkout_beta_enabled() ) { $options[] = 'stripe_payment_flow'; // 'onsite' or 'checkout' - $options[] = 'stripe_checkout_billing_address'; + $options[] = 'stripe_checkout_billing_address'; //'auto' or 'required' $options[] = 'stripe_tax'; // 'none', 'inclusive', 'exclusive' - $options[] = 'stripe_vat'; // true, false + $options[] = 'stripe_tax_id_collection_enabled'; // true, false $options[] = 'enabled_payment_methods'; // array of enabled payment methods. } @@ -521,8 +521,8 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

@@ -542,12 +542,12 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { style="display: none;"> - + - - +

@@ -1622,12 +1622,12 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) ) : array( 'enabled' => false, ); - $tax_id_collection = ! empty( pmpro_getOption( 'stripe_vat' ) ) ? array( + $tax_id_collection = ! empty( pmpro_getOption( 'stripe_tax_id_collection_enabled' ) ) ? array( 'enabled' => true, ) : array( 'enabled' => false, ); - $billing_address_collection = ! empty( pmpro_getOption( 'stripe_checkout_billing_address' ) ) ? 'required' : 'auto'; + $billing_address_collection = pmpro_getOption( 'stripe_checkout_billing_address' ) ?: 'auto'; // Set up payment method types. $payment_method_types = array( From a89034dbb2da6c70277a00c7d1f6f7f35fce7977 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Tue, 11 Jan 2022 15:20:17 -0500 Subject: [PATCH 007/145] Better error handling when sending user to Stripe Checkout --- .../gateways/class.pmprogateway_stripe.php | 65 ++++++++++++------- preheaders/checkout.php | 11 +++- 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 640cbb570..8ae7f3e50 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -522,7 +522,7 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

@@ -542,7 +542,7 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { style="display: none;"> - + checked="checked" /> + + + array( + 'name' => 'Afterpay Card', + 'supported_currencies' => array( 'aud', 'cad', 'nzd', 'gbp', 'usd' ), + 'recurring' => false, + ), + */ + 'alipay' => array( + 'name' => 'Alipay', + // 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'myr', 'nzd', 'sgd', 'usd' ), // Documentaion says that all these should work, but throws error at checkout. + 'supported_currencies' => array( 'cny', 'usd' ), + // 'recurring' => true, // Documentation says this is true, but throws error at checkout. + 'recurring' => false, + ), + 'bacs_debit' => array( + 'name' => 'BACS Direct Debit', + 'supported_currencies' => array( 'gbp' ), + 'recurring' => true, + ), + 'bancontact' => array( + 'name' => 'Bancontact', + 'supported_currencies' => array( 'eur' ), + 'recurring' => false, + ), + /* Documentation says that this is a valid payment gateway, but throws error at checkout. + 'au_becs_debit' => array( + 'name' => 'BECS Direct Debit', + 'supported_currencies' => array( 'aud' ), + 'recurring' => false, + ), + */ + 'boleto' => array( + 'name' => 'Boleto', + 'supported_currencies' => array( 'brl' ), + 'recurring' => false, + ), + 'eps' => array( + 'name' => 'EPS', + 'supported_currencies' => array( 'eur' ), + 'recurring' => false, + ), + 'fpx' => array( + 'name' => 'FPX', + 'supported_currencies' => array( 'myr' ), + 'recurring' => false, + ), + 'giropay' => array( + 'name' => 'GiroPay', + 'supported_currencies' => array( 'eur' ), + 'recurring' => false, + ), + 'grabpay' => array( + 'name' => 'GrabPay', + 'supported_currencies' => array( 'myr', 'sgd' ), + 'recurring' => false, + ), + 'ideal' => array( + 'name' => 'iDEAL', + 'supported_currencies' => array( 'eur' ), + 'recurring' => false, + ), + 'klarna' => array( + 'name' => 'Klarna', + // 'supported_currencies' => array( 'dkk', 'eur', 'gbp', 'nok', 'sek', 'usd' ), // Documentaion says that all these should work, but throws error at checkout. + 'supported_currencies' => array( 'usd' ), + 'recurring' => false, + ), + 'oxxo' => array( + 'name' => 'OXXO', + 'supported_currencies' => array( 'mxn' ), + 'recurring' => false, + ), + 'p24' => array( + 'name' => 'P24', + 'supported_currencies' => array( 'eur', 'pln' ), + 'recurring' => false, + ), + /* Requires additional setup when creating Checkout Session. Put off for now. + 'acss_debit' => array( + 'name' => 'Pre-authorized debits in Canada', + 'supported_currencies' => array( 'cad', 'usd' ), + 'recurring' => true, + ), + */ + 'sepa_debit' => array( + 'name' => 'SEPA Direct Debit', + 'supported_currencies' => array( 'eur' ), + 'recurring' => true, + ), + 'sofort' => array( + 'name' => 'Sofort', + 'supported_currencies' => array( 'eur' ), + 'recurring' => false, + ), + /* Requires additional setup when creating Checkout session. Put off for now. + 'wechat_pay' => array( + 'name' => 'WeChat Pay', + 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'sgd', 'usd', 'dkk', 'nok', 'sek', 'chf' ), + 'recurring' => false, + ), + */ + ); + } + /**************************************** ************ PUBLIC METHODS ************ ****************************************/ From b6f442604c0db9335075f36af11f2dbaa923de58 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 12 Jan 2022 10:22:20 -0500 Subject: [PATCH 009/145] Improved how pending orders are handled on confirmation page --- pages/confirmation.php | 4 ++-- preheaders/confirmation.php | 28 ++++++++++++---------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/pages/confirmation.php b/pages/confirmation.php index 49459f30a..99d9f98ed 100644 --- a/pages/confirmation.php +++ b/pages/confirmation.php @@ -62,8 +62,8 @@
  • : display_name );?> (user_email );?>)
  • -
  • : membership_level->name);?>
  • - membership_level->enddate) { ?> +
  • : membership_level->name);?> status ) { echo ' (' . esc_html__( 'Pending', 'paid-memberships-pro' ) . ')'; }?>
  • + membership_level->enddate ) && 'pending' !== $pmpro_invoice->status ) { ?>
  • : membership_level->enddate)?>
  • getDiscountCode()) { ?> diff --git a/preheaders/confirmation.php b/preheaders/confirmation.php index 50006b42c..ffca6dff6 100644 --- a/preheaders/confirmation.php +++ b/preheaders/confirmation.php @@ -18,21 +18,17 @@ $current_user->membership_level = pmpro_getMembershipLevelForUser($current_user->ID); } -/* - Use the filter to add your gateway here if you want to show them a message on the confirmation page while their checkout is pending. - For example, when PayPal Standard is used, we need to wait for PayPal to send a message through IPN that the payment was accepted. - In the meantime, the order is in pending status and the confirmation page shows a message RE waiting. -*/ -$gateways_with_pending_status = apply_filters('pmpro_gateways_with_pending_status', array('paypalstandard', 'twocheckout', 'gourl')); -if ( ! pmpro_hasMembershipLevel() && ! in_array( pmpro_getGateway(), $gateways_with_pending_status ) ) { - // Logged in, but doesn't have a level - $redirect_url = pmpro_url( 'account' ); - wp_redirect( $redirect_url ); - exit; -} +// Get the most recent invoice for the current user. +$pmpro_invoice = new MemberOrder(); +$pmpro_invoice->getLastMemberOrder( $current_user->ID, apply_filters( "pmpro_confirmation_order_status", array( "success", "pending" ) ) ); -// If membership is a paying one, get invoice from DB -if ( ! empty( $current_user->membership_level ) && ! pmpro_isLevelFree( $current_user->membership_level ) ) { - $pmpro_invoice = new MemberOrder(); - $pmpro_invoice->getLastMemberOrder( $current_user->ID, apply_filters( "pmpro_confirmation_order_status", array( "success", "pending" ) ) ); +if ( 'pending' !== $pmpro_invoice->status && empty( $current_user->membership_level ) ) { + // The user does not have a membership level (including pending checkouts). + // Redirect them to the account page. + $redirect_url = pmpro_url( 'account' ); + wp_redirect( $redirect_url ); + exit; +} elseif ( ! empty( $current_user->membership_level ) && pmpro_isLevelFree( $current_user->membership_level ) ) { + // User checked out for a free level. We are not going to show the invoice on the confirmation page. + $pmpro_invoice = null; } From f6377b826845b888580adb7dc9a5b6b502a02a39 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 12 Jan 2022 13:54:14 -0500 Subject: [PATCH 010/145] Sending application fee to Stripe Checkout --- .../gateways/class.pmprogateway_stripe.php | 55 ++++++++----------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 496ff94ea..c8b56880e 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1605,6 +1605,9 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) // Then, we need to build the line items array to charge. $line_items = array(); + // Used to calculate Stripe Connect fees. + $application_fee_percentage = self::get_application_fee_percentage(); + // First, let's handle the initial payment. if ( ! empty( $morder->InitialPayment ) ) { $initial_payment_price = $stripe->get_price_for_product( $product_id, $morder->InitialPayment ); @@ -1617,6 +1620,15 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) 'price' => $initial_payment_price->id, 'quantity' => 1, ); + if ( ! empty( $application_fee_percentage ) ) { + // We are multiplying initial payment by 100 to get the amount in cents. May need to tweak based on currency. + $application_fee = floor( $initial_payment_price->amount * 100 * $application_fee_percentage / 100 ); + if ( ! empty( $application_fee ) ) { + $payment_intent_data = array( + 'application_fee_amount' => floor( $initial_payment_price->amount * 100 * $application_fee_percentage / 100 ), + ); + } + } } // Now, let's handle the recurring payments. @@ -1637,34 +1649,14 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) $subscription_data = array( 'trial_period_days' => $stripe->calculate_trial_period_days( $morder ), ); + // Add application fee for Stripe Connect. + $application_fee_percentage = self::get_application_fee_percentage(); + if ( ! empty( $application_fee_percentage ) ) { + $subscription_data['application_fee_percent'] = $application_fee_percentage; + } } - // Set up tax and billing address information. - /* - // TODO: Make these variables into PMPro settings. - // TODO: Use $tax_type when getting/creating prices. - $tax_type = 'exclusive'; // Can be none, inclusive, or exclusive. - $collect_tax_id = true; // Can be true or false. Force to false if tax_type is none. - $collect_billing_address = true; // Can be true or false. Force to true if tax_type is not none. - if ( $tax_type === 'none' ) { - $automatic_tax = array( - 'enabled' => false, - ); - $tax_id_collection = array( - 'enabled' => false, - ); - $billing_address_collection = $collect_billing_address ? 'required' : 'auto'; - } else { - $automatic_tax = array( - 'enabled' => true, - ); - $tax_id_collection = array( - 'enabled' => $collect_tax_id, - ); - $billing_address_collection = 'required'; - } - */ - + // Set up tax and billing addres collection. $automatic_tax = ( ! empty( pmpro_getOption( 'stripe_tax' ) ) && 'no' !== pmpro_getOption( 'stripe_tax' ) ) ? array( 'enabled' => true, ) : array( @@ -1710,16 +1702,14 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) ), 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ), 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ), - //'payment_intent_data' => array( - // 'application_fee_amount' => 10000 // Get paid for orders. - //), - //'subscription_data' => array( - // 'application_fee_percent' => 2 // Get paid for subscriptions. - //), ); + if ( ! empty( $payment_intent_data ) ) { + $checkout_session_params['payment_intent_data'] = $payment_intent_data; + } if ( ! empty( $subscription_data ) ) { $checkout_session_params['subscription_data'] = $subscription_data; } + try { $checkout_session = Stripe_Checkout_Session::create( $checkout_session_params ); } catch ( Throwable $th ) { @@ -4017,7 +4007,6 @@ public static function get_application_fee_percentage() { * @deprecated TBD. Only deprecated for public use, will be changed to private non-static in a future version. * * @param array $params to be sent to Stripe. - * @param bool $add_percent true if percentage should be added, false if actual amount. * @return array params with application fee if applicable. */ public static function add_application_fee_amount( $params ) { From f7e83d57fdc10b521a860571e918a33907aa1e2b Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 13 Jan 2022 12:54:35 -0500 Subject: [PATCH 011/145] Fixed some application fee logic when sending users to Checkout --- classes/gateways/class.pmprogateway_stripe.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index c8b56880e..9a2a3f395 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1621,11 +1621,10 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) 'quantity' => 1, ); if ( ! empty( $application_fee_percentage ) ) { - // We are multiplying initial payment by 100 to get the amount in cents. May need to tweak based on currency. - $application_fee = floor( $initial_payment_price->amount * 100 * $application_fee_percentage / 100 ); + $application_fee = floor( $initial_payment_price->unit_amount * $application_fee_percentage / 100 ); if ( ! empty( $application_fee ) ) { $payment_intent_data = array( - 'application_fee_amount' => floor( $initial_payment_price->amount * 100 * $application_fee_percentage / 100 ), + 'application_fee_amount' => $application_fee, ); } } @@ -1703,11 +1702,10 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) 'success_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("confirmation" ) ), 'cancel_url' => add_query_arg( 'level', $morder->membership_level->id, pmpro_url("checkout" ) ), ); - if ( ! empty( $payment_intent_data ) ) { - $checkout_session_params['payment_intent_data'] = $payment_intent_data; - } if ( ! empty( $subscription_data ) ) { $checkout_session_params['subscription_data'] = $subscription_data; + } elseif ( ! empty( $payment_intent_data ) ) { + $checkout_session_params['payment_intent_data'] = $payment_intent_data; } try { From c0f6d091161fe9a2e7f7d5a054f7deb9fb63b6c8 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 13 Jan 2022 13:36:48 -0500 Subject: [PATCH 012/145] Enabled some more Stripe Checkout payment methods --- .../gateways/class.pmprogateway_stripe.php | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 9a2a3f395..35334b95f 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -575,7 +575,7 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { ?>checked="checked" /> $customer->id, 'payment_method_types' => $payment_method_types, + 'payment_method_options' => array( // All of this can be filtered to customize. + 'acss_debit' => array( + 'mandate_options' => array( + 'payment_schedule' => 'sporadic', + 'transaction_type' => 'personal', + ), + ), + 'wechat_pay' => array( + 'client' => 'web', + ), + ), 'line_items' => $line_items, 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', 'automatic_tax' => $automatic_tax, @@ -1806,13 +1817,12 @@ public static function get_all_checkout_payment_methods() { 'supported_currencies' => array( 'eur', 'pln' ), 'recurring' => false, ), - /* Requires additional setup when creating Checkout Session. Put off for now. 'acss_debit' => array( 'name' => 'Pre-authorized debits in Canada', 'supported_currencies' => array( 'cad', 'usd' ), - 'recurring' => true, + // 'recurring' => true, // Documentation says this is true, but throws error at checkout. + 'recurring' => false, ), - */ 'sepa_debit' => array( 'name' => 'SEPA Direct Debit', 'supported_currencies' => array( 'eur' ), @@ -1823,13 +1833,12 @@ public static function get_all_checkout_payment_methods() { 'supported_currencies' => array( 'eur' ), 'recurring' => false, ), - /* Requires additional setup when creating Checkout session. Put off for now. 'wechat_pay' => array( 'name' => 'WeChat Pay', - 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'sgd', 'usd', 'dkk', 'nok', 'sek', 'chf' ), + // 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'sgd', 'usd', 'dkk', 'nok', 'sek', 'chf' ), + 'supported_currencies' => array( 'cny', 'usd' ), 'recurring' => false, ), - */ ); } From 805a96bf1aad850e1811fa4af3a7317ed5a60098 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 13 Jan 2022 15:31:15 -0500 Subject: [PATCH 013/145] Added polling functionality to confirmation page for pending orders --- includes/rest-api.php | 61 +++++++++++++++++++++++++++++++++++++ js/pmpro-confirmation.js | 25 +++++++++++++++ preheaders/confirmation.php | 18 +++++++++++ 3 files changed, 104 insertions(+) create mode 100644 js/pmpro-confirmation.js diff --git a/includes/rest-api.php b/includes/rest-api.php index a637df6ef..f8464d458 100644 --- a/includes/rest-api.php +++ b/includes/rest-api.php @@ -147,6 +147,21 @@ public function pmpro_rest_api_register_routes() { ), )); + /** + * Retrieve an order. + * @since TBD + * Example: https://example.com/wp-json/pmpro/v1/order + */ + register_rest_route( $pmpro_namespace, '/order', + array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'pmpro_rest_api_get_order' ), + 'permission_callback' => array( $this, 'pmpro_rest_api_get_permissions_check' ) + ), + )); + add_filter( 'pmpro_rest_api_permissions', array( $this, 'pmpro_rest_api_permissions_get_order' ), 10, 2 ); + /** * Get membership level after checkout options are applied. * @since 2.4 @@ -623,6 +638,51 @@ function pmpro_rest_api_set_discount_code( $request ) { return new WP_REST_Response( $discount_code, 200 ); } + /** + * Get an order. + * @since TBD + * Example: https://example.com/wp-json/pmpro/v1/order + */ + function pmpro_rest_api_get_order( $request ) { + if ( ! class_exists( 'MemberOrder' ) ) { + return new WP_REST_Response( 'Paid Memberships Pro order class not found.', 404 ); + } + + $params = $request->get_params(); + $code = isset( $params['code'] ) ? sanitize_text_field( $params['code'] ) : null; + + if ( empty( $code ) ) { + return new WP_REST_Response( 'No order code sent.', 400 ); + } + + return new WP_REST_Response( new MemberOrder( $code ), 200 ); + } + + /** + * Make sure that users can GET their own orders. + * @since TBD + */ + function pmpro_rest_api_permissions_get_order( $permission, $request ) { + $method = $request->get_method(); + $route = $request->get_route(); + + // Check if the user does not have access but is trying to get an order. + if ( ! $permission && 'GET' === $method && '/pmpro/v1/order' === $route ) { + // Check if the order belongs to the user. + $params = $request->get_params(); + $code = isset( $params['code'] ) ? sanitize_text_field( $params['code'] ) : null; + + if ( ! empty( $code ) ) { + $order = new MemberOrder( $code ); + + if ( $order->user_id == get_current_user_id() ) { + return true; + } + } + } + return $permission; + } + /** * Get a membership level at checkout. * Note: Not compatible with MMPU. @@ -867,6 +927,7 @@ function pmpro_rest_api_get_permissions_check( $request ) { '/pmpro/v1/cancel_membership_level' => 'pmpro_edit_memberships', '/pmpro/v1/membership_level' => true, '/pmpro/v1/discount_code' => 'pmpro_discountcodes', + '/pmpro/v1/order' => 'pmpro_orders', '/pmpro/v1/checkout_level' => true, '/pmpro/v1/checkout_levels' => true, '/pmpro/v1/me' => true, diff --git a/js/pmpro-confirmation.js b/js/pmpro-confirmation.js new file mode 100644 index 000000000..733cc80a3 --- /dev/null +++ b/js/pmpro-confirmation.js @@ -0,0 +1,25 @@ +jQuery( document ).ready( function() { + // If this script is loaded, then we are on the confirmation page for a pending order. + // We want to poll the server to see if the order has been completed and if so, refresh so + // the user can see the user can see their completed checkout. + var pollInterval = setInterval( function() { + // Get the level price so that information can be shown in payment request popup + jQuery.noConflict().ajax({ + url: pmpro.restUrl + 'pmpro/v1/order', + beforeSend: function ( xhr ) { + xhr.setRequestHeader( 'X-WP-Nonce', pmpro.nonce ); + }, + dataType: 'json', + data: { + 'code': pmpro.code + }, + success: function( response ) { + if ( response.status == 'success' ) { + // Order is complete. + clearInterval( pollInterval ); + window.location.reload(); + } + } + } ); + }, 5000 ); // Poll every 5 seconds. +}); \ No newline at end of file diff --git a/preheaders/confirmation.php b/preheaders/confirmation.php index ffca6dff6..3e62e6756 100644 --- a/preheaders/confirmation.php +++ b/preheaders/confirmation.php @@ -31,4 +31,22 @@ } elseif ( ! empty( $current_user->membership_level ) && pmpro_isLevelFree( $current_user->membership_level ) ) { // User checked out for a free level. We are not going to show the invoice on the confirmation page. $pmpro_invoice = null; +} elseif ( 'pending' === $pmpro_invoice->status ) { + // Enqueue PMPro Confirmation script. + wp_register_script( + 'pmpro_confirmation', + plugins_url( 'js/pmpro-confirmation.js', PMPRO_BASE_FILE ), + array( 'jquery' ), + PMPRO_VERSION + ); + wp_localize_script( + 'pmpro_confirmation', + 'pmpro', + array( + 'restUrl' => get_rest_url(), + 'nonce' => wp_create_nonce( 'wp_rest' ), + 'code' => $pmpro_invoice->code, + ) + ); + wp_enqueue_script( 'pmpro_confirmation' ); } From abc9ad153bf2831552d7722a7ad31536214b25ba Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 14 Jan 2022 12:37:03 -0500 Subject: [PATCH 014/145] MMPU compatibility --- classes/gateways/class.pmprogateway_stripe.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 997e2a98e..9bebc95e0 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -178,6 +178,7 @@ public static function init() { add_filter('pmpro_required_billing_fields', array('PMProGateway_stripe', 'pmpro_required_billing_fields')); add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); + add_filter('pmprommpu_gateway_supports_multiple_level_checkout', array('PMProGateway_stripe', 'pmprommpu_gateway_supports_multiple_level_checkout'), 10, 2); } } @@ -1842,6 +1843,16 @@ public static function get_all_checkout_payment_methods() { ); } + /** + * Only allow purchasing a single level at a time if using Stripe Checkout. + */ + public static function pmprommpu_gateway_supports_multiple_level_checkout( $has_support, $gateway ) { + if ( 'stripe' === $gateway && self::using_stripe_checkout() ) { + return false; + } + return $has_support; + } + /**************************************** ************ PUBLIC METHODS ************ ****************************************/ From 21a8e264597b43fadca97ea7674a163fa8fccd3e Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 14 Jan 2022 14:48:16 -0500 Subject: [PATCH 015/145] Showing Stripe Checkout warning if user already has pending order --- .../gateways/class.pmprogateway_stripe.php | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 9bebc95e0..aa46d87bf 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1527,19 +1527,25 @@ public static function using_stripe_checkout() { */ static function pmpro_checkout_default_submit_button($show) { - global $gateway, $pmpro_requirebilling; + global $gateway; //show our submit buttons ?> - style="display: none;"> + style="display: none;"> + getLastMemberOrder( get_current_user_id(), null, null, 'stripe' ); + if ( ! empty( $last_order->id ) && $last_order->status === 'pending' ) { + ?> +

    +
    - - style="display: none;"> - - - Date: Thu, 20 Jan 2022 12:56:09 -0500 Subject: [PATCH 016/145] Enabled showing billing address onsite for Stripe Checkout --- .../gateways/class.pmprogateway_stripe.php | 106 ++++++------------ 1 file changed, 37 insertions(+), 69 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index aa46d87bf..53100a629 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -141,26 +141,27 @@ public static function init() { $current_gateway = pmpro_getGateway(); // $_REQUEST['review'] here means the PayPal Express review pag - if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) - { + if ( ( $default_gateway == "stripe" || $current_gateway == "stripe" ) && empty( $_REQUEST['review'] ) ) { + add_filter( 'pmpro_include_billing_address_fields', array( + 'PMProGateway_stripe', + 'pmpro_include_billing_address_fields' + ) ); + + + if ( ! self::using_stripe_checkout() ) { // On-site checkout flow. add_action( 'pmpro_after_checkout_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) ); - - add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) ); - add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); - add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); - add_filter( 'pmpro_include_billing_address_fields', array( - 'PMProGateway_stripe', - 'pmpro_include_billing_address_fields' - ) ); add_filter( 'pmpro_include_cardtype_field', array( 'PMProGateway_stripe', 'pmpro_include_billing_address_fields' ) ); + add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ) ); + add_filter( 'pmpro_checkout_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); + add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ) ); add_filter( 'pmpro_include_payment_information_fields', array( 'PMProGateway_stripe', 'pmpro_include_payment_information_fields' @@ -173,12 +174,10 @@ public static function init() { ) ); } else { // Checkout flow for Stripe Checkout. - add_filter('pmpro_include_billing_address_fields', '__return_false'); add_filter('pmpro_include_payment_information_fields', '__return_false'); - add_filter('pmpro_required_billing_fields', array('PMProGateway_stripe', 'pmpro_required_billing_fields')); add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); - add_filter('pmprommpu_gateway_supports_multiple_level_checkout', array('PMProGateway_stripe', 'pmprommpu_gateway_supports_multiple_level_checkout'), 10, 2); + add_filter('pmprommpu_gateway_supports_multiple_level_checkout', '__return_false', 10, 2); } } @@ -732,52 +731,31 @@ public static function pmpro_checkout_after_preheader( $order ) { * Don't require address fields if they are set to hide. */ public static function pmpro_required_billing_fields( $fields ) { - if ( ! self::using_stripe_checkout() ) { - global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail; - - //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required. - unset( $fields['CVV'] ); - - //if using stripe lite, remove some fields from the required array - if ( $pmpro_stripe_lite ) { - //some fields to remove - $remove = array( - 'bfirstname', - 'blastname', - 'baddress1', - 'bcity', - 'bstate', - 'bzipcode', - 'bphone', - 'bcountry', - 'CardType' - ); - //if a user is logged in, don't require bemail either - if ( ! empty( $current_user->user_email ) ) { - $remove[] = 'bemail'; - $bemail = $current_user->user_email; - $bconfirmemail = $bemail; - } - //remove the fields - foreach ( $remove as $field ) { - unset( $fields[ $field ] ); - } - } - } else { - unset($fields['bfirstname']); - unset($fields['blastname']); - unset($fields['baddress1']); - unset($fields['bcity']); - unset($fields['bstate']); - unset($fields['bzipcode']); - unset($fields['bphone']); - unset($fields['bemail']); - unset($fields['bcountry']); - unset($fields['CardType']); - unset($fields['AccountNumber']); - unset($fields['ExpirationMonth']); - unset($fields['ExpirationYear']); - unset($fields['CVV']); + global $pmpro_stripe_lite, $current_user, $bemail, $bconfirmemail; + + //CVV is not required if set that way at Stripe. The Stripe JS will require it if it is required. + $remove = [ 'CVV' ]; + + //if using stripe lite, remove some fields from the required array + if ( $pmpro_stripe_lite ) { + $remove = array_merge( $remove, [ 'bfirstname', 'blastname', 'baddress', 'bcity', 'bstate', 'bzipcode', 'bphone', 'bcountry', 'CardType' ] ); + } + + // If a user is logged in, don't require bemail either + if ( ! empty( $current_user->user_email ) ) { + $remove = array_merge( $remove, [ 'bemail' ] ); + $bemail = $current_user->user_email; + $bconfirmemail = $bemail; + } + + // If using Stripe Checkout, don't require card information. + if ( self::using_stripe_checkout() ) { + $remove = array_merge( $remove, [ 'CardType', 'AccountNumber', 'ExpirationMonth', 'ExpirationYear', 'CVV' ] ); + } + + // Remove the fields. + foreach ( $remove as $field ) { + unset( $fields[ $field ] ); } return $fields; @@ -1849,16 +1827,6 @@ public static function get_all_checkout_payment_methods() { ); } - /** - * Only allow purchasing a single level at a time if using Stripe Checkout. - */ - public static function pmprommpu_gateway_supports_multiple_level_checkout( $has_support, $gateway ) { - if ( 'stripe' === $gateway && self::using_stripe_checkout() ) { - return false; - } - return $has_support; - } - /**************************************** ************ PUBLIC METHODS ************ ****************************************/ From d1247b21091faad6045e796c2af54d443be712b3 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Mon, 24 Jan 2022 15:46:11 -0500 Subject: [PATCH 017/145] Stripe checkout one-time payments now store charge ID --- services/stripe-webhook.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index f8facdbd4..e282b4798 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -429,10 +429,14 @@ pmpro_stripeWebhookExit(); } - // Assign payment and subscription transaction IDs to the order. if ( $checkout_session->mode === 'payment' ) { - // User purchased a one-time payment level. Assign the payment intent ID to the order. - $order->payment_transaction_id = $checkout_session->payment_intent; + // User purchased a one-time payment level. Assign the charge ID to the order. + try { + $payment_intent = \Stripe\PaymentIntent::retrieve( $checkout_session->payment_intent ); + error_log( $payment_intent->charges->data[0]->id ); + } catch ( \Stripe\Error\Base $e ) { + // Could not get payment intent. We just won't set a payment transaction ID. + } } elseif ( $checkout_session->mode === 'subscription' ) { // User purchased a subscription. Assign the subscription ID invoice ID to the order. $order->subscription_transaction_id = $checkout_session->subscription; From 29c98753ac699f8ed13c132ad4319f1b7bbd8aac Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Mon, 24 Jan 2022 16:01:53 -0500 Subject: [PATCH 018/145] Now filling order billing address when returning from Stripe Checkout --- services/stripe-webhook.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index e282b4798..5e6c05557 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -429,6 +429,7 @@ pmpro_stripeWebhookExit(); } + // Get the payment and subscription IDs for the checkout. if ( $checkout_session->mode === 'payment' ) { // User purchased a one-time payment level. Assign the charge ID to the order. try { @@ -450,6 +451,27 @@ } } + // Get the customer's billing address. + try { + $customer = \Stripe\Customer::retrieve( $checkout_session->customer ); + if ( + ! empty( $customer->name ) && + ! empty( $customer->address->line1 ) && + ! empty( $customer->address->city ) && + ! empty( $customer->address->postal_code ) && + ! empty( $customer->address->country ) + ) { + $order->billing->name = $customer->name; + $order->billing->street = $customer->address->line1; + $order->billing->city = $customer->address->city; + $order->billing->state = $customer->address->state; + $order->billing->zip = $customer->address->postal_code; + $order->billing->country = $customer->address->country; + } + } catch ( \Stripe\Error\Base $e ) { + // Could not get customer. We just won't set billing info. + } + // Update order total, subtotal, and tax. $order->total = (float) $checkout_session->amount_total / 100; $order->subtotal = (float) $checkout_session->amount_subtotal / 100; From e6a7c7cfa0731d3535d78a8126d5edd0d6be1ee4 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Tue, 25 Jan 2022 12:36:24 -0500 Subject: [PATCH 019/145] Stripe Checkout now allows for billing updates in customer portal. --- .../gateways/class.pmprogateway_stripe.php | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 53100a629..f97364ccf 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -178,6 +178,7 @@ public static function init() { add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); add_filter('pmprommpu_gateway_supports_multiple_level_checkout', '__return_false', 10, 2); + add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_billing_preheader_stripe_customer_portal' ) ); } } @@ -1827,6 +1828,28 @@ public static function get_all_checkout_payment_methods() { ); } + public static function pmpro_billing_preheader_stripe_customer_portal() { + $user_order = new MemberOrder(); + $user_order->getLastMemberOrder( null, array( 'success', 'pending' ) ); + + // Check whether the user's most recent order is a Stripe subscription. + if ( empty( $user_order->gateway ) || 'stripe' !== $user_order->gateway ) { + return; + } + + $stripe = new PMProGateway_stripe(); + $customer = $stripe->get_customer_for_user( $user_order->user_id ); + if ( empty( $customer->id ) ) { + return; + } + + $customer_portal_url = $stripe->get_customer_portal_url( $customer->id ); + if ( ! empty( $customer_portal_url ) ) { + wp_redirect( $customer_portal_url ); + exit; + } + } + /**************************************** ************ PUBLIC METHODS ************ ****************************************/ @@ -2217,6 +2240,18 @@ public function cancel( &$order, $update_status = true ) { } } + public function get_customer_portal_url( $customer_id ) { + try { + $session = \Stripe\BillingPortal\Session::create([ + 'customer' => $customer_id, + 'return_url' => pmpro_url( 'account' ), + ]); + return $session->url; + } catch ( Exception $e ) { + return ''; + } + } + /**************************************** *********** PRIVATE METHODS ************ @@ -3217,8 +3252,6 @@ private function user_profile_fields_subscription_updates( $user, $customer ) { Date: Tue, 25 Jan 2022 13:27:55 -0500 Subject: [PATCH 020/145] Touched up payment settings UI --- .../gateways/class.pmprogateway_stripe.php | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index f97364ccf..56bebdf4c 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -505,6 +505,20 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    + style="display: none;"> + +

    + +

    + + style="display: none;"> @@ -525,7 +539,6 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { -

    style="display: none;"> @@ -555,17 +568,19 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { style="display: none;"> - + - +
    +
    checked="checked" />' . strtoupper( $pmpro_currency ) . '' , esc_html( implode( ', ', array_map( 'strtoupper', $payment_method_data['supported_currencies'] ) ) ) ); ?>
    +

    array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'myr', 'nzd', 'sgd', 'usd' ), // Documentaion says that all these should work, but throws error at checkout. 'supported_currencies' => array( 'cny', 'usd' ), // 'recurring' => true, // Documentation says this is true, but throws error at checkout. + 'instant_confirmation' => true, 'recurring' => false, ), 'bacs_debit' => array( 'name' => 'BACS Direct Debit', 'supported_currencies' => array( 'gbp' ), + 'instant_confirmation' => false, 'recurring' => true, ), 'bancontact' => array( 'name' => 'Bancontact', 'supported_currencies' => array( 'eur' ), + 'instant_confirmation' => true, 'recurring' => false, ), /* Documentation says that this is a valid payment gateway, but throws error at checkout. 'au_becs_debit' => array( 'name' => 'BECS Direct Debit', 'supported_currencies' => array( 'aud' ), + 'instant_confirmation' => false, 'recurring' => false, ), */ 'boleto' => array( 'name' => 'Boleto', 'supported_currencies' => array( 'brl' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'eps' => array( 'name' => 'EPS', 'supported_currencies' => array( 'eur' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'fpx' => array( 'name' => 'FPX', 'supported_currencies' => array( 'myr' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'giropay' => array( 'name' => 'GiroPay', 'supported_currencies' => array( 'eur' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'grabpay' => array( 'name' => 'GrabPay', 'supported_currencies' => array( 'myr', 'sgd' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'ideal' => array( 'name' => 'iDEAL', 'supported_currencies' => array( 'eur' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'klarna' => array( 'name' => 'Klarna', // 'supported_currencies' => array( 'dkk', 'eur', 'gbp', 'nok', 'sek', 'usd' ), // Documentaion says that all these should work, but throws error at checkout. 'supported_currencies' => array( 'usd' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'oxxo' => array( 'name' => 'OXXO', 'supported_currencies' => array( 'mxn' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'p24' => array( 'name' => 'P24', 'supported_currencies' => array( 'eur', 'pln' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'acss_debit' => array( 'name' => 'Pre-authorized debits in Canada', 'supported_currencies' => array( 'cad', 'usd' ), + 'instant_confirmation' => false, // 'recurring' => true, // Documentation says this is true, but throws error at checkout. 'recurring' => false, ), 'sepa_debit' => array( 'name' => 'SEPA Direct Debit', 'supported_currencies' => array( 'eur' ), + 'instant_confirmation' => false, 'recurring' => true, ), 'sofort' => array( 'name' => 'Sofort', 'supported_currencies' => array( 'eur' ), + 'instant_confirmation' => true, 'recurring' => false, ), 'wechat_pay' => array( 'name' => 'WeChat Pay', // 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'sgd', 'usd', 'dkk', 'nok', 'sek', 'chf' ), 'supported_currencies' => array( 'cny', 'usd' ), + 'instant_confirmation' => true, 'recurring' => false, ), ); From dfaffe509e224c5527afdbfd5978be797ea8e9a6 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 26 Jan 2022 10:21:11 -0500 Subject: [PATCH 021/145] Added "Card" as a payment method for Stripe Checkout --- .../gateways/class.pmprogateway_stripe.php | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 11289313d..038267667 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -588,12 +588,27 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { $enabled_payment_methods = explode( ',', $values['stripe_enabled_payment_methods'] ); } foreach ( $payment_methods as $payment_method => $payment_method_data ) { + // Build the table data. + $checkbox_disabled_attr = empty( $payment_method_data['always_enabled'] ) ? '' : ' disabled '; + $checkbox_checked_attr = in_array( $payment_method, $enabled_payment_methods ) || ! empty( $payment_method_data['always_enabled'] ) ? ' checked ' : ''; + $payment_method_name = $payment_method_data['name']; + $payment_method_currencies = 'All'; + if ( ! empty( $payment_method_data['supported_currencies'] ) ) { + // List all supported currencies. + $payment_method_currencies = implode( ', ', $payment_method_data['supported_currencies'] ); + // Ensure upper-case currency codes. + $payment_method_currencies = strtoupper( $payment_method_currencies ); + // Bold the current currency. + $payment_method_currencies = str_replace( strtoupper( $pmpro_currency ), '' . strtoupper( $pmpro_currency ) . '', $payment_method_currencies ); + } + $payment_method_instant_confirmation = $payment_method_data['instant_confirmation'] ? "✓" : ''; + $payment_method_supports_recurring = $payment_method_data['recurring'] ? "✓" : ''; ?>checked="checked" />' . strtoupper( $pmpro_currency ) . '' , esc_html( implode( ', ', array_map( 'strtoupper', $payment_method_data['supported_currencies'] ) ) ) ); ?> /> @@ -1682,12 +1697,11 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) } foreach( $enabled_payment_methods as $enabled_payment_method ) { if ( array_key_exists( $enabled_payment_method, $all_payment_methods ) && - in_array( strtolower( $pmpro_currency ), $all_payment_methods[ $enabled_payment_method ]['supported_currencies'] ) && + ( empty( $all_payment_methods[ $enabled_payment_method ]['supported_currencies'] ) || in_array( strtolower( $pmpro_currency ), $all_payment_methods[ $enabled_payment_method ]['supported_currencies'] ) ) && ( empty( $subscription_data ) || $all_payment_methods[ $enabled_payment_method ]['recurring'] ) ){ $payment_method_types[] = $enabled_payment_method; } } - $payment_method_types[] = 'card'; // And let's send 'em to Stripe! $checkout_session_params = array( @@ -1778,6 +1792,13 @@ public static function get_all_checkout_payment_methods() { 'recurring' => false, ), */ + 'card' => array( + 'name' => 'Card', + 'supported_currencies' => null, // All currencies. + 'instant_confirmation' => true, + 'recurring' => true, + 'always_enabled' => true, + ), 'boleto' => array( 'name' => 'Boleto', 'supported_currencies' => array( 'brl' ), From e9fe83f26a78748d4b3036b141a4df613e91ae5d Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 26 Jan 2022 10:43:44 -0500 Subject: [PATCH 022/145] Now filling Payment Type field for Stripe Checkout purchases --- .../gateways/class.pmprogateway_stripe.php | 2 +- services/stripe-webhook.php | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 038267667..01534caad 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1688,7 +1688,7 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) // Set up payment method types. $all_payment_methods = self::get_all_checkout_payment_methods(); - $payment_method_types = array(); + $payment_method_types = array( 'card' ); $enabled_payment_methods = pmpro_getOption( 'stripe_enabled_payment_methods' ); if ( empty( $enabled_payment_methods ) ) { $enabled_payment_methods = array(); diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 5e6c05557..1f897ff0f 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -433,8 +433,17 @@ if ( $checkout_session->mode === 'payment' ) { // User purchased a one-time payment level. Assign the charge ID to the order. try { - $payment_intent = \Stripe\PaymentIntent::retrieve( $checkout_session->payment_intent ); - error_log( $payment_intent->charges->data[0]->id ); + $payment_intent_args = array( + 'id' => $checkout_session->payment_intent, + 'expand' => array( + 'payment_method', + ), + ); + $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); + $order->payment_transaction_id = $payment_intent->charges->data[0]->id; + if ( ! empty( $payment_intent->payment_method ) ) { + $payment_method = $payment_intent->payment_method; + } } catch ( \Stripe\Error\Base $e ) { // Could not get payment intent. We just won't set a payment transaction ID. } @@ -442,15 +451,33 @@ // User purchased a subscription. Assign the subscription ID invoice ID to the order. $order->subscription_transaction_id = $checkout_session->subscription; try { - $invoices = \Stripe\Invoice::all( [ 'subscription' => $checkout_session->subscription ] ); - if ( ! empty( $invoices->data ) ) { - $order->payment_transaction_id = $invoices->data[0]->id; + $subscription_args = array( + 'id' => $checkout_session->subscription, + 'expand' => array( + 'latest_invoice', + 'default_payment_method', + ), + ); + $subscription = \Stripe\Subscription::retrieve( $subscription_args ); + if ( ! empty( $subscription->latest_invoice->id ) ) { + $order->payment_transaction_id = $subscription->latest_invoice->id; + } + if ( ! empty( $subscription->default_payment_method ) ) { + $payment_method = $subscription->default_payment_method; } } catch ( \Stripe\Error\Base $e ) { // Could not get invoices. We just won't set a payment transaction ID. } } + // Fill the "Payment Type" for the order. + if ( ! empty( $payment_method ) ) { + $all_payment_methods = PMProGateway_stripe::get_all_checkout_payment_methods(); + if ( ! empty( $all_payment_methods[ $payment_method->type ] ) ) { + $order->payment_type = 'Stripe - ' . $all_payment_methods[ $payment_method->type ]['name']; + } + } + // Get the customer's billing address. try { $customer = \Stripe\Customer::retrieve( $checkout_session->customer ); From d7c22c6e4381a814154b04c963d0e373e1d830d1 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 26 Jan 2022 11:33:23 -0500 Subject: [PATCH 023/145] Added Stripe Checkout option for onsite update billing page. --- .../gateways/class.pmprogateway_stripe.php | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 01534caad..ad914064f 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -178,7 +178,7 @@ public static function init() { add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); add_filter('pmprommpu_gateway_supports_multiple_level_checkout', '__return_false', 10, 2); - add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_billing_preheader_stripe_customer_portal' ) ); + add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_billing_preheader_stripe_checkout' ) ); } } @@ -261,6 +261,7 @@ public static function getGatewayOptions() { if ( self::stripe_checkout_beta_enabled() ) { $options[] = 'stripe_payment_flow'; // 'onsite' or 'checkout' + $options[] = 'stripe_update_billing_flow'; // 'onsite' or 'portal' $options[] = 'stripe_checkout_billing_address'; //'auto' or 'required' $options[] = 'stripe_tax'; // 'none', 'inclusive', 'exclusive' $options[] = 'stripe_tax_id_collection_enabled'; // true, false @@ -530,6 +531,17 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { + style="display: none;"> + + + + + + + style="display: none;"> @@ -1883,26 +1895,42 @@ public static function get_all_checkout_payment_methods() { ); } - public static function pmpro_billing_preheader_stripe_customer_portal() { - $user_order = new MemberOrder(); - $user_order->getLastMemberOrder( null, array( 'success', 'pending' ) ); - - // Check whether the user's most recent order is a Stripe subscription. - if ( empty( $user_order->gateway ) || 'stripe' !== $user_order->gateway ) { - return; - } - - $stripe = new PMProGateway_stripe(); - $customer = $stripe->get_customer_for_user( $user_order->user_id ); - if ( empty( $customer->id ) ) { - return; - } - - $customer_portal_url = $stripe->get_customer_portal_url( $customer->id ); - if ( ! empty( $customer_portal_url ) ) { - wp_redirect( $customer_portal_url ); - exit; - } + public static function pmpro_billing_preheader_stripe_checkout() { + if ( 'portal' === pmpro_getOption( 'stripe_update_billing_flow' ) ) { + // Send user to Stripe Customer Portal. + $user_order = new MemberOrder(); + $user_order->getLastMemberOrder( null, array( 'success', 'pending' ) ); + + // Check whether the user's most recent order is a Stripe subscription. + if ( empty( $user_order->gateway ) || 'stripe' !== $user_order->gateway ) { + return; + } + + $stripe = new PMProGateway_stripe(); + $customer = $stripe->get_customer_for_user( $user_order->user_id ); + if ( empty( $customer->id ) ) { + return; + } + + $customer_portal_url = $stripe->get_customer_portal_url( $customer->id ); + if ( ! empty( $customer_portal_url ) ) { + wp_redirect( $customer_portal_url ); + exit; + } + } else { + // Disable Stripe Checkout functionality for the rest of this page load. + add_filter( 'pmpro_include_cardtype_field', array( + 'PMProGateway_stripe', + 'pmpro_include_billing_address_fields' + ), 15 ); + add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ), 15 ); + add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ), 15 ); + add_filter( 'pmpro_include_payment_information_fields', array( + 'PMProGateway_stripe', + 'pmpro_include_payment_information_fields' + ), 15 ); + add_filter( 'option_pmpro_stripe_payment_flow', '__return_false' ); // Disable Stripe Checkout for rest of page load. + } } /**************************************** From e753d63161df57541d456944c447da8bb8f170ac Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 26 Jan 2022 13:33:50 -0500 Subject: [PATCH 024/145] Now handling CC info with Stripe Checkout --- services/stripe-webhook.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 1f897ff0f..03f401123 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -470,11 +470,30 @@ } } - // Fill the "Payment Type" for the order. + // Fill the "Payment Type" and credit card fields for the order. if ( ! empty( $payment_method ) ) { $all_payment_methods = PMProGateway_stripe::get_all_checkout_payment_methods(); if ( ! empty( $all_payment_methods[ $payment_method->type ] ) ) { $order->payment_type = 'Stripe - ' . $all_payment_methods[ $payment_method->type ]['name']; + if ( ! empty( $payment_method->card ) ) { + // Paid with a card, let's update order and user meta with the card info. + $order->cardtype = $payment_method->card->brand; + $order->accountnumber = hideCardNumber( $payment_method->card->last4 ); + $order->expirationmonth = $payment_method->card->exp_month; + $order->expirationyear = $payment_method->card->exp_year; + + // And let's also update the user meta with the card info. + update_user_meta( $order->user_id, "pmpro_CardType", $payment_method->card->brand ); + update_user_meta( $order->user_id, "pmpro_AccountNumber", hideCardNumber( $payment_method->card->last4 ) ); + update_user_meta( $order->user_id, "pmpro_ExpirationMonth", $payment_method->card->exp_month ); + update_user_meta( $order->user_id, "pmpro_ExpirationYear", $payment_method->card->exp_year ); + } else { + // Didn't pay with card. Let's clear out user meta so that they don't get expiration warnings. + update_user_meta( $order->user_id, "pmpro_CardType", '' ); + update_user_meta( $order->user_id, "pmpro_AccountNumber", '' ); + update_user_meta( $order->user_id, "pmpro_ExpirationMonth", '' ); + update_user_meta( $order->user_id, "pmpro_ExpirationYear", '' ); + } } } From ce694274563dea8ed4132dc86890a2b3fe444979 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 26 Jan 2022 13:39:55 -0500 Subject: [PATCH 025/145] Save billing address to user meta when using Stripe checkout --- services/stripe-webhook.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 03f401123..e6051e372 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -507,12 +507,25 @@ ! empty( $customer->address->postal_code ) && ! empty( $customer->address->country ) ) { + // Update the billing address on the order. $order->billing->name = $customer->name; $order->billing->street = $customer->address->line1; $order->billing->city = $customer->address->city; $order->billing->state = $customer->address->state; $order->billing->zip = $customer->address->postal_code; $order->billing->country = $customer->address->country; + + // Update the user's meta with the billing address. + $name_parts = explode( ' ', $customer->name ); + $last_name = array_pop( $name_parts ); + $first_name = implode( ' ', $name_parts ); + update_user_meta( $order->user_id, "pmpro_bfirstname", $first_name ); + update_user_meta( $order->user_id, "pmpro_blastname", $last_name ); + update_user_meta( $order->user_id, "pmpro_baddress1", $customer->address->line1 ); + update_user_meta( $order->user_id, "pmpro_bcity", $customer->address->city ); + update_user_meta( $order->user_id, "pmpro_bstate", $customer->address->state ); + update_user_meta( $order->user_id, "pmpro_bzipcode", $customer->address->postal_code ); + update_user_meta( $order->user_id, "pmpro_bcountry", $customer->address->country ); } } catch ( \Stripe\Error\Base $e ) { // Could not get customer. We just won't set billing info. From 227744ad27a3f020931a86632e1ab3f249fc7d42 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Wed, 26 Jan 2022 14:01:59 -0500 Subject: [PATCH 026/145] Fixed Stripe Checkout bug where user may see confirmation for old order. --- js/pmpro-confirmation.js | 2 +- preheaders/confirmation.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/pmpro-confirmation.js b/js/pmpro-confirmation.js index 733cc80a3..ac8e4d2aa 100644 --- a/js/pmpro-confirmation.js +++ b/js/pmpro-confirmation.js @@ -14,7 +14,7 @@ jQuery( document ).ready( function() { 'code': pmpro.code }, success: function( response ) { - if ( response.status == 'success' ) { + if ( response.status == 'success' || response.status == 'error' ) { // Order is complete. clearInterval( pollInterval ); window.location.reload(); diff --git a/preheaders/confirmation.php b/preheaders/confirmation.php index 3e62e6756..e668aef4a 100644 --- a/preheaders/confirmation.php +++ b/preheaders/confirmation.php @@ -20,9 +20,9 @@ // Get the most recent invoice for the current user. $pmpro_invoice = new MemberOrder(); -$pmpro_invoice->getLastMemberOrder( $current_user->ID, apply_filters( "pmpro_confirmation_order_status", array( "success", "pending" ) ) ); +$pmpro_invoice->getLastMemberOrder( $current_user->ID, apply_filters( 'pmpro_confirmation_order_status', array( 'success', 'pending', 'token' ) ) ); -if ( 'pending' !== $pmpro_invoice->status && empty( $current_user->membership_level ) ) { +if ( ! in_array( $pmpro_invoice->status, array( 'pending', 'token' ) ) && empty( $current_user->membership_level ) ) { // The user does not have a membership level (including pending checkouts). // Redirect them to the account page. $redirect_url = pmpro_url( 'account' ); @@ -31,7 +31,7 @@ } elseif ( ! empty( $current_user->membership_level ) && pmpro_isLevelFree( $current_user->membership_level ) ) { // User checked out for a free level. We are not going to show the invoice on the confirmation page. $pmpro_invoice = null; -} elseif ( 'pending' === $pmpro_invoice->status ) { +} elseif ( in_array( $pmpro_invoice->status, array( 'pending', 'token' ) ) ) { // Enqueue PMPro Confirmation script. wp_register_script( 'pmpro_confirmation', From 311a13d07e55c4ea3fa0059953c9a1191055c3a6 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 27 Jan 2022 14:55:44 -0500 Subject: [PATCH 027/145] Documentation updates --- .../gateways/class.pmprogateway_stripe.php | 39 ++++++++++++++----- js/pmpro-confirmation.js | 4 +- pages/confirmation.php | 4 +- services/stripe-webhook.php | 3 -- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index ad914064f..d1e2449fc 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -263,8 +263,8 @@ public static function getGatewayOptions() { $options[] = 'stripe_payment_flow'; // 'onsite' or 'checkout' $options[] = 'stripe_update_billing_flow'; // 'onsite' or 'portal' $options[] = 'stripe_checkout_billing_address'; //'auto' or 'required' - $options[] = 'stripe_tax'; // 'none', 'inclusive', 'exclusive' - $options[] = 'stripe_tax_id_collection_enabled'; // true, false + $options[] = 'stripe_tax'; // 'no', 'inclusive', 'exclusive' + $options[] = 'stripe_tax_id_collection_enabled'; // '0', '1' $options[] = 'stripe_enabled_payment_methods'; // array of enabled payment methods. } @@ -1542,11 +1542,10 @@ public static function using_stripe_checkout() { /** * Swap in our submit buttons. * - * @param bool $show + * @since TBD * + * @param bool $show Whether to show the default submit button. * @return bool - * - * @since 1.8 */ static function pmpro_checkout_default_submit_button($show) { @@ -1571,17 +1570,17 @@ static function pmpro_checkout_default_submit_button($show)
  • : display_name );?> (user_email );?>)
  • -
  • : membership_level->name);?> status ) { echo ' (' . esc_html__( 'Pending', 'paid-memberships-pro' ) . ')'; }?>
  • - membership_level->enddate ) && 'pending' !== $pmpro_invoice->status ) { ?> +
  • : membership_level->name);?> status, array( 'pending', 'token' ) ) ) { echo ' (' . esc_html__( 'Pending', 'paid-memberships-pro' ) . ')'; }?>
  • + membership_level->enddate ) && ! in_array( $pmpro_invoice->status, array( 'pending', 'token' ) ) ) { ?>
  • : membership_level->enddate)?>
  • getDiscountCode()) { ?> diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index e6051e372..da5a4d151 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -802,8 +802,6 @@ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { $checkout_level_arr = get_pmpro_membership_order_meta( $morder->id, 'checkout_level', true ); $pmpro_level = (object) $checkout_level_arr; - // TODO: Maybe set $pmpro_checkout_level_ids for MMPU compatibility. - // Set $discount_code. $discount_code_arr = get_pmpro_membership_order_meta( $morder->id, 'discount_code', true ); if ( ! empty( $discount_code_arr ) ) { @@ -866,7 +864,6 @@ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { if ( pmpro_changeMembershipLevel( $custom_level, $morder->user_id, 'changed' ) !== false ) { //update order status and transaction ids $morder->status = "success"; - // TODO: Set payment and subscription IDs. $morder->saveOrder(); //add discount code use From 9f9fe6aeae94b4cb777cf260c802eacaa7bdd87d Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 27 Jan 2022 15:03:45 -0500 Subject: [PATCH 028/145] Noted webhook events needed for Stripe Checkout --- classes/gateways/class.pmprogateway_stripe.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index d1e2449fc..b0499b1a5 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -3406,12 +3406,21 @@ public static function get_site_webhook_url() { public static function webhook_events() { // Show deprecation warning if called publically. pmpro_method_should_be_private( '2.7.0' ); - return apply_filters( 'pmpro_stripe_webhook_events', array( + + $events = array( 'invoice.payment_succeeded', 'invoice.payment_action_required', 'customer.subscription.deleted', - 'charge.failed' - ) ); + 'charge.failed', + ); + + if ( self::using_stripe_checkout() ) { + $events[] = 'checkout.session.completed'; + $events[] = 'checkout.session.async_payment_succeeded'; + $events[] = 'checkout.session.async_payment_failed'; + } + + return apply_filters( 'pmpro_stripe_webhook_events', $events ); } /** From bf66dc093ec6ee2346f832bcfd069e0fb72d562c Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 28 Jan 2022 11:59:45 -0500 Subject: [PATCH 029/145] Stripe Checkout now automatically detects enabled payment methods --- .../gateways/class.pmprogateway_stripe.php | 215 ------------------ services/stripe-webhook.php | 43 ++-- 2 files changed, 20 insertions(+), 238 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index b0499b1a5..43ae7e64b 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -265,7 +265,6 @@ public static function getGatewayOptions() { $options[] = 'stripe_checkout_billing_address'; //'auto' or 'required' $options[] = 'stripe_tax'; // 'no', 'inclusive', 'exclusive' $options[] = 'stripe_tax_id_collection_enabled'; // '0', '1' - $options[] = 'stripe_enabled_payment_methods'; // array of enabled payment methods. } return $options; @@ -578,56 +577,6 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    - style="display: none;"> - - - - - - - - - - - - - $payment_method_data ) { - // Build the table data. - $checkbox_disabled_attr = empty( $payment_method_data['always_enabled'] ) ? '' : ' disabled '; - $checkbox_checked_attr = in_array( $payment_method, $enabled_payment_methods ) || ! empty( $payment_method_data['always_enabled'] ) ? ' checked ' : ''; - $payment_method_name = $payment_method_data['name']; - $payment_method_currencies = 'All'; - if ( ! empty( $payment_method_data['supported_currencies'] ) ) { - // List all supported currencies. - $payment_method_currencies = implode( ', ', $payment_method_data['supported_currencies'] ); - // Ensure upper-case currency codes. - $payment_method_currencies = strtoupper( $payment_method_currencies ); - // Bold the current currency. - $payment_method_currencies = str_replace( strtoupper( $pmpro_currency ), '' . strtoupper( $pmpro_currency ) . '', $payment_method_currencies ); - } - $payment_method_instant_confirmation = $payment_method_data['instant_confirmation'] ? "✓" : ''; - $payment_method_supports_recurring = $payment_method_data['recurring'] ? "✓" : ''; - ?> -
    />
    -

    - - $customer->id, - 'payment_method_types' => $payment_method_types, - 'payment_method_options' => array( // All of this can be filtered to customize. - 'acss_debit' => array( - 'mandate_options' => array( - 'payment_schedule' => 'sporadic', - 'transaction_type' => 'personal', - ), - ), - 'wechat_pay' => array( - 'client' => 'web', - ), - ), 'line_items' => $line_items, 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', 'automatic_tax' => $automatic_tax, @@ -1765,141 +1685,6 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) exit; } - /** - * Get a list of all payment methods available in Stripe Checkout. - * - * @since TBD - * @return array - */ - public static function get_all_checkout_payment_methods() { - // List based off of https://stripe.com/docs/payments/payment-methods/integration-options. - return array( - /* Would require collecting shipping info. Put off for now. - 'afterpay_clearpay' => array( - 'name' => 'Afterpay Card', - 'supported_currencies' => array( 'aud', 'cad', 'nzd', 'gbp', 'usd' ), - 'recurring' => false, - ), - */ - 'alipay' => array( - 'name' => 'Alipay', - // 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'myr', 'nzd', 'sgd', 'usd' ), // Documentaion says that all these should work, but throws error at checkout. - 'supported_currencies' => array( 'cny', 'usd' ), - // 'recurring' => true, // Documentation says this is true, but throws error at checkout. - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'bacs_debit' => array( - 'name' => 'BACS Direct Debit', - 'supported_currencies' => array( 'gbp' ), - 'instant_confirmation' => false, - 'recurring' => true, - ), - 'bancontact' => array( - 'name' => 'Bancontact', - 'supported_currencies' => array( 'eur' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - /* Documentation says that this is a valid payment gateway, but throws error at checkout. - 'au_becs_debit' => array( - 'name' => 'BECS Direct Debit', - 'supported_currencies' => array( 'aud' ), - 'instant_confirmation' => false, - 'recurring' => false, - ), - */ - 'card' => array( - 'name' => 'Card', - 'supported_currencies' => null, // All currencies. - 'instant_confirmation' => true, - 'recurring' => true, - 'always_enabled' => true, - ), - 'boleto' => array( - 'name' => 'Boleto', - 'supported_currencies' => array( 'brl' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'eps' => array( - 'name' => 'EPS', - 'supported_currencies' => array( 'eur' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'fpx' => array( - 'name' => 'FPX', - 'supported_currencies' => array( 'myr' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'giropay' => array( - 'name' => 'GiroPay', - 'supported_currencies' => array( 'eur' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'grabpay' => array( - 'name' => 'GrabPay', - 'supported_currencies' => array( 'myr', 'sgd' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'ideal' => array( - 'name' => 'iDEAL', - 'supported_currencies' => array( 'eur' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'klarna' => array( - 'name' => 'Klarna', - // 'supported_currencies' => array( 'dkk', 'eur', 'gbp', 'nok', 'sek', 'usd' ), // Documentaion says that all these should work, but throws error at checkout. - 'supported_currencies' => array( 'usd' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'oxxo' => array( - 'name' => 'OXXO', - 'supported_currencies' => array( 'mxn' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'p24' => array( - 'name' => 'P24', - 'supported_currencies' => array( 'eur', 'pln' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'acss_debit' => array( - 'name' => 'Pre-authorized debits in Canada', - 'supported_currencies' => array( 'cad', 'usd' ), - 'instant_confirmation' => false, - // 'recurring' => true, // Documentation says this is true, but throws error at checkout. - 'recurring' => false, - ), - 'sepa_debit' => array( - 'name' => 'SEPA Direct Debit', - 'supported_currencies' => array( 'eur' ), - 'instant_confirmation' => false, - 'recurring' => true, - ), - 'sofort' => array( - 'name' => 'Sofort', - 'supported_currencies' => array( 'eur' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - 'wechat_pay' => array( - 'name' => 'WeChat Pay', - // 'supported_currencies' => array( 'aud', 'cad', 'cny', 'eur', 'gbp', 'hkd', 'jpy', 'sgd', 'usd', 'dkk', 'nok', 'sek', 'chf' ), - 'supported_currencies' => array( 'cny', 'usd' ), - 'instant_confirmation' => true, - 'recurring' => false, - ), - ); - } - /** * If using Stripe Checkout, either redirect the user to the Stripe Customer * portal or set up our update billing page with the onsite payment fields. diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index da5a4d151..a6d5cadbe 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -471,29 +471,26 @@ } // Fill the "Payment Type" and credit card fields for the order. - if ( ! empty( $payment_method ) ) { - $all_payment_methods = PMProGateway_stripe::get_all_checkout_payment_methods(); - if ( ! empty( $all_payment_methods[ $payment_method->type ] ) ) { - $order->payment_type = 'Stripe - ' . $all_payment_methods[ $payment_method->type ]['name']; - if ( ! empty( $payment_method->card ) ) { - // Paid with a card, let's update order and user meta with the card info. - $order->cardtype = $payment_method->card->brand; - $order->accountnumber = hideCardNumber( $payment_method->card->last4 ); - $order->expirationmonth = $payment_method->card->exp_month; - $order->expirationyear = $payment_method->card->exp_year; - - // And let's also update the user meta with the card info. - update_user_meta( $order->user_id, "pmpro_CardType", $payment_method->card->brand ); - update_user_meta( $order->user_id, "pmpro_AccountNumber", hideCardNumber( $payment_method->card->last4 ) ); - update_user_meta( $order->user_id, "pmpro_ExpirationMonth", $payment_method->card->exp_month ); - update_user_meta( $order->user_id, "pmpro_ExpirationYear", $payment_method->card->exp_year ); - } else { - // Didn't pay with card. Let's clear out user meta so that they don't get expiration warnings. - update_user_meta( $order->user_id, "pmpro_CardType", '' ); - update_user_meta( $order->user_id, "pmpro_AccountNumber", '' ); - update_user_meta( $order->user_id, "pmpro_ExpirationMonth", '' ); - update_user_meta( $order->user_id, "pmpro_ExpirationYear", '' ); - } + if ( ! empty( $payment_method ) && ! empty( $payment_method->type ) ) { + $order->payment_type = 'Stripe - ' . $payment_method->type; + if ( ! empty( $payment_method->card ) ) { + // Paid with a card, let's update order and user meta with the card info. + $order->cardtype = $payment_method->card->brand; + $order->accountnumber = hideCardNumber( $payment_method->card->last4 ); + $order->expirationmonth = $payment_method->card->exp_month; + $order->expirationyear = $payment_method->card->exp_year; + + // And let's also update the user meta with the card info. + update_user_meta( $order->user_id, "pmpro_CardType", $payment_method->card->brand ); + update_user_meta( $order->user_id, "pmpro_AccountNumber", hideCardNumber( $payment_method->card->last4 ) ); + update_user_meta( $order->user_id, "pmpro_ExpirationMonth", $payment_method->card->exp_month ); + update_user_meta( $order->user_id, "pmpro_ExpirationYear", $payment_method->card->exp_year ); + } else { + // Didn't pay with card. Let's clear out user meta so that they don't get expiration warnings. + update_user_meta( $order->user_id, "pmpro_CardType", '' ); + update_user_meta( $order->user_id, "pmpro_AccountNumber", '' ); + update_user_meta( $order->user_id, "pmpro_ExpirationMonth", '' ); + update_user_meta( $order->user_id, "pmpro_ExpirationYear", '' ); } } From 29bb2a491e9b902ebcff50f2915b9f5b5ade8b16 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Wed, 2 Feb 2022 06:15:19 -0500 Subject: [PATCH 030/145] Updating field names, values, and descriptive text for Stripe Checkout beta. --- .../gateways/class.pmprogateway_stripe.php | 67 ++++++++++--------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 422dac65c..26ac5deeb 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -503,78 +503,81 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    - - - style="display: none;"> - -

    - -

    +
    +

    +
    +

    +
    style="display: none;"> - + +

    style="display: none;"> - + +

    style="display: none;"> - + style="display: none;"> - + + array ( + 'href' => array(), + 'target' => array(), + 'title' => array(), + ), + ); + ?> +

    activate Stripe Tax in your Stripe dashboard. More information about Stripe Tax »', 'paid-memberships-pro' ), $allowed_stripe_tax_description_html ), 'https://stripe.com/tax', 'https://dashboard.stripe.com/settings/tax/activate' ); ?>

    -

    style="display: none;"> - + -

    +

    Date: Wed, 2 Feb 2022 12:42:02 -0500 Subject: [PATCH 031/145] JS to hide the checkout fields not relevant if checkout not enabled; wording improvements --- .../gateways/class.pmprogateway_stripe.php | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 26ac5deeb..db9366a22 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -516,13 +516,26 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { - + +

    + style="display: none;"> @@ -535,7 +548,7 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    - style="display: none;"> + style="display: none;"> @@ -546,7 +559,7 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { - style="display: none;"> + style="display: none;"> @@ -568,14 +581,27 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    activate Stripe Tax in your Stripe dashboard. More information about Stripe Tax »', 'paid-memberships-pro' ), $allowed_stripe_tax_description_html ), 'https://stripe.com/tax', 'https://dashboard.stripe.com/settings/tax/activate' ); ?>

    - style="display: none;"> + + style="display: none;">

    From 2269f7c80bf584b50eb57cf139e8e9a6af82172c Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Wed, 2 Feb 2022 15:34:14 -0500 Subject: [PATCH 032/145] Removing the JS needs more thought; update submit button to Continue to Payment --- .../gateways/class.pmprogateway_stripe.php | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index db9366a22..0af25604e 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -516,26 +516,13 @@ public static function pmpro_payment_option_fields( $values, $gateway ) { -

    - style="display: none;"> @@ -548,7 +535,7 @@ function pmpro_updateAllowStripeCheckoutTRs() {

    - style="display: none;"> + style="display: none;"> @@ -559,7 +546,7 @@ function pmpro_updateAllowStripeCheckoutTRs() { - style="display: none;"> + style="display: none;"> @@ -1544,7 +1531,7 @@ static function pmpro_checkout_default_submit_button($show) ?> - + Date: Thu, 3 Feb 2022 13:10:31 -0500 Subject: [PATCH 033/145] Refactored Stripe webhook to remove duplicate code and simplify flow --- services/stripe-webhook.php | 272 ++++++++++++++++++------------------ 1 file changed, 137 insertions(+), 135 deletions(-) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index a6d5cadbe..fe8ba8d02 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -8,6 +8,7 @@ use Stripe\Event as Stripe_Event; use Stripe\PaymentIntent as Stripe_PaymentIntent; use Stripe\Charge as Stripe_Charge; + use Stripe\PaymentMethod as Stripe_PaymentMethod; global $isapage; $isapage = true; @@ -159,36 +160,19 @@ $morder->gateway = $old_order->gateway; $morder->gateway_environment = $old_order->gateway_environment; - $charge = Stripe_Charge::retrieve( $pmpro_stripe_event->data->object->charge ); - if ( ! empty ( $charge->billing_details->address->line1 ) ) { - // Get order billing details from Stripe. - $morder->billing = $charge->billing_details->address; - $morder->billing->name = $charge->billing_details->name; // Add name. - $morder->billing->phone = $charge->billing_details->phone; // Add phone. - $morder->billing->zip = $morder->billing->postal_code; // Fix zip. - $morder->billing->street = $morder->billing->line1; // Fix street. - - $nameparts = pnp_split_full_name( $morder->billing->name ); - $morder->FirstName = empty( $nameparts['fname'] ) ? '' : $nameparts['fname']; - $morder->LastName = empty( $nameparts['lname'] ) ? '' : $nameparts['lname']; - $morder->Email = $wpdb->get_var("SELECT user_email FROM $wpdb->users WHERE ID = '" . $old_order->user_id . "' LIMIT 1"); - $morder->Address1 = $morder->billing->street; - $morder->City = $morder->billing->city; - $morder->State = $morder->billing->state; - $morder->Zip = $morder->billing->zip; - $morder->PhoneNumber = $morder->billing->phone; - } else { - // Pull from previous order. - $morder->find_billing_address(); + // Update payment method and billing address on order. + $payment_intent_args = array( + 'id' => $invoice->payment_intent, + 'expand' => array( + 'payment_method', + ), + ); + $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); + if ( empty( $payment_intent->payment_method ) ) { + $logstr .= "Could not find payment method for invoice " . $invoice->id; + pmpro_stripeWebhookExit(); } - - //get CC info that is on file - $morder->cardtype = get_user_meta($user_id, "pmpro_CardType", true); - $morder->accountnumber = hideCardNumber(get_user_meta($user_id, "pmpro_AccountNumber", true), false); - $morder->expirationmonth = get_user_meta($user_id, "pmpro_ExpirationMonth", true); - $morder->expirationyear = get_user_meta($user_id, "pmpro_ExpirationYear", true); - $morder->ExpirationDate = $morder->expirationmonth . $morder->expirationyear; - $morder->ExpirationDate_YdashM = $morder->expirationyear . "-" . $morder->expirationmonth; + pmpro_stripe_webhook_populate_order_from_payment( $morder, $payment_intent->payment_method ); //save $morder->status = "success"; @@ -246,27 +230,30 @@ $old_order = getOldOrderFromInvoiceEvent($pmpro_stripe_event); $user_id = $old_order->user_id; $user = get_userdata($user_id); + $invoice = $pmpro_stripe_event->data->object; // Prep order for emails. $morder = new MemberOrder(); $morder->user_id = $user_id; - $morder->billing = new stdClass(); - $morder->billing->name = $old_order->billing->name; - $morder->billing->street = $old_order->billing->street; - $morder->billing->city = $old_order->billing->city; - $morder->billing->state = $old_order->billing->state; - $morder->billing->zip = $old_order->billing->zip; - $morder->billing->country = $old_order->billing->country; - $morder->billing->phone = $old_order->billing->phone; - - //get CC info that is on file - $morder->cardtype = get_user_meta($user_id, "pmpro_CardType", true); - $morder->accountnumber = hideCardNumber(get_user_meta($user_id, "pmpro_AccountNumber", true), false); - $morder->expirationmonth = get_user_meta($user_id, "pmpro_ExpirationMonth", true); - $morder->expirationyear = get_user_meta($user_id, "pmpro_ExpirationYear", true); + + // Update payment method and billing address on order. + $payment_intent_args = array( + 'id' => $invoice->payment_intent, + 'expand' => array( + 'payment_method', + ), + ); + $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); + error_log( print_r( $payment_intent->charges->data[0], true ) ); + $payment_method = $payment_intent->charges->data[0]->payment_method_details; + if ( empty( $payment_method ) ) { + $logstr .= "Could not find payment method for invoice " . $invoice->id; + pmpro_stripeWebhookExit(); + } + pmpro_stripe_webhook_populate_order_from_payment( $morder, $payment_method ); // Add invoice link to the order. - $morder->invoice_url = $pmpro_stripe_event->data->object->hosted_invoice_url; + $morder->invoice_url = $invoice->hosted_invoice_url; // Email the user and ask them to authenticate their payment. $pmproemail = new PMProEmail(); @@ -297,21 +284,20 @@ $morder = new MemberOrder(); $morder->user_id = $user_id; $morder->membership_id = $old_order->membership_id; - - $morder->billing = new stdClass(); - $morder->billing->name = $old_order->billing->name; - $morder->billing->street = $old_order->billing->street; - $morder->billing->city = $old_order->billing->city; - $morder->billing->state = $old_order->billing->state; - $morder->billing->zip = $old_order->billing->zip; - $morder->billing->country = $old_order->billing->country; - $morder->billing->phone = $old_order->billing->phone; - - //get CC info that is on file - $morder->cardtype = get_user_meta($user_id, "pmpro_CardType", true); - $morder->accountnumber = hideCardNumber(get_user_meta($user_id, "pmpro_AccountNumber", true), false); - $morder->expirationmonth = get_user_meta($user_id, "pmpro_ExpirationMonth", true); - $morder->expirationyear = get_user_meta($user_id, "pmpro_ExpirationYear", true); + + // Update payment method and billing address on order. + $payment_intent_args = array( + 'id' => $pmpro_stripe_event->data->object->payment_intent, + 'expand' => array( + 'payment_method', + ), + ); + $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); + if ( empty( $payment_intent->payment_method ) ) { + $logstr .= "Could not find payment method for charge " . $pmpro_stripe_event->data->object->id; + pmpro_stripeWebhookExit(); + } + pmpro_stripe_webhook_populate_order_from_payment( $morder, $payment_intent->payment_method ); // Email the user and ask them to update their credit card information $pmproemail = new PMProEmail(); @@ -429,7 +415,7 @@ pmpro_stripeWebhookExit(); } - // Get the payment and subscription IDs for the checkout. + // Get the payment method object for this checkout and set transaction and subscription ids. if ( $checkout_session->mode === 'payment' ) { // User purchased a one-time payment level. Assign the charge ID to the order. try { @@ -469,69 +455,22 @@ // Could not get invoices. We just won't set a payment transaction ID. } } - - // Fill the "Payment Type" and credit card fields for the order. - if ( ! empty( $payment_method ) && ! empty( $payment_method->type ) ) { - $order->payment_type = 'Stripe - ' . $payment_method->type; - if ( ! empty( $payment_method->card ) ) { - // Paid with a card, let's update order and user meta with the card info. - $order->cardtype = $payment_method->card->brand; - $order->accountnumber = hideCardNumber( $payment_method->card->last4 ); - $order->expirationmonth = $payment_method->card->exp_month; - $order->expirationyear = $payment_method->card->exp_year; - - // And let's also update the user meta with the card info. - update_user_meta( $order->user_id, "pmpro_CardType", $payment_method->card->brand ); - update_user_meta( $order->user_id, "pmpro_AccountNumber", hideCardNumber( $payment_method->card->last4 ) ); - update_user_meta( $order->user_id, "pmpro_ExpirationMonth", $payment_method->card->exp_month ); - update_user_meta( $order->user_id, "pmpro_ExpirationYear", $payment_method->card->exp_year ); - } else { - // Didn't pay with card. Let's clear out user meta so that they don't get expiration warnings. - update_user_meta( $order->user_id, "pmpro_CardType", '' ); - update_user_meta( $order->user_id, "pmpro_AccountNumber", '' ); - update_user_meta( $order->user_id, "pmpro_ExpirationMonth", '' ); - update_user_meta( $order->user_id, "pmpro_ExpirationYear", '' ); - } + // Make sure that we have payment and payment method objects. + if ( empty( $payment_method ) ) { + $logstr .= "Could not find payment method for Checkout Session " . $checkout_session->id; + } else { + // Update payment method and billing address on order. + pmpro_stripe_webhook_populate_order_from_payment( $order, $payment_method ); } - // Get the customer's billing address. - try { - $customer = \Stripe\Customer::retrieve( $checkout_session->customer ); - if ( - ! empty( $customer->name ) && - ! empty( $customer->address->line1 ) && - ! empty( $customer->address->city ) && - ! empty( $customer->address->postal_code ) && - ! empty( $customer->address->country ) - ) { - // Update the billing address on the order. - $order->billing->name = $customer->name; - $order->billing->street = $customer->address->line1; - $order->billing->city = $customer->address->city; - $order->billing->state = $customer->address->state; - $order->billing->zip = $customer->address->postal_code; - $order->billing->country = $customer->address->country; - - // Update the user's meta with the billing address. - $name_parts = explode( ' ', $customer->name ); - $last_name = array_pop( $name_parts ); - $first_name = implode( ' ', $name_parts ); - update_user_meta( $order->user_id, "pmpro_bfirstname", $first_name ); - update_user_meta( $order->user_id, "pmpro_blastname", $last_name ); - update_user_meta( $order->user_id, "pmpro_baddress1", $customer->address->line1 ); - update_user_meta( $order->user_id, "pmpro_bcity", $customer->address->city ); - update_user_meta( $order->user_id, "pmpro_bstate", $customer->address->state ); - update_user_meta( $order->user_id, "pmpro_bzipcode", $customer->address->postal_code ); - update_user_meta( $order->user_id, "pmpro_bcountry", $customer->address->country ); - } - } catch ( \Stripe\Error\Base $e ) { - // Could not get customer. We just won't set billing info. - } + // Update the amounts paid. + global $pmpro_currency; + $currency = pmpro_get_currency(); + $currency_unit_multiplier = pow( 10, intval( $currency['decimals'] ) ); - // Update order total, subtotal, and tax. - $order->total = (float) $checkout_session->amount_total / 100; - $order->subtotal = (float) $checkout_session->amount_subtotal / 100; - $order->tax = (float) $checkout_session->total_details->amount_tax / 100; + $order->total = (float) $checkout_session->amount_total / $currency_unit_multiplier; + $order->subtotal = (float) $checkout_session->amount_subtotal / $currency_unit_multiplier; + $order->tax = (float) $checkout_session->total_details->amount_tax / $currency_unit_multiplier; // Was the checkout session successful? if ( $checkout_session->payment_status == "paid" ) { @@ -541,7 +480,7 @@ pmpro_stripeWebhookExit(); } // No we have not processed this order. Let's process it now. - if ( pmpro_webhookChangeMembershipLevel( $order, $checkout_session ) ) { + if ( pmpro_stripe_webhook_change_membership_level( $order, $checkout_session ) ) { $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " was processed successfully."; } else { $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " could not be processed."; @@ -581,7 +520,7 @@ pmpro_stripeWebhookExit(); } // No we have not processed this order. Let's process it now. - if ( pmpro_webhookChangeMembershipLevel( $order, $checkout_session ) ) { + if ( pmpro_stripe_webhook_change_membership_level( $order, $checkout_session ) ) { $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " was processed successfully."; } else { $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " could not be processed."; @@ -788,10 +727,25 @@ function pmpro_stripeWebhookExit() exit; } - /* - Change the membership level. We also update the membership order to include filtered valus. -*/ -function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { +/** + * Assign a membership level when a checkout is completed via Stripe webhook. + * + * Steps: + * 1. Pull checkout data from order meta. + * 2. Build checkout level. + * 3. Change membership level. + * 4. Mark order as successful. + * 5. Record discount code use. + * 6. Save some user meta. + * 7. Run pmpro_after_checkout. + * 8. Send checkout emails. + * + * @since TBD + * + * @param MemberOrder $morder The order for the checkout being completed. + * @return bool + */ +function pmpro_stripe_webhook_change_membership_level( $morder ) { global $wpdb, $pmpro_level, $discount_code; @@ -859,7 +813,7 @@ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { //change level and continue "checkout" if ( pmpro_changeMembershipLevel( $custom_level, $morder->user_id, 'changed' ) !== false ) { - //update order status and transaction ids + // Mark the order as successful. $morder->status = "success"; $morder->saveOrder(); @@ -896,25 +850,73 @@ function pmpro_webhookChangeMembershipLevel( $morder, $checkout_session ) { do_action( "pmpro_after_checkout", $morder->user_id, $morder ); //setup some values for the emails - if ( ! empty( $morder ) ) { - $invoice = new MemberOrder( $morder->id ); - } else { - $invoice = null; - } - $user = get_userdata( $morder->user_id ); $user->membership_level = $pmpro_level; //make sure they have the right level info //send email to member $pmproemail = new PMProEmail(); - $pmproemail->sendCheckoutEmail( $user, $invoice ); + $pmproemail->sendCheckoutEmail( $user, $morder ); //send email to admin $pmproemail = new PMProEmail(); - $pmproemail->sendCheckoutAdminEmail( $user, $invoice ); + $pmproemail->sendCheckoutAdminEmail( $user, $morder ); return true; } else { return false; } +} + +/** + * Update order information from a Stripe payment method. + * + * @since TBD + * + * @param MemberOrder $order The order to update. + * @param Stripe_PaymentMethod $payment_method The payment method object. + */ +function pmpro_stripe_webhook_populate_order_from_payment( $order, $payment_method ) { + global $wpdb; + + // Fill the "Payment Type" and credit card fields. + if ( ! empty( $payment_method ) && ! empty( $payment_method->type ) ) { + $order->payment_type = 'Stripe - ' . $payment_method->type; + if ( ! empty( $payment_method->card ) ) { + // Paid with a card, let's update order and user meta with the card info. + $order->cardtype = $payment_method->card->brand; + $order->accountnumber = hideCardNumber( $payment_method->card->last4 ); + $order->expirationmonth = $payment_method->card->exp_month; + $order->expirationyear = $payment_method->card->exp_year; + $order->ExpirationDate = $order->expirationmonth . $order->expirationyear; + $order->ExpirationDate_YdashM = $order->expirationyear . "-" . $order->expirationmonth; + } else { + $order->cardtype = ''; + $order->accountnumber = ''; + $order->expirationmonth = ''; + $order->expirationyear = ''; + $order->ExpirationDate = ''; + $order->ExpirationDate_YdashM = ''; + } + } + + // Add billing address information. + $morder->billing = new stdClass(); + $order->billing->name = empty( $payment_method->billing_details->name ) ? '' : $payment_method->billing_details->name; + $order->billing->street = empty( $payment_method->billing_details->address->line1 ) ? '' : $payment_method->billing_details->address->line1; + $order->billing->city = empty( $payment_method->billing_details->address->city ) ? '' : $payment_method->billing_details->address->city; + $order->billing->state = empty( $payment_method->billing_details->address->state ) ? '' : $payment_method->billing_details->address->state; + $order->billing->zip = empty( $payment_method->billing_details->address->postal_code ) ? '' : $payment_method->billing_details->address->postal_code; + $order->billing->country = empty( $payment_method->billing_details->address->country ) ? '' : $payment_method->billing_details->address->country; + $order->billing->phone = empty( $payment_method->billing_details->phone ) ? '' : $payment_method->billing_details->phone; + + $name_parts = empty( $payment_method->billing_details->name ) ? [] : pnp_split_full_name( $payment_method->billing_details->name ); + $order->FirstName = empty( $nameparts['fname'] ) ? '' : $nameparts['fname']; + $order->LastName = empty( $nameparts['lname'] ) ? '' : $nameparts['lname']; + $order->Email = $wpdb->get_var("SELECT user_email FROM $wpdb->users WHERE ID = '" . $order->user_id . "' LIMIT 1"); + $order->Address1 = $order->billing->street; + $order->City = $order->billing->city; + $order->State = $order->billing->state; + $order->Zip = $order->billing->zip; + $order->Country = $order->billing->country; + $order->PhoneNumber = $order->billing->phone; } \ No newline at end of file From a62e43435c7a219a9f2b3409b23a3d40f8175e91 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 3 Feb 2022 13:11:17 -0500 Subject: [PATCH 034/145] Removed debug code --- logs/stripe-webhook.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 logs/stripe-webhook.txt diff --git a/logs/stripe-webhook.txt b/logs/stripe-webhook.txt new file mode 100644 index 000000000..cdf28b616 --- /dev/null +++ b/logs/stripe-webhook.txt @@ -0,0 +1,6 @@ +Logged On: 02/03/2022 06:08:52 +Ignoring an invoice for $0. Probably for a new subscription just created. Event ID #evt_1KP9jjGEs1yekmMiZijeQumU. +------------- +Logged On: 02/03/2022 06:09:38 +Created new order with ID #1000. Event ID #evt_1KP9kPGEs1yekmMi5yTRQuFK. +------------- From 6310eca790f61ea6d84f0445cef7c7060d03f852 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 3 Feb 2022 13:13:34 -0500 Subject: [PATCH 035/145] Fixed previous commit --- logs/stripe-webhook.txt | 6 ------ services/stripe-webhook.php | 1 - 2 files changed, 7 deletions(-) delete mode 100644 logs/stripe-webhook.txt diff --git a/logs/stripe-webhook.txt b/logs/stripe-webhook.txt deleted file mode 100644 index cdf28b616..000000000 --- a/logs/stripe-webhook.txt +++ /dev/null @@ -1,6 +0,0 @@ -Logged On: 02/03/2022 06:08:52 -Ignoring an invoice for $0. Probably for a new subscription just created. Event ID #evt_1KP9jjGEs1yekmMiZijeQumU. -------------- -Logged On: 02/03/2022 06:09:38 -Created new order with ID #1000. Event ID #evt_1KP9kPGEs1yekmMi5yTRQuFK. -------------- diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index fe8ba8d02..84427a4a2 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -244,7 +244,6 @@ ), ); $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); - error_log( print_r( $payment_intent->charges->data[0], true ) ); $payment_method = $payment_intent->charges->data[0]->payment_method_details; if ( empty( $payment_method ) ) { $logstr .= "Could not find payment method for invoice " . $invoice->id; From 5bd87ecf633c4392c1161af3cf6c01a7d5f9132c Mon Sep 17 00:00:00 2001 From: David Parker Date: Thu, 3 Feb 2022 13:20:26 -0500 Subject: [PATCH 036/145] Update classes/gateways/class.pmprogateway_stripe.php --- classes/gateways/class.pmprogateway_stripe.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 0af25604e..92fd6abda 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -568,19 +568,6 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    activate Stripe Tax in your Stripe dashboard. More information about Stripe Tax »', 'paid-memberships-pro' ), $allowed_stripe_tax_description_html ), 'https://stripe.com/tax', 'https://dashboard.stripe.com/settings/tax/activate' ); ?>

    - style="display: none;"> From d79de18415f81d2da2945112c924129306084297 Mon Sep 17 00:00:00 2001 From: David Parker Date: Thu, 3 Feb 2022 13:20:33 -0500 Subject: [PATCH 037/145] Update classes/gateways/class.pmprogateway_stripe.php --- classes/gateways/class.pmprogateway_stripe.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 92fd6abda..931ba7f78 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -568,7 +568,7 @@ public static function pmpro_payment_option_fields( $values, $gateway ) {

    activate Stripe Tax in your Stripe dashboard. More information about Stripe Tax »', 'paid-memberships-pro' ), $allowed_stripe_tax_description_html ), 'https://stripe.com/tax', 'https://dashboard.stripe.com/settings/tax/activate' ); ?>

    - style="display: none;"> + style="display: none;"> From c6c29d046800ec36e36f12b74c1b09de72c190a7 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Thu, 3 Feb 2022 13:45:36 -0500 Subject: [PATCH 038/145] Ensuring that Stripe Customer ID is saved before going to Stripe Checkout --- classes/gateways/class.pmprogateway_stripe.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 931ba7f78..0cf96b6ed 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -2503,6 +2503,9 @@ function pmpro_user_register_stripe_customerid( $user_id ) { } add_action( "user_register", "pmpro_user_register_stripe_customerid" ); } + } else { + // User already exists. Update their Stripe customer ID. + update_user_meta( $user_id, 'pmpro_stripe_customerid', $customer->id ); } /** From ed7808c937d0073863b40fcc83af66bec7887c4f Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Fri, 4 Feb 2022 09:08:03 -0600 Subject: [PATCH 039/145] Wisdom Tracking and Integration code along with Setting to toggle opt-in status --- adminpages/advancedsettings.php | 83 +- classes/class-pmpro-wisdom-integration.php | 469 +++++++++ classes/class-pmpro-wisdom-tracker.php | 1107 ++++++++++++++++++++ includes/init.php | 19 +- 4 files changed, 1657 insertions(+), 21 deletions(-) create mode 100644 classes/class-pmpro-wisdom-integration.php create mode 100644 classes/class-pmpro-wisdom-tracker.php diff --git a/adminpages/advancedsettings.php b/adminpages/advancedsettings.php index ea12e1e94..ce1233367 100644 --- a/adminpages/advancedsettings.php +++ b/adminpages/advancedsettings.php @@ -13,28 +13,42 @@ $msgt = __("Are you sure you want to do that? Try again.", 'paid-memberships-pro' ); unset($_REQUEST['savesettings']); } - + + // Handle full settings option. + $full_settings = pmpro_getOption( 'settings' ); + + $full_settings_defaults = [ + // Default to no tracking (this key is what Wisdom uses). + 'wisdom_opt_out' => 1, + ]; + + if ( ! $full_settings ) { + $full_settings = []; + } + + $full_settings = array_merge( $full_settings_defaults, $full_settings ); + //get/set settings if(!empty($_REQUEST['savesettings'])) { // Dashboard settings. pmpro_setOption( 'hide_toolbar' ); pmpro_setOption( 'block_dashboard' ); - + // Message settings. // These use wp_kses for better security handling. $nonmembertext = wp_kses(wp_unslash($_POST['nonmembertext']), $allowedposttags); update_option('pmpro_nonmembertext', $nonmembertext); - + $notloggedintext = wp_kses(wp_unslash($_POST['notloggedintext']), $allowedposttags); update_option('pmpro_notloggedintext', $notloggedintext); - + $rsstext = wp_kses(wp_unslash($_POST['rsstext']), $allowedposttags); - update_option('pmpro_rsstext', $rsstext); - + update_option('pmpro_rsstext', $rsstext); + // Content settings. pmpro_setOption("filterqueries"); - pmpro_setOption("showexcerpts"); + pmpro_setOption("showexcerpts"); // Checkout settings. pmpro_setOption("tospage"); @@ -42,7 +56,7 @@ pmpro_setOption("recaptcha"); pmpro_setOption("recaptcha_version"); pmpro_setOption("recaptcha_publickey"); - pmpro_setOption("recaptcha_privatekey"); + pmpro_setOption("recaptcha_privatekey"); // Communication settings. pmpro_setOption("maxnotificationpriority"); @@ -54,6 +68,13 @@ pmpro_setOption("redirecttosubscription"); pmpro_setOption("uninstall"); + // Handle updating Wisdom tracking setting. + if ( isset( $_POST['wisdom_opt_out'] ) ) { + $full_settings['wisdom_opt_out'] = (int) $_POST['wisdom_opt_out']; + } + + update_option( 'pmpro_settings', $full_settings ); + /** * Filter to add custom settings to the advanced settings page. * @param array $settings Array of settings, each setting an array with keys field_name, field_type, label, description. @@ -63,7 +84,7 @@ if(!empty($setting['field_name'])) pmpro_setOption($setting['field_name']); } - + // Assume success. $msg = true; $msgt = __("Your advanced settings have been updated.", 'paid-memberships-pro' ); @@ -72,15 +93,15 @@ // Dashboard settings. $hide_toolbar = pmpro_getOption( 'hide_toolbar' ); $block_dashboard = pmpro_getOption( 'block_dashboard' ); - + // Message settings. $nonmembertext = pmpro_getOption("nonmembertext"); $notloggedintext = pmpro_getOption("notloggedintext"); $rsstext = pmpro_getOption("rsstext"); - + // Content settings. $filterqueries = pmpro_getOption('filterqueries'); - $showexcerpts = pmpro_getOption("showexcerpts"); + $showexcerpts = pmpro_getOption("showexcerpts"); // Checkout settings. $tospage = pmpro_getOption("tospage"); @@ -130,7 +151,7 @@
    - +


    @@ -270,7 +291,7 @@ - + - + + + + + + +

    + +

    +

    + +

    +

    + + @@ -537,7 +580,7 @@ function pmpro_updateRecaptchaTRs() } pmpro_updateRecaptchaTRs(); -
    +

    diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php new file mode 100644 index 000000000..9be5ab945 --- /dev/null +++ b/classes/class-pmpro-wisdom-integration.php @@ -0,0 +1,469 @@ + true, + 'pmpro-discountcodes' => true, + 'pmpro-pagesettings' => true, + 'pmpro-paymentsettings' => true, + 'pmpro-emailsettings' => true, + 'pmpro-emailtemplates' => true, + 'pmpro-advancedsettings' => true, + ]; + + /** + * The Wisdom Tracker object. + * + * @var PMPro_Wisdom_Tracker + */ + public $wisdom_tracker; + + /** + * Set up and return the class instance. + * + * @since TBD + * + * @return self + */ + public static function instance() { + if ( ! isset( self::$instance ) ) { + self::$instance = new self; + } + + return self::$instance; + } + + /** + * Prevent new public instances by having a private constructor. + */ + private function __construct() { + // Nothing to do here. + } + + /** + * Set up the Wisdom tracker. + */ + public function setup_wisdom() { + require_once PMPRO_DIR . '/classes/class-pmpro-wisdom-tracker.php'; + + // Sync the options together. + add_action( 'add_option_wisdom_allow_tracking', [ $this, 'sync_wisdom_setting_to_plugin' ], 10, 2 ); + add_action( 'update_option_wisdom_allow_tracking', [ $this, 'sync_wisdom_setting_to_plugin' ], 10, 2 ); + add_action( 'add_option_' . $this->plugin_option, [ $this, 'sync_plugin_setting_to_wisdom' ], 10, 2 ); + add_action( 'update_option_' . $this->plugin_option, [ $this, 'sync_plugin_setting_to_wisdom' ], 10, 2 ); + + // Additional Wisdom customizations. + add_filter( 'wisdom_is_local_' . $this->plugin_slug, [ $this, 'bypass_local_tracking' ] ); + add_filter( 'wisdom_notice_text_' . $this->plugin_slug, [ $this, 'override_notice' ] ); + add_filter( 'wisdom_tracker_data_' . $this->plugin_slug, [ $this, 'add_stats' ] ); + + // Set up the tracker object. + $this->wisdom_tracker = new PMPro_Wisdom_Tracker( + PMPRO_BASE_FILE, + $this->plugin_slug, + 'https://asimov.paidmembershipspro.com', + [ + $this->plugin_option, + ], + true, + true, + 1 + ); + + // Adjust tracking hooks. + $this->remove_wisdom_notices_from_non_plugin_screens(); + } + + /** + * When the Wisdom setting for tracking is changed, sync the plugin setting to match. + * + * @since TBD + * + * @param array|null $old_value The old value of the option. + * @param array $value The new value of the option. + */ + public function sync_wisdom_setting_to_plugin( $old_value, $value ) { + $opt_out = ! empty( $value[ $this->plugin_slug ] ) ? 0 : 1; + + $settings = get_option( $this->plugin_option ); + + if ( empty( $settings ) ){ + $settings = []; + } + + $settings['wisdom_opt_out'] = $opt_out; + + update_option( $this->plugin_option, $settings ); + } + + /** + * When the plugin setting for tracking is changed, sync the Wisdom setting to match. + * + * @since TBD + * + * @param array|null $old_value The old value of the option. + * @param array $value The new value of the option. + */ + public function sync_plugin_setting_to_wisdom( $old_value, $value ) { + // Only handle opt in when needed. + if ( ! is_array( $value ) || ! isset( $value['wisdom_opt_out'] ) ) { + return; + } + + // Only update when changing the value. + if ( is_array( $old_value ) && isset( $old_value['wisdom_opt_out'] ) && (int) $old_value['wisdom_opt_out'] === (int) $value['wisdom_opt_out'] ) { + return; + } + + $opt_out = filter_var( $value['wisdom_opt_out'], FILTER_VALIDATE_BOOLEAN ); + + // Update opt-in. + $this->wisdom_tracker->set_is_tracking_allowed( ! $opt_out, $this->plugin_slug ); + $this->wisdom_tracker->set_can_collect_email( ! $opt_out, $this->plugin_slug ); + } + + /** + * Bypass local tracking for additional local URLs. + * + * @since TBD + * + * @param bool $is_local Whether the site is recognized as a local site. + * + * @return bool Whether the site is recognized as a local site. + */ + public function bypass_local_tracking( $is_local = false ) { + if ( true === $is_local || 'production' !== wp_get_environment_type() ) { + return $is_local; + } + + $url = network_site_url( '/' ); + + $url = strtolower( trim( $url ) ); + $url_parts = parse_url( $url ); + $host = ! empty( $url_parts['host'] ) ? $url_parts['host'] : false; + + if ( empty( $host ) ) { + return $is_local; + } + + if ( 'localhost' === $host ) { + return true; + } + + if ( false !== ip2long( $host ) && ! filter_var( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) { + return true; + } + + $tlds_to_check = [ + '.local', + '.test', + ]; + + foreach ( $tlds_to_check as $tld ) { + $minus_tld = strlen( $host ) - strlen( $tld ); + + if ( $minus_tld === strpos( $host, $tld ) ) { + return true; + } + } + + return $is_local; + } + + /** + * Override the notice for the Wisdom Tracker opt-in. + * + * @since TBD + * + * @return string + */ + public function override_notice() { + return __( 'Thank you for installing our plugin. We\'d like your permission to track its usage on your site. We won\'t record any sensitive data, only information regarding the WordPress environment and plugin settings. We will only use this information help us make improvements to the plugin and provide better support when you reach out. Tracking is completely optional.', 'paid-memberships-pro' ); + } + + /** + * Remove Wisdom notices from non-plugin screens. + * + * @since TBD + */ + public function remove_wisdom_notices_from_non_plugin_screens() { + $settings_page = ! empty( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : ''; + + // Check if we are on a settings page using isset() which is faster than in_array(). + if ( isset( $this->plugin_pages[ $settings_page ] ) ) { + return; + } + + // Remove the notices from the non-plugin settings pages. + remove_action( 'admin_notices', [ $this->wisdom_tracker, 'optin_notice' ] ); + remove_action( 'admin_notices', [ $this->wisdom_tracker, 'marketing_notice' ] ); + } + + /** + * Add custom stats for the plugin to the data being tracked. + * + * @since TBD + * + * @param array $stats The data to be sent to the Wisdom plugin site. + * + * @return array The data to be sent to the Wisdom plugin site. + */ + public function add_stats( $stats ) { + global $wpdb; + + // License info. + $license_check = get_option( 'pmpro_license_check', 'No Value' ); + + $license_plan = 'No Value'; + + if ( is_array( $license_check ) && isset( $license_check['license'] ) ) { + $license_plan = $license_check['license']; + } + + $stats['plugin_options_fields']['pmpro_license_key'] = get_option( 'pmpro_license_key', 'No Value' ); + $stats['plugin_options_fields']['pmpro_license_plan'] = $license_plan; + + // Gateway info. + $stats['plugin_options_fields'] = array_merge( $stats['plugin_options_fields'], $this->get_gateway_info() ); + + // Levels info. + $stats['plugin_options_fields'] = array_merge( $stats['plugin_options_fields'], $this->get_levels_info() ); + + // Members info. + $stats['plugin_options_fields']['pmpro_members_count'] = pmpro_getSignups( 'all time' ); + $stats['plugin_options_fields']['pmpro_members_cancelled_count'] = pmpro_getCancellations( 'all time' ); + + // Orders info. + $stats['plugin_options_fields']['pmpro_orders_count'] = $wpdb->get_var( "SELECT COUNT(*) FROM `{$wpdb->pmpro_membership_orders}`" ); + + // Features. + $stats['plugin_options_fields']['pmpro_filterqueries'] = get_option( 'pmpro_filterqueries', 'No Value' ); + $stats['plugin_options_fields']['pmpro_showexcerpts'] = get_option( 'pmpro_showexcerpts', 'No Value' ); + $stats['plugin_options_fields']['pmpro_spamprotection'] = get_option( 'pmpro_spamprotection', 'No Value' ); + + // Add Ons. + $addons_info = $this->get_addons_info(); + + $stats['plugin_options_fields']['addons_active'] = $addons_info['addons_active']; + $stats['plugin_options_fields']['addons_inactive'] = $addons_info['addons_inactive']; + $stats['plugin_options_fields']['addons_update_available'] = $addons_info['addons_update_available']; + + // Flatten the arrays. + foreach ( $stats['plugin_options_fields'] as $option => $value ) { + if ( is_object( $value ) || is_array( $value ) ) { + $value = maybe_serialize( $value ); + } + + $stats['plugin_options_fields'][ $option ] = $value; + } + + return $stats; + } + + /** + * Get the gateway information to track. + * + * @since TBD + * + * @return array The gateway information to track. + */ + public function get_gateway_info() { + $stats = []; + + // Gateway info. + $stats['pmpro_gateway'] = get_option( 'pmpro_gateway', 'No Value' ); + $stats['pmpro_gateway_environment'] = get_option( 'pmpro_gateway_environment', 'No Value' ); + $stats['pmpro_currency'] = get_option( 'pmpro_currency', 'No Value' ); + + // Get Stripe gateway info for other stats below. + $stripe_using_legacy_keys = PMProGateway_stripe::using_legacy_keys(); + $stripe_has_connect_credentials = PMProGateway_stripe::has_connect_credentials( 'live' ) || PMProGateway_stripe::has_connect_credentials( 'sandbox' ); + + // Append the Stripe gateway qualifiers. + if ( 'stripe' === $stats['pmpro_gateway'] ) { + // Add Legacy Keys text if using Legacy Keys. + if ( $stripe_using_legacy_keys ) { + $stats['pmpro_gateway'] .= ' (' . __( 'Legacy Keys', 'paid-memberships-pro' ) . ')'; + } + + // Add Stripe Connect text if using Stripe Connect. + if ( $stripe_has_connect_credentials ) { + $stats['pmpro_gateway'] .= ' (' . __( 'Stripe Connect', 'paid-memberships-pro' ) . ')'; + } + + $stats['pmpro_gateway'] = strtolower( $stats['pmpro_gateway'] ); + } + + // Detect any gateway settings. + $gateway_settings_detected = [ + 'authorizenet' => get_option( 'pmpro_loginname' ), + 'braintree' => get_option( 'pmpro_braintree_merchantid' ), + 'cybersource' => get_option( 'pmpro_cybersource_merchantid' ), + 'payflowpro' => get_option( 'pmpro_payflow_user' ), + 'paypal' => get_option( 'pmpro_apiusername' ), + 'paypalexpress' => get_option( 'paypalexpress_skip_confirmation' ), + 'paypalstandard' => get_option( 'gateway_email' ), + 'stripe' => $stripe_using_legacy_keys || $stripe_has_connect_credentials, + 'stripe_sandbox' => get_option( 'sandbox_stripe_connect_user_id' ), + 'twocheckout' => get_option( 'twocheckout_accountnumber' ), + ]; + + // Remove any gateway settings that are not set or are empty. + $gateway_settings_detected = array_map( static function( $value ) { + return false !== $value && '' !== $value; + }, $gateway_settings_detected ); + $gateway_settings_detected = array_filter( $gateway_settings_detected ); + + // Fill in the gateway count/detected info. + $stats['pmpro_gateways_count'] = count( $gateway_settings_detected ); + $stats['pmpro_gateways_detected'] = implode( ', ', array_keys( $gateway_settings_detected ) ); + + return $stats; + } + + /** + * Get the level information for all levels to track. + * + * @since TBD + * + * @return array The level information for all levels to track. + */ + public function get_levels_info() { + $stats = []; + + $levels = pmpro_getAllLevels( true ); + + $stats['pmpro_levels_count'] = count( $levels ); + + $range_groups = [ + '0' => [ + 'range' => [ 0, 0 ], + 'count' => 0, + ], + '0.01_to_10' => [ + 'range' => [ 0.01, 10 ], + 'count' => 0, + ], + '10.01_to_25' => [ + 'range' => [ 10.01, 25 ], + 'count' => 0, + ], + ]; + + $billing_amount_prices = wp_list_pluck( $levels, 'billing_amount' ); + $billing_amount_prices = array_unique( $billing_amount_prices ); + + foreach ( $billing_amount_prices as $billing_amount_price ) { + foreach ( $range_groups as $key => $group ) { + // Zero price range handling. + if ( 0 === $group['range'][0] && 0 === $group['range'][1] && 0 === $billing_amount_price ) { + $range_groups[ $key ]['count']++; + + break; + } + + // Check if price is within the range group constraints. + if ( $group['range'][0] <= $billing_amount_price && $billing_amount_price <= $group['range'][1] ) { + $range_groups[ $key ]['count'] ++; + + break; + } + } + } + + foreach ( $range_groups as $key => $group ) { + $stats['pmpro_levels_price_ranges_' . $key ] = $group['count']; + } + + return $stats; + } + + /** + * Get the list of Add Ons categorized by active, inactive, and update available. + * + * @since TBD + * + * @return array The list of Add Ons categorized by active, inactive, and update available. + */ + public function get_addons_info() { + // Build the list of Add Ons data to track. + $addons = pmpro_getAddons(); + $plugin_info = get_site_transient( 'update_plugins' ); + + // Split Add Ons into groups for filtering + $addons_active = []; + $addons_inactive = []; + $addons_update_available = []; + + // Build array of Visible, Hidden, Active, Inactive, Installed, and Not Installed Add Ons. + foreach ( $addons as $addon ) { + $plugin_file = $addon['Slug'] . '/' . $addon['Slug'] . '.php'; + $plugin_file_abs = WP_PLUGIN_DIR . '/' . $plugin_file; + $plugin_data = get_plugin_data( $plugin_file_abs ); + + // Plugin is not on the site. + if ( empty( $plugin_data['Version'] ) ) { + continue; + } + + // Build Active and Inactive arrays - exclude hidden Add Ons that are not installed. + if ( is_plugin_active( $plugin_file ) ) { + $addons_active[ $addon['Slug'] ] = $plugin_data['Version']; + } else { + $addons_inactive[ $addon['Slug'] ] = $plugin_data['Version']; + } + + // Build array of Add Ons that have an update available. + if ( isset( $plugin_info->response[ $plugin_file ] ) ) { + $addons_update_available[] = $addon; + } + } + + return [ + 'addons_active' => $addons_active, + 'addons_inactive' => $addons_inactive, + 'addons_update_available' => $addons_update_available, + ]; + } + +} diff --git a/classes/class-pmpro-wisdom-tracker.php b/classes/class-pmpro-wisdom-tracker.php new file mode 100644 index 000000000..85590c9fb --- /dev/null +++ b/classes/class-pmpro-wisdom-tracker.php @@ -0,0 +1,1107 @@ +plugin_file = $_plugin_file; + $this->home_url = trailingslashit( $_home_url ); + + // If the filename is 'functions' then we're tracking a theme + if ( basename( $this->plugin_file, '.php' ) != 'functions' ) { + $this->plugin_name = basename( $this->plugin_file, '.php' ); + + // PMPRO MODIFICATION. + if ( ! empty( $_plugin_slug ) ) { + $this->plugin_name = $_plugin_slug; + } + } else { + $this->what_am_i = 'theme'; + $theme = wp_get_theme(); + if ( $theme->Name ) { + $this->plugin_name = sanitize_text_field( $theme->Name ); + } + } + + $this->options = $_options; + $this->require_optin = $_require_optin; + $this->include_goodbye_form = $_include_goodbye_form; + $this->marketing = $_marketing; + + // Only use this on switching theme + $this->theme_allows_tracking = get_theme_mod( 'wisdom-allow-tracking', 0 ); + + // Schedule / deschedule tracking when activated / deactivated + if ( $this->what_am_i == 'theme' ) { + // Need to think about scheduling for sites that have already activated the theme + add_action( 'after_switch_theme', [ $this, 'schedule_tracking' ] ); + add_action( 'switch_theme', [ $this, 'deactivate_this_plugin' ] ); + } else { + register_activation_hook( $this->plugin_file, [ $this, 'schedule_tracking' ] ); + register_deactivation_hook( $this->plugin_file, [ $this, 'deactivate_this_plugin' ] ); + } + + // Get it going + $this->init(); + } + + public function init() { + // Check marketing + if ( $this->marketing == 3 ) { + $this->set_can_collect_email( true, $this->plugin_name ); + } + + // Check whether opt-in is required + // If not, then tracking is allowed + if ( ! $this->require_optin ) { + $this->set_can_collect_email( true, $this->plugin_name ); + $this->set_is_tracking_allowed( true ); + $this->update_block_notice(); + $this->do_tracking(); + } + + // Hook our do_tracking function to the weekly action + add_filter( 'cron_schedules', [ $this, 'schedule_weekly_event' ] ); + // It's called weekly, but in fact it could be daily, weekly or monthly + add_action( 'put_do_weekly_action', [ $this, 'do_tracking' ] ); + + // Use this action for local testing + // add_action( 'admin_init', array( $this, 'do_tracking' ) ); + + // Display the admin notice on activation + add_action( 'admin_init', [ $this, 'set_notification_time' ] ); + add_action( 'admin_notices', [ $this, 'optin_notice' ] ); + add_action( 'admin_notices', [ $this, 'marketing_notice' ] ); + + // Deactivation + add_filter( 'plugin_action_links_' . plugin_basename( $this->plugin_file ), [ $this, 'filter_action_links' ] ); + add_action( 'admin_footer-plugins.php', [ $this, 'goodbye_ajax' ] ); + add_action( 'wp_ajax_goodbye_form', [ $this, 'goodbye_form_callback' ] ); + } + + /** + * When the plugin is activated + * Create scheduled event + * And check if tracking is enabled - perhaps the plugin has been reactivated + * + * @since 1.0.0 + */ + public function schedule_tracking() { + if ( ! wp_next_scheduled( 'put_do_weekly_action' ) ) { + $schedule = $this->get_schedule(); + wp_schedule_event( time(), $schedule, 'put_do_weekly_action' ); + } + $this->do_tracking( true ); + } + + /** + * Create weekly schedule + * + * @since 1.2.3 + */ + public function schedule_weekly_event( $schedules ) { + $schedules['weekly'] = [ + 'interval' => 604800, + 'display' => __( 'Once Weekly' ), + ]; + $schedules['monthly'] = [ + 'interval' => 2635200, + 'display' => __( 'Once Monthly' ), + ]; + + return $schedules; + } + + /** + * Get how frequently data is tracked back + * + * @since 1.2.3 + */ + public function get_schedule() { + // Could be daily, weekly or monthly + $schedule = apply_filters( 'wisdom_filter_schedule_' . $this->plugin_name, 'monthly' ); + + return $schedule; + } + + /** + * This is our function to get everything going + * Check that user has opted in + * Collect data + * Then send it back + * + * @since 1.0.0 + * + * @param $force Force tracking if it's not time + */ + public function do_tracking( $force = false ) { + // If the home site hasn't been defined, we just drop out. Nothing much we can do. + if ( ! $this->home_url ) { + return; + } + + // Check to see if the user has opted in to tracking + $allow_tracking = $this->get_is_tracking_allowed(); + if ( ! $allow_tracking ) { + return; + } + + // Check to see if it's time to track + $track_time = $this->get_is_time_to_track(); + if ( ! $track_time && ! $force ) { + return; + } + + $this->set_admin_email(); + + // Get our data + $body = $this->get_data(); + + // Send the data + $this->send_data( $body ); + } + + /** + * We hook this to admin_init when the user accepts tracking + * Ensures the email address is available + * + * @since 1.2.1 + */ + public function force_tracking() { + $this->do_tracking( true ); // Run this straightaway + } + + /** + * Send the data to the home site + * + * @since 1.0.0 + */ + public function send_data( $body ) { + $request = wp_remote_post( esc_url( $this->home_url . '?usage_tracker=hello' ), [ + 'method' => 'POST', + 'timeout' => 20, + 'redirection' => 5, + 'httpversion' => '1.1', + 'blocking' => true, + 'body' => $body, + 'user-agent' => 'PUT/1.0.0; ' . home_url(), + ] ); + + $this->set_track_time(); + + if ( is_wp_error( $request ) ) { + return $request; + } + } + + /** + * Here we collect most of the data + * + * @since 1.0.0 + */ + public function get_data() { + // Use this to pass error messages back if necessary + $body['message'] = ''; + + // Use this array to send data back + $body = [ + 'plugin_slug' => sanitize_text_field( $this->plugin_name ), + 'url' => home_url(), + 'site_name' => get_bloginfo( 'name' ), + 'site_version' => get_bloginfo( 'version' ), + 'site_language' => get_bloginfo( 'language' ), + 'charset' => get_bloginfo( 'charset' ), + 'wisdom_version' => $this->wisdom_version, + 'php_version' => phpversion(), + 'multisite' => is_multisite(), + 'file_location' => __FILE__, + 'product_type' => esc_html( $this->what_am_i ), + ]; + + // Collect the email if the correct option has been set + if ( $this->get_can_collect_email() ) { + $body['email'] = $this->get_admin_email(); + } + $body['marketing_method'] = $this->marketing; + + $body['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : ''; + + // Extra PHP fields + $body['memory_limit'] = ini_get( 'memory_limit' ); + $body['upload_max_size'] = ini_get( 'upload_max_size' ); + $body['post_max_size'] = ini_get( 'post_max_size' ); + $body['upload_max_filesize'] = ini_get( 'upload_max_filesize' ); + $body['max_execution_time'] = ini_get( 'max_execution_time' ); + $body['max_input_time'] = ini_get( 'max_input_time' ); + + // Retrieve current plugin information + if ( ! function_exists( 'get_plugins' ) ) { + include ABSPATH . '/wp-admin/includes/plugin.php'; + } + + $plugins = array_keys( get_plugins() ); + $active_plugins = get_option( 'active_plugins', [] ); + + foreach ( $plugins as $key => $plugin ) { + if ( in_array( $plugin, $active_plugins, true ) ) { + // Remove active plugins from list so we can show active and inactive separately + unset( $plugins[ $key ] ); + } + } + + $body['active_plugins'] = $active_plugins; + $body['inactive_plugins'] = $plugins; + + // Check text direction + $body['text_direction'] = 'LTR'; + if ( function_exists( 'is_rtl' ) ) { + if ( is_rtl() ) { + $body['text_direction'] = 'RTL'; + } + } else { + $body['text_direction'] = 'not set'; + } + + /** + * Get our plugin data + * Currently we grab plugin name and version + * Or, return a message if the plugin data is not available + * + * @since 1.0.0 + */ + $plugin = $this->plugin_data(); + $body['status'] = 'Active'; // Never translated + if ( empty( $plugin ) ) { + // We can't find the plugin data + // Send a message back to our home site + $body['message'] .= __( 'We can\'t detect any product information. This is most probably because you have not included the code snippet.', 'paid-memberships-pro' ); + $body['status'] = 'Data not found'; // Never translated + } else { + if ( isset( $plugin['Name'] ) ) { + $body['plugin'] = sanitize_text_field( $plugin['Name'] ); + } + if ( isset( $plugin['Version'] ) ) { + $body['version'] = sanitize_text_field( $plugin['Version'] ); + } + } + + /** + * Get our plugin options + * + * @since 1.0.0 + */ + $options = $this->options; + $plugin_options = []; + if ( ! empty( $options ) && is_array( $options ) ) { + foreach ( $options as $option ) { + $fields = get_option( $option ); + // Check for permission to send this option + if ( isset( $fields['wisdom_registered_setting'] ) ) { + foreach ( $fields as $key => $value ) { + $plugin_options[ $key ] = $value; + } + } + } + } + $body['plugin_options'] = $this->options; // Returns array + $body['plugin_options_fields'] = $plugin_options; // Returns object + + /** + * Get our theme data + * Currently we grab theme name and version + * + * @since 1.0.0 + */ + $theme = wp_get_theme(); + if ( $theme->Name ) { + $body['theme'] = sanitize_text_field( $theme->Name ); + } + if ( $theme->Version ) { + $body['theme_version'] = sanitize_text_field( $theme->Version ); + } + if ( $theme->Template ) { + $body['theme_parent'] = sanitize_text_field( $theme->Template ); + } + + // PMPRO MODIFICATION. + /** + * Allow filtering the data to be sent to the Wisdom plugin site. + * + * @since TBD + * + * @param array $body The data to be sent to the Wisdom plugin site. + */ + $body = apply_filters( "wisdom_tracker_data_{$this->plugin_name}", $body ); + + // Return the data + return $body; + } + + /** + * Return plugin data + * + * @since 1.0.0 + */ + public function plugin_data() { + // Being cautious here + if ( ! function_exists( 'get_plugin_data' ) ) { + include ABSPATH . '/wp-admin/includes/plugin.php'; + } + // Retrieve current plugin information + $plugin = get_plugin_data( $this->plugin_file ); + + return $plugin; + } + + /** + * Deactivating plugin + * + * @since 1.0.0 + */ + public function deactivate_this_plugin() { + // Check to see if the user has opted in to tracking + if ( $this->what_am_i == 'theme' ) { + $allow_tracking = $this->theme_allows_tracking; + } else { + $allow_tracking = $this->get_is_tracking_allowed(); + } + + if ( ! $allow_tracking ) { + return; + } + + $body = $this->get_data(); + $body['status'] = 'Deactivated'; // Never translated + $body['deactivated_date'] = time(); + + // Add deactivation form data + if ( false !== get_option( 'wisdom_deactivation_reason_' . $this->plugin_name ) ) { + $body['deactivation_reason'] = get_option( 'wisdom_deactivation_reason_' . $this->plugin_name ); + } + if ( false !== get_option( 'wisdom_deactivation_details_' . $this->plugin_name ) ) { + $body['deactivation_details'] = get_option( 'wisdom_deactivation_details_' . $this->plugin_name ); + } + + $this->send_data( $body ); + // Clear scheduled update + wp_clear_scheduled_hook( 'put_do_weekly_action' ); + + // Clear the wisdom_last_track_time value for this plugin + // @since 1.2.2 + $track_time = get_option( 'wisdom_last_track_time' ); + if ( isset( $track_time[ $this->plugin_name ] ) ) { + unset( $track_time[ $this->plugin_name ] ); + } + update_option( 'wisdom_last_track_time', $track_time ); + } + + /** + * Is tracking allowed? + * + * @since 1.0.0 + */ + public function get_is_tracking_allowed() { + // First, check if the user has changed their mind and opted out of tracking + if ( $this->has_user_opted_out() ) { + $this->set_is_tracking_allowed( false, $this->plugin_name ); + + // PMPRO MODIFICATION. + $this->set_can_collect_email( false, $this->plugin_name ); + + return false; + } + + if ( $this->what_am_i == 'theme' ) { + $mod = get_theme_mod( 'wisdom-allow-tracking', 0 ); + if ( $mod ) { + return true; + } + } else { + // The wisdom_allow_tracking option is an array of plugins that are being tracked + $allow_tracking = get_option( 'wisdom_allow_tracking' ); + // If this plugin is in the array, then tracking is allowed + if ( isset( $allow_tracking[ $this->plugin_name ] ) ) { + return true; + } + } + + return false; + } + + /** + * Set if tracking is allowed + * Option is an array of all plugins with tracking permitted + * More than one plugin may be using the tracker + * + * @since 1.0.0 + * + * @param $is_allowed Boolean true if tracking is allowed, false if not + */ + public function set_is_tracking_allowed( $is_allowed, $plugin = null ) { + if ( empty( $plugin ) ) { + $plugin = $this->plugin_name; + } + + // The wisdom_allow_tracking option is an array of plugins that are being tracked + $allow_tracking = get_option( 'wisdom_allow_tracking' ); + + // If the user has decided to opt out + if ( $this->has_user_opted_out() ) { + if ( $this->what_am_i == 'theme' ) { + set_theme_mod( 'wisdom-allow-tracking', 0 ); + } else { + if ( isset( $allow_tracking[ $plugin ] ) ) { + unset( $allow_tracking[ $plugin ] ); + } + } + } elseif ( $is_allowed || ! $this->require_optin ) { + // If the user has agreed to allow tracking or if opt-in is not required + + if ( $this->what_am_i == 'theme' ) { + set_theme_mod( 'wisdom-allow-tracking', 1 ); + } else { + if ( empty( $allow_tracking ) || ! is_array( $allow_tracking ) ) { + // If nothing exists in the option yet, start a new array with the plugin name + $allow_tracking = [ $plugin => $plugin ]; + } else { + // Else add the plugin name to the array + $allow_tracking[ $plugin ] = $plugin; + } + } + } else { + if ( $this->what_am_i == 'theme' ) { + set_theme_mod( 'wisdom-allow-tracking', 0 ); + } else { + if ( isset( $allow_tracking[ $plugin ] ) ) { + unset( $allow_tracking[ $plugin ] ); + } + } + } + + update_option( 'wisdom_allow_tracking', $allow_tracking ); + } + + /** + * Has the user opted out of allowing tracking? + * Note that themes are opt in / plugins are opt out + * + * @since 1.1.0 + * @return Boolean + */ + public function has_user_opted_out() { + // Different opt-out methods for plugins and themes + if ( $this->what_am_i == 'theme' ) { + // Look for the theme mod + $mod = get_theme_mod( 'wisdom-allow-tracking', 0 ); + if ( false === $mod ) { + // If the theme mod is not set, then return true - the user has opted out + return true; + } + } else { + // Iterate through the options that are being tracked looking for wisdom_opt_out setting + if ( ! empty( $this->options ) ) { + foreach ( $this->options as $option_name ) { + // Check each option + $options = get_option( $option_name ); + // If we find the setting, return true + if ( ! empty( $options['wisdom_opt_out'] ) ) { + return true; + } + } + } + } + + return false; + } + + /** + * Check if it's time to track + * + * @since 1.1.1 + */ + public function get_is_time_to_track() { + // Let's see if we're due to track this plugin yet + $track_times = get_option( 'wisdom_last_track_time', [] ); + if ( ! isset( $track_times[ $this->plugin_name ] ) ) { + // If we haven't set a time for this plugin yet, then we must track it + return true; + } else { + // If the time is set, let's get our schedule and check if it's time to track + $schedule = $this->get_schedule(); + if ( $schedule == 'daily' ) { + $period = 'day'; + } elseif ( $schedule == 'weekly' ) { + $period = 'week'; + } else { + $period = 'month'; + } + if ( $track_times[ $this->plugin_name ] < strtotime( '-1 ' . $period ) ) { + return true; + } + } + + return false; + } + + /** + * Record the time we send tracking data + * + * @since 1.1.1 + */ + public function set_track_time() { + // We've tracked, so record the time + $track_times = get_option( 'wisdom_last_track_time', [] ); + // Set different times according to plugin, in case we are tracking multiple plugins + $track_times[ $this->plugin_name ] = time(); + update_option( 'wisdom_last_track_time', $track_times ); + } + + /** + * Set the time when we can display the opt-in notification + * Will display now unless filtered + * + * @since 1.2.4 + */ + public function set_notification_time() { + $notification_times = get_option( 'wisdom_notification_times', [] ); + // Set different times according to plugin, in case we are tracking multiple plugins + if ( ! isset( $notification_times[ $this->plugin_name ] ) ) { + $delay_notification = apply_filters( 'wisdom_delay_notification_' . $this->plugin_name, 0 ); + // We can delay the notification time + $notification_time = time() + absint( $delay_notification ); + $notification_times[ $this->plugin_name ] = $notification_time; + update_option( 'wisdom_notification_times', $notification_times ); + } + } + + /** + * Get whether it's time to display the notification + * + * @since 1.2.4 + * @return Boolean + */ + public function get_is_notification_time() { + $notification_times = get_option( 'wisdom_notification_times', [] ); + $time = time(); + // Set different times according to plugin, in case we are tracking multiple plugins + if ( isset( $notification_times[ $this->plugin_name ] ) ) { + $notification_time = $notification_times[ $this->plugin_name ]; + if ( $time >= $notification_time ) { + return true; + } + } + + return false; + } + + /** + * Set if we should block the opt-in notice for this plugin + * Option is an array of all plugins that have received a response from the user + * + * @since 1.0.0 + */ + public function update_block_notice( $plugin = null ) { + if ( empty( $plugin ) ) { + $plugin = $this->plugin_name; + } + $block_notice = get_option( 'wisdom_block_notice' ); + if ( empty( $block_notice ) || ! is_array( $block_notice ) ) { + // If nothing exists in the option yet, start a new array with the plugin name + $block_notice = [ $plugin => $plugin ]; + } else { + // Else add the plugin name to the array + $block_notice[ $plugin ] = $plugin; + } + update_option( 'wisdom_block_notice', $block_notice ); + } + + /** + * Can we collect the email address? + * + * @since 1.0.0 + */ + public function get_can_collect_email() { + // The wisdom_collect_email option is an array of plugins that are being tracked + $collect_email = get_option( 'wisdom_collect_email' ); + // If this plugin is in the array, then we can collect the email address + if ( isset( $collect_email[ $this->plugin_name ] ) ) { + return true; + } + + return false; + } + + /** + * Set if user has allowed us to collect their email address + * Option is an array of all plugins with email collection permitted + * More than one plugin may be using the tracker + * + * @since 1.0.0 + * + * @param $can_collect Boolean true if collection is allowed, false if not + */ + public function set_can_collect_email( $can_collect, $plugin = null ) { + if ( empty( $plugin ) ) { + $plugin = $this->plugin_name; + } + // The wisdom_collect_email option is an array of plugins that are being tracked + $collect_email = get_option( 'wisdom_collect_email' ); + // If the user has agreed to allow tracking or if opt-in is not required + if ( $can_collect ) { + if ( empty( $collect_email ) || ! is_array( $collect_email ) ) { + // If nothing exists in the option yet, start a new array with the plugin name + $collect_email = [ $plugin => $plugin ]; + } else { + // Else add the plugin name to the array + $collect_email[ $plugin ] = $plugin; + } + } else { + if ( isset( $collect_email[ $plugin ] ) ) { + unset( $collect_email[ $plugin ] ); + } + } + update_option( 'wisdom_collect_email', $collect_email ); + } + + /** + * Get the correct email address to use + * + * @since 1.1.2 + * @return Email address + */ + public function get_admin_email() { + // The wisdom_collect_email option is an array of plugins that are being tracked + $email = get_option( 'wisdom_admin_emails' ); + // If this plugin is in the array, then we can collect the email address + if ( isset( $email[ $this->plugin_name ] ) ) { + return $email[ $this->plugin_name ]; + } + + return false; + } + + /** + * Set the correct email address to use + * There might be more than one admin on the site + * So we only use the first admin's email address + * + * @since 1.1.2 + * + * @param $plugin Plugin name to set email address for + * @param $email Email address to set + */ + public function set_admin_email( $email = null, $plugin = null ) { + if ( empty( $plugin ) ) { + $plugin = $this->plugin_name; + } + // If no email address passed, try to get the current user's email + if ( empty( $email ) ) { + // Have to check that current user object is available + if ( function_exists( 'wp_get_current_user' ) ) { + $current_user = wp_get_current_user(); + $email = $current_user->user_email; + } + } + // The wisdom_admin_emails option is an array of admin email addresses + $admin_emails = get_option( 'wisdom_admin_emails' ); + if ( empty( $admin_emails ) || ! is_array( $admin_emails ) ) { + // If nothing exists in the option yet, start a new array with the plugin name + $admin_emails = [ $plugin => sanitize_email( $email ) ]; + } elseif ( empty( $admin_emails[ $plugin ] ) ) { + // Else add the email address to the array, if not already set + $admin_emails[ $plugin ] = sanitize_email( $email ); + } + update_option( 'wisdom_admin_emails', $admin_emails ); + } + + /** + * Display the admin notice to users to allow them to opt in + * + * @since 1.0.0 + */ + public function optin_notice() { + // Check for plugin args + if ( isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) { + $plugin = sanitize_text_field( $_GET['plugin'] ); + $action = sanitize_text_field( $_GET['plugin_action'] ); + if ( $action == 'yes' ) { + $this->set_is_tracking_allowed( true, $plugin ); + // Run this straightaway + add_action( 'admin_init', [ $this, 'force_tracking' ] ); + } else { + $this->set_is_tracking_allowed( false, $plugin ); + } + $this->update_block_notice( $plugin ); + } + + // Is it time to display the notification? + $is_time = $this->get_is_notification_time(); + if ( ! $is_time ) { + return false; + } + + // Check whether to block the notice, e.g. because we're in a local environment + // wisdom_block_notice works the same as wisdom_allow_tracking, an array of plugin names + $block_notice = get_option( 'wisdom_block_notice' ); + + if ( isset( $block_notice[ $this->plugin_name ] ) ) { + return; + } + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + // @credit EDD + // Don't bother asking user to opt in if they're in local dev + $is_local = false; + if ( stristr( network_site_url( '/' ), '.dev' ) !== false || stristr( network_site_url( '/' ), 'localhost' ) !== false || stristr( network_site_url( '/' ), ':8888' ) !== false ) { + $is_local = true; + } + + // PMPRO MODIFICATION + if ( ! $is_local && stristr( network_site_url( '/' ), '.local' ) !== false ) { + //$is_local = true; + } + + $is_local = apply_filters( 'wisdom_is_local_' . $this->plugin_name, $is_local ); + if ( $is_local ) { + $this->update_block_notice(); + + // PMPRO MODIFICATION. + if ( $this->marketing ) { + $this->set_can_collect_email( false ); + } + } else { + // Display the notice requesting permission to track + // Retrieve current plugin information + $plugin = $this->plugin_data(); + $plugin_name = $plugin['Name']; + + // Args to add to query if user opts in to tracking + $yes_args = [ + 'plugin' => $this->plugin_name, + 'plugin_action' => 'yes', + ]; + + // Decide how to request permission to collect email addresses + if ( $this->marketing == 1 ) { + // Option 1 combines permissions to track and collect email + $yes_args['marketing_optin'] = 'yes'; + } elseif ( $this->marketing == 2 ) { + // Option 2 enables a second notice that fires after the user opts in to tracking + $yes_args['marketing'] = 'yes'; + } + $url_yes = add_query_arg( $yes_args ); + $url_no = add_query_arg( [ + 'plugin' => $this->plugin_name, + 'plugin_action' => 'no', + ] ); + + // Decide on notice text + if ( $this->marketing != 1 ) { + // Standard notice text + $notice_text = sprintf( __( 'Thank you for installing our %1$s. We would like to track its usage on your site. We don\'t record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional.', 'paid-memberships-pro' ), $this->what_am_i ); + } else { + // If we have option 1 for marketing, we include reference to sending product information here + $notice_text = sprintf( __( 'Thank you for installing our %1$s. We\'d like your permission to track its usage on your site and subscribe you to our newsletter. We won\'t record any sensitive data, only information regarding the WordPress environment and %1$s settings, which we will use to help us make improvements to the %1$s. Tracking is completely optional.', 'paid-memberships-pro' ), $this->what_am_i ); + } + // And we allow you to filter the text anyway + $notice_text = apply_filters( 'wisdom_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?> + +
    +

    ' . esc_html( $plugin_name ) . ''; ?>

    +

    +

    + + +

    +
    + set_can_collect_email( sanitize_text_field( $_GET['marketing_optin'] ), $this->plugin_name ); + // Do tracking + $this->do_tracking( true ); + } elseif ( isset( $_GET['marketing'] ) && $_GET['marketing'] == 'yes' ) { + // Display the notice requesting permission to collect email address + // Retrieve current plugin information + $plugin = $this->plugin_data(); + $plugin_name = $plugin['Name']; + + $url_yes = add_query_arg( [ + 'plugin' => $this->plugin_name, + 'marketing_optin' => 'yes', + ] ); + $url_no = add_query_arg( [ + 'plugin' => $this->plugin_name, + 'marketing_optin' => 'no', + ] ); + + $marketing_text = sprintf( __( 'Thank you for opting in to tracking. Would you like to receive occasional news about this %s, including details of new features and special offers?', 'paid-memberships-pro' ), $this->what_am_i ); + $marketing_text = apply_filters( 'wisdom_marketing_text_' . esc_attr( $this->plugin_name ), $marketing_text ); ?> + +
    +

    ' . esc_html( $plugin_name ) . ''; ?>

    +

    +

    + + +

    +
    + get_is_tracking_allowed() ) { + return $links; + } + if ( isset( $links['deactivate'] ) && $this->include_goodbye_form ) { + $deactivation_link = $links['deactivate']; + // Insert an onClick action to allow form before deactivating + $deactivation_link = str_replace( 'form_default_text(); + + return apply_filters( 'wisdom_form_text_' . esc_attr( $this->plugin_name ), $form ); + } + + /** + * Form text strings + * These can be filtered + * + * @since 1.0.0 + */ + public function goodbye_ajax() { + // Get our strings for the form + $form = $this->form_filterable_text(); + if ( ! isset( $form['heading'] ) || ! isset( $form['body'] ) || ! isset( $form['options'] ) || ! is_array( $form['options'] ) || ! isset( $form['details'] ) ) { + // If the form hasn't been filtered correctly, we revert to the default form + $form = $this->form_default_text(); + } + // Build the HTML to go in the form + $html = '
    ' . esc_html( $form['heading'] ) . '
    '; + $html .= '

    ' . esc_html( $form['body'] ) . '

    '; + if ( is_array( $form['options'] ) ) { + $html .= '

    '; + foreach ( $form['options'] as $option ) { + $html .= '
    '; + } + $html .= '

    '; + $html .= '
    '; + } + $html .= '
    '; + $html .= '

    ' . __( 'Submitting form', 'paid-memberships-pro' ) . '

    '; + ?> +
    + + + plugin_name, $values ); + } + if ( isset( $_POST['details'] ) ) { + $details = sanitize_text_field( $_POST['details'] ); + update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details ); + } + $this->do_tracking(); // Run this straightaway + echo 'success'; + wp_die(); + } + +} diff --git a/includes/init.php b/includes/init.php index 93a238325..83b6e04ce 100644 --- a/includes/init.php +++ b/includes/init.php @@ -92,7 +92,7 @@ function pmpro_pages_shortcode($atts, $content=null, $code="") { //add class to body $pmpro_body_classes[] = "pmpro-" . str_replace("_", "-", $pmpro_page_name); - + //shortcode has params, but we still want to load the preheader require_once(PMPRO_DIR . "/preheaders/" . $pmpro_page_name . ".php"); } @@ -219,3 +219,20 @@ function pmpro_sortable_column_query( $query ) { add_filter('manage_users_custom_column', 'pmpro_manage_users_custom_column', 10, 3); add_filter( 'manage_users_sortable_columns', 'pmpro_sortable_column' ); add_action('pre_user_query','pmpro_sortable_column_query'); + +/** + * Set up the Wisdom tracking. + * + * @since TBD + */ +function pmpro_wisdom_tracking() { + require_once PMPRO_DIR . '/classes/class-pmpro-wisdom-integration.php'; + + // Set up the instance. + $wisdom_integration = PMPro_Wisdom_Integration::instance(); + + // Set up Wisdom tracking. + $wisdom_integration->setup_wisdom(); +} + +add_action( 'plugins_loaded', 'pmpro_wisdom_tracking' ); From 07f8e7b02f8f75039efff450cdb3f8a24d7b4d9b Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 4 Feb 2022 11:10:03 -0500 Subject: [PATCH 040/145] Fixing conflicts between Stripe Checkout and PPE/PBC --- classes/gateways/class.pmprogateway_stripe.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 0cf96b6ed..74da0bf35 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -174,8 +174,7 @@ public static function init() { ) ); } else { // Checkout flow for Stripe Checkout. - add_filter('pmpro_include_payment_information_fields', '__return_false'); - add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_stripe', 'pmpro_checkout_default_submit_button')); + add_filter('pmpro_include_payment_information_fields', array('PMProGateway_stripe', 'show_stripe_checkout_pending_warning')); add_filter('pmpro_checkout_before_change_membership_level', array('PMProGateway_stripe', 'pmpro_checkout_before_change_membership_level'), 10, 2); add_filter('pmprommpu_gateway_supports_multiple_level_checkout', '__return_false', 10, 2); add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_billing_preheader_stripe_checkout' ) ); @@ -1492,20 +1491,21 @@ public static function using_stripe_checkout() { } /** - * Swap in our submit buttons. + * Show warning at checkout if Stripe Checkout is being used and + * the last order is pending. * * @since TBD * - * @param bool $show Whether to show the default submit button. + * @param bool $show Whether to show the default payment information fields. * @return bool */ - static function pmpro_checkout_default_submit_button($show) + static function show_stripe_checkout_pending_warning($show) { global $gateway; //show our submit buttons ?> - style="display: none;"> + style="display: none;"> - - gateway != 'stripe' ) { return; + } $morder->user_id = $user_id; $morder->status = 'token'; From ce8f24c7153775645a92c0705bd3c6a29f2c0233 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 4 Feb 2022 11:18:18 -0500 Subject: [PATCH 041/145] Sending email when payment failed with Stripe Checkout --- services/stripe-webhook.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 84427a4a2..f2894dd08 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -548,6 +548,15 @@ // Mark the order as failed. $order->status = "error"; $order->saveOrder(); + + // Email the user to notify them of failed payment + $pmproemail = new PMProEmail(); + $pmproemail->sendBillingFailureEmail( get_userdata( $order->user_id ), $order); + + // Email admin so they are aware of the failure + $pmproemail = new PMProEmail(); + $pmproemail->sendBillingFailureAdminEmail( get_bloginfo( 'admin_email'), $order ); + $logstr .= "Order #" . $order->id . " for Checkout Session " . $checkout_session->id . " could not be processed."; pmpro_stripeWebhookExit(); } From 6656dbf5b44d99bd5e25c9d4a6b7e497d41cb7fd Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Tue, 8 Feb 2022 21:31:14 -0600 Subject: [PATCH 042/145] Fix whitespace, add more since TBD --- classes/class-pmpro-wisdom-integration.php | 38 +++++++++++++--------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index 9be5ab945..83404b61a 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -12,35 +12,37 @@ class PMPro_Wisdom_Integration { /** * The current object instance. * + * @since TBD + * * @var self */ public static $instance; /** - * The plugin slug to use with Wisdom. + * The plugin slug to use with Wisdom. * * @since TBD - * - * @var string - */ + * + * @var string + */ public $plugin_slug = 'paid-memberships-pro'; /** - * The plugin option to send to Wisdom. + * The plugin option to send to Wisdom. * * @since TBD - * - * @var string - */ + * + * @var string + */ public $plugin_option = 'pmpro_settings'; /** - * The plugin settings pages to include Wisdom notices on. + * The plugin settings pages to include Wisdom notices on. * * @since TBD - * - * @var array - */ + * + * @var array + */ public $plugin_pages = [ 'pmpro-membershiplevels' => true, 'pmpro-discountcodes' => true, @@ -54,6 +56,8 @@ class PMPro_Wisdom_Integration { /** * The Wisdom Tracker object. * + * @since TBD + * * @var PMPro_Wisdom_Tracker */ public $wisdom_tracker; @@ -67,10 +71,10 @@ class PMPro_Wisdom_Integration { */ public static function instance() { if ( ! isset( self::$instance ) ) { - self::$instance = new self; - } + self::$instance = new self; + } - return self::$instance; + return self::$instance; } /** @@ -82,6 +86,8 @@ private function __construct() { /** * Set up the Wisdom tracker. + * + * @since TBD */ public function setup_wisdom() { require_once PMPRO_DIR . '/classes/class-pmpro-wisdom-tracker.php'; @@ -397,7 +403,7 @@ public function get_levels_info() { foreach ( $range_groups as $key => $group ) { // Zero price range handling. if ( 0 === $group['range'][0] && 0 === $group['range'][1] && 0 === $billing_amount_price ) { - $range_groups[ $key ]['count']++; + $range_groups[ $key ]['count'] ++; break; } From 8cb4810dd8a936d7e6f92b1b4cc6ed91eb1be19a Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Tue, 15 Feb 2022 20:44:59 +0200 Subject: [PATCH 043/145] Refunds for Stripe & PayPal Express --- adminpages/orders.php | 84 ++++++++++++++++++- .../class.pmprogateway_paypalexpress.php | 32 +++++++ .../gateways/class.pmprogateway_stripe.php | 45 ++++++++++ includes/profile.php | 25 +++++- 4 files changed, 183 insertions(+), 3 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index fc3e0e35c..44d0fa6fe 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -172,6 +172,31 @@ } } +// Refund this order +if ( ! empty( $_REQUEST['refund'] ) ) { + // Check nonce for refunding. + $nonceokay = true; + if ( empty( $_REQUEST['pmpro_orders_nonce'] ) || ! check_admin_referer( 'refund_order', 'pmpro_orders_nonce' ) ) { + $nonceokay = false; + } + + $rorder = new MemberOrder( intval( $_REQUEST['refund'] ) ); + if ( $nonceokay && !empty( $rorder ) && pmpro_allowed_refunds( $rorder ) ) { + + if( pmpro_refund_order( $rorder ) ) { + $pmpro_msg = __( 'Order refunded successfully.', 'paid-memberships-pro' ); + $pmpro_msgt = 'success'; + } else { + $pmpro_msg = __( 'Error refunding order.', 'paid-memberships-pro' ); + $pmpro_msgt = 'error'; + } + + } else { + $pmpro_msg = __( 'Error refunding order.', 'paid-memberships-pro' ); + $pmpro_msgt = 'error'; + } +} + $thisyear = date( 'Y', $now ); // this array stores fields that should be read only @@ -385,10 +410,35 @@ - id ) ) { ?> + id ) ) { + $refund_text = esc_html( + sprintf( + // translators: %s is the Order Code. + __( 'Refunding an order is permanent and can affect active users. Are you sure you want to refund order %s?', 'paid-memberships-pro' ), + str_replace( "'", '', $order->code ) + ) + ); + + $refund_nonce_url = wp_nonce_url( + add_query_arg( + [ + 'page' => 'pmpro-orders', + 'action' => 'refund_order', + 'refund' => $order->id, + 'order' => $order->id + ], + admin_url( 'admin.php' ) + ), + 'refund_order', + 'pmpro_orders_nonce' + ); + ?>

    #id ); ?>: code ); ?>

    + + +

    @@ -1382,6 +1432,27 @@ class="alternate"> 'pmpro_orders_nonce' ); + $refund_text = esc_html( + sprintf( + // translators: %s is the Order Code. + __( 'Refunding orders is permanent and can affect active users. Are you sure you want to refund order %s?', 'paid-memberships-pro' ), + str_replace( "'", '', $order->code ) + ) + ); + + $refund_nonce_url = wp_nonce_url( + add_query_arg( + [ + 'page' => 'pmpro-orders', + 'action' => 'refund_order', + 'refund' => $order->id, + ], + admin_url( 'admin.php' ) + ), + 'refund_order', + 'pmpro_orders_nonce' + ); + $actions = [ 'edit' => sprintf( '%3$s', @@ -1417,7 +1488,7 @@ class="alternate"> esc_attr__( 'Delete', 'paid-memberships-pro' ), 'javascript:pmpro_askfirst(\'' . esc_js( $delete_text ) . '\', \'' . esc_js( $delete_nonce_url ) . '\'); void(0);', esc_html__( 'Delete', 'paid-memberships-pro' ) - ), + ), 'print' => sprintf( '%3$s', esc_attr__( 'Print', 'paid-memberships-pro' ), @@ -1441,6 +1512,15 @@ class="alternate"> ), ]; + if( pmpro_allowed_refunds( $order ) ) { + $actions['refund'] = sprintf( + '%3$s', + esc_attr__( 'Refund', 'paid-memberships-pro' ), + 'javascript:pmpro_askfirst(\'' . esc_js( $refund_text ) . '\', \'' . esc_js( $refund_nonce_url ) . '\'); void(0);', + esc_html__( 'Refund', 'paid-memberships-pro' ) + ); + } + /** * Filter the extra actions for this user on this order. * diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 0f4309475..8b13701ed 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -71,6 +71,7 @@ static function init() add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button')); add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3); } + add_filter( 'pmpro_process_refund_paypal', array('PMProGateway_paypalexpress', 'process_refund' ), 10, 2 ); } /** @@ -1068,6 +1069,37 @@ function PPHttpPost( $methodName_, $nvpStr_ ) { return $httpParsedResponseAr; } + + /** + * Refunds an order (only supports full amounts) + * + * @param bool Status of the refund (default: false) + * @param object The Member Order Object + * + * @return bool Status of the processed refund + */ + function process_refund( $success, $morder ){ + + $transaction_id = $morder->payment_transaction_id; + + if ( $transaction_id === $morder->subscription_transaction_id ) { + $transaction_id = $morder->Gateway->getRealPaymentTransactionId( $morder ); + } + + $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', "&TRANSACTIONID=$transaction_id" ); + + if ( 'SUCCESS' === strtoupper( $httpParsedResponseAr['ACK'] ) ) { + $morder->updateStatus( 'refunded' ); + return true; + } else { + //Localize this with better wording + $morder->notes = $morder->notes.' Attempted refund failed '.print_r( $httpParsedResponseAr, true ); + return false; + } + + return false; + + } /** * PAYPAL Function diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index f91ed7bdb..1d2a87c8d 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -177,6 +177,8 @@ public static function init() { add_action( 'admin_init', array( 'PMProGateway_stripe', 'stripe_connect_save_options' ) ); add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_show_errors' ) ); add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) ); + + add_filter( 'pmpro_process_refund_stripe', array( 'PMProGateway_stripe', 'process_refund' ), 10, 2 ); } /** @@ -4351,6 +4353,49 @@ public function refund( &$order, $transaction_id = null ) { } } + /** + * Initiates a refund for a given order + * + * @param bool $success Outcome of the refund (default: false) + * @param object $order The order we want to refund + * + * @return bool True or false if the refund worked. + */ + public function process_refund( $success, $morder ){ + + $secretkey = pmpro_getOption( 'stripe_secretkey' ); + + // ensure to use a payment transaction id ch_* + $transaction_id = $morder->payment_transaction_id; + if ( strpos( $transaction_id, "in_" ) !== false ) { + $invoice = Stripe\Invoice::retrieve( $transaction_id ); + + if ( ! empty( $invoice ) && ! empty( $invoice->charge ) ) { + $transaction_id = $invoice->charge; + } + } + + try { + $stripe = new Stripe\StripeClient( $secretkey ); + $Refund = $stripe->refunds->create( [ + 'charge' => $transaction_id, + ] ); + var_dump($Refund); + } catch ( \Stripe\Exception\ApiErrorException $e ) { + var_dump($e); + return false; + } + + if ( 'succeeded' === $Refund->status ) { + $morder->updateStatus( 'refunded' ); + + return true; + } + + return false; + + } + /** * @deprecated 2.7.0. Use get_payment_method() instead. */ diff --git a/includes/profile.php b/includes/profile.php index 4ee99a049..2e316d615 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -119,6 +119,12 @@ function pmpro_membership_level_profile_fields($user) + + + + + + sendAdminChangeEmail(get_userdata($user_ID)); } } + + //Refund their most recent subscription + if( !empty( $_REQUEST['refund_subscription'] ) ) { + + $order = new MemberOrder(); + $order->getLastMemberOrder( $user_ID ); + + if( !empty( $order ) && !empty( $order->id ) ) { + + //Gateways that we want to support this can run the action from their own class. + pmpro_refund_order( $order ); + + } + + } + } add_action( 'show_user_profile', 'pmpro_membership_level_profile_fields' ); add_action( 'edit_user_profile', 'pmpro_membership_level_profile_fields' ); From ba9574f58e7425517ba80cd7d013f2fea2bdf2b5 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Wed, 16 Feb 2022 14:36:20 +0200 Subject: [PATCH 044/145] Processing Stripe Refunds --- .../gateways/class.pmprogateway_stripe.php | 112 +++++------------- includes/functions.php | 82 ++++++++++--- 2 files changed, 95 insertions(+), 99 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 1d2a87c8d..6766b348e 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -178,7 +178,7 @@ public static function init() { add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_show_errors' ) ); add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) ); - add_filter( 'pmpro_process_refund_stripe', array( 'PMProGateway_stripe', 'process_refund' ), 10, 2 ); + add_filter( 'pmpro_process_refund_stripe', array( 'PMProGateway_stripe', 'refund' ), 10, 2 ); } /** @@ -4281,10 +4281,11 @@ public function void( &$order, $transaction_id = null ) { * * @return bool True or false if the refund worked. */ - public function refund( &$order, $transaction_id = null ) { - _deprecated_function( __FUNCTION__, '2.7.0' ); + static function refund( $success, $order ) { + // _deprecated_function( __FUNCTION__, '2.7.0' ); + //default to using the payment id from the order - if ( empty( $transaction_id ) && ! empty( $order->payment_transaction_id ) ) { + if ( !empty( $order->payment_transaction_id ) ) { $transaction_id = $order->payment_transaction_id; } @@ -4302,98 +4303,43 @@ public function refund( &$order, $transaction_id = null ) { } } - //get the charge - try { - $charge = Stripe_Charge::retrieve( $transaction_id ); - } catch ( \Throwable $e ) { - $charge = false; - } catch ( \Exception $e ) { - $charge = false; - } - - //can't find the charge? - if ( empty( $charge ) ) { - $order->status = "error"; - $order->errorcode = ""; - $order->error = ""; - $order->shorterror = ""; - - return false; - } + $success = false; //attempt refund try { - $refund = $charge->refund(); - } catch ( \Throwable $e ) { - $order->errorcode = true; - $order->error = __( "Error: ", 'paid-memberships-pro' ) . $e->getMessage(); - $order->shorterror = $order->error; + + $secretkey = pmpro_getOption( "stripe_secretkey" ); + $client = new Stripe_Client( $secretkey ); + $refund = $client->refunds->create( [ + 'charge' => $transaction_id, + ] ); - return false; - } catch ( \Exception $e ) { - $order->errorcode = true; - $order->error = __( "Error: ", 'paid-memberships-pro' ) . $e->getMessage(); - $order->shorterror = $order->error; + $success = true; + + global $current_user; - return false; + $notes = $order->notes; + $order->notes = $notes.' '.sprintf( __('Order successfully refunded on %1s for transation ID %2s by %3s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + + } catch ( \Throwable $e ) { + $notes = $order->notes; + $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + } catch ( \Exception $e ) { + $notes = $order->notes; + $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); } if ( $refund->status == "succeeded" ) { - $order->status = "refunded"; - $order->saveOrder(); - - return true; + $order->status = "refunded"; } else { - $order->status = "error"; - $order->errorcode = true; - $order->error = sprintf( __( "Error: Unkown error while refunding charge #%s", 'paid-memberships-pro' ), $transaction_id ); - $order->shorterror = $order->error; + $notes = $order->notes; + $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); - return false; } - } - /** - * Initiates a refund for a given order - * - * @param bool $success Outcome of the refund (default: false) - * @param object $order The order we want to refund - * - * @return bool True or false if the refund worked. - */ - public function process_refund( $success, $morder ){ - - $secretkey = pmpro_getOption( 'stripe_secretkey' ); - - // ensure to use a payment transaction id ch_* - $transaction_id = $morder->payment_transaction_id; - if ( strpos( $transaction_id, "in_" ) !== false ) { - $invoice = Stripe\Invoice::retrieve( $transaction_id ); - - if ( ! empty( $invoice ) && ! empty( $invoice->charge ) ) { - $transaction_id = $invoice->charge; - } - } - - try { - $stripe = new Stripe\StripeClient( $secretkey ); - $Refund = $stripe->refunds->create( [ - 'charge' => $transaction_id, - ] ); - var_dump($Refund); - } catch ( \Stripe\Exception\ApiErrorException $e ) { - var_dump($e); - return false; - } - - if ( 'succeeded' === $Refund->status ) { - $morder->updateStatus( 'refunded' ); - - return true; - } - - return false; + $order->saveOrder(); + return $success; } /** diff --git a/includes/functions.php b/includes/functions.php index 9e9b0b49d..b982f7408 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3922,22 +3922,22 @@ function pmpro_get_ip() { // In order of preference, with the best ones for this purpose first. // Added some from JetPack's Jetpack_Protect_Module::get_headers() $address_headers = array( - 'GD_PHP_HANDLER', - 'HTTP_AKAMAI_ORIGIN_HOP', - 'HTTP_CF_CONNECTING_IP', - 'HTTP_CLIENT_IP', - 'HTTP_FASTLY_CLIENT_IP', - 'HTTP_FORWARDED', - 'HTTP_FORWARDED_FOR', - 'HTTP_INCAP_CLIENT_IP', - 'HTTP_TRUE_CLIENT_IP', - 'HTTP_X_CLIENTIP', - 'HTTP_X_CLUSTER_CLIENT_IP', - 'HTTP_X_FORWARDED', - 'HTTP_X_FORWARDED_FOR', - 'HTTP_X_IP_TRAIL', - 'HTTP_X_REAL_IP', - 'HTTP_X_VARNISH', + 'GD_PHP_HANDLER', + 'HTTP_AKAMAI_ORIGIN_HOP', + 'HTTP_CF_CONNECTING_IP', + 'HTTP_CLIENT_IP', + 'HTTP_FASTLY_CLIENT_IP', + 'HTTP_FORWARDED', + 'HTTP_FORWARDED_FOR', + 'HTTP_INCAP_CLIENT_IP', + 'HTTP_TRUE_CLIENT_IP', + 'HTTP_X_CLIENTIP', + 'HTTP_X_CLUSTER_CLIENT_IP', + 'HTTP_X_FORWARDED', + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_IP_TRAIL', + 'HTTP_X_REAL_IP', + 'HTTP_X_VARNISH', 'REMOTE_ADDR', ); @@ -3963,4 +3963,54 @@ function pmpro_get_ip() { $client_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $client_ip ); return $client_ip; +} + +/** + * Determines if this order can be refunded + * @param object $order The order that we want to refund + * @return bool Returns a bool value based on if the order can be refunded + */ +function pmpro_allowed_refunds( $order ) { + + if( empty( $order ) || empty( $order->gateway ) ) { + return false; + } + + if( + in_array( $order->status, array( 'success' ) ) && //Only successfully paid orders + in_array( $order->gateway, array( 'stripe', 'paypal-express' ) ) //Only apply to these gateways + ) { + return true; + } + + return false; +} + + +/** + * Decides which filter should be used for the refund depending on gateway + * @param object $order Member Order that we are refunding + * @return bool Returns a bool value based on if a refund was processed successfully or not + */ +function pmpro_refund_order( $order ){ + + if( empty( $order ) ){ + return; + } + + //Not going to refund an order that has already been refunded + if( $order->status == 'refunded' ) { + return true; + } + + if( $order->gateway === 'stripe' ) { + $success = apply_filters( 'pmpro_process_refund_stripe', false, $order ); + } + + if( strpos( $order->gateway, 'paypal' ) !== FALSE ) { + $success = apply_filters( 'pmpro_process_refund_paypal', false, $order ); + } + + return $success; + } \ No newline at end of file From 5958fb427773b97c2f3a5b1d87f8321279786efe Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Wed, 16 Feb 2022 14:47:02 +0200 Subject: [PATCH 045/145] Undefined variable in Stripe refund --- classes/gateways/class.pmprogateway_stripe.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 6766b348e..f2ba3fe07 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4321,21 +4321,21 @@ static function refund( $success, $order ) { $notes = $order->notes; $order->notes = $notes.' '.sprintf( __('Order successfully refunded on %1s for transation ID %2s by %3s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + if ( $refund->status == "succeeded" ) { + $order->status = "refunded"; + } else { + $notes = $order->notes; + $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + + } + } catch ( \Throwable $e ) { $notes = $order->notes; $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); } catch ( \Exception $e ) { $notes = $order->notes; $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); - } - - if ( $refund->status == "succeeded" ) { - $order->status = "refunded"; - } else { - $notes = $order->notes; - $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); - - } + } $order->saveOrder(); From 77b95c5a734957e0d6f1d74a85a820aeab8082b5 Mon Sep 17 00:00:00 2001 From: Andrew Lima Date: Wed, 16 Feb 2022 15:04:47 +0200 Subject: [PATCH 046/145] Support Stripe Connect. * Added support for Stripe Connect or Legacy. * Adjusted order notes error to include error message. --- classes/gateways/class.pmprogateway_stripe.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index f2ba3fe07..49914cfa9 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4309,6 +4309,16 @@ static function refund( $success, $order ) { try { $secretkey = pmpro_getOption( "stripe_secretkey" ); + + // If they are not using legacy keys, get Stripe Connect keys for the relevant environment. + if ( ! self::using_legacy_keys() && empty( $secretkey ) ) { + if ( pmpro_getOption( 'gateway_environment' ) === 'live' ) { + $secretkey = pmpro_getOption( 'live_stripe_connect_secretkey' ); + } else { + $secretkey = pmpro_getOption( 'sandbox_stripe_connect_secretkey' );; + } + } + $client = new Stripe_Client( $secretkey ); $refund = $client->refunds->create( [ 'charge' => $transaction_id, @@ -4331,10 +4341,10 @@ static function refund( $success, $order ) { } catch ( \Throwable $e ) { $notes = $order->notes; - $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + $order->notes .= __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); } catch ( \Exception $e ) { $notes = $order->notes; - $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + $order->notes .= __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); } $order->saveOrder(); From 31fa34a515aeb7870545c27a029f754314b5e51d Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:13:05 +0200 Subject: [PATCH 047/145] Update adminpages/orders.php Co-authored-by: Scott Kingsley Clark --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 44d0fa6fe..08a3320cc 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -180,7 +180,7 @@ $nonceokay = false; } - $rorder = new MemberOrder( intval( $_REQUEST['refund'] ) ); + $rorder = new MemberOrder( (int) $_REQUEST['refund'] ); if ( $nonceokay && !empty( $rorder ) && pmpro_allowed_refunds( $rorder ) ) { if( pmpro_refund_order( $rorder ) ) { From d09207fd2225a86c1c8c31e92993969c04db68d2 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:13:25 +0200 Subject: [PATCH 048/145] Update adminpages/orders.php Co-authored-by: Scott Kingsley Clark --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 08a3320cc..c70d9160c 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -1488,7 +1488,7 @@ class="alternate"> esc_attr__( 'Delete', 'paid-memberships-pro' ), 'javascript:pmpro_askfirst(\'' . esc_js( $delete_text ) . '\', \'' . esc_js( $delete_nonce_url ) . '\'); void(0);', esc_html__( 'Delete', 'paid-memberships-pro' ) - ), + ), 'print' => sprintf( '%3$s', esc_attr__( 'Print', 'paid-memberships-pro' ), From 84f132f69caa1dfc17cfac708b4a72c3635b575e Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:14:06 +0200 Subject: [PATCH 049/145] Update classes/gateways/class.pmprogateway_stripe.php Co-authored-by: Scott Kingsley Clark --- classes/gateways/class.pmprogateway_stripe.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 49914cfa9..b725e07d1 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4315,7 +4315,7 @@ static function refund( $success, $order ) { if ( pmpro_getOption( 'gateway_environment' ) === 'live' ) { $secretkey = pmpro_getOption( 'live_stripe_connect_secretkey' ); } else { - $secretkey = pmpro_getOption( 'sandbox_stripe_connect_secretkey' );; + $secretkey = pmpro_getOption( 'sandbox_stripe_connect_secretkey' ); } } From 72c5b15f9c74962e5ece1bc85a37fb568f748102 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:14:20 +0200 Subject: [PATCH 050/145] Update classes/gateways/class.pmprogateway_stripe.php Co-authored-by: Scott Kingsley Clark --- classes/gateways/class.pmprogateway_stripe.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index b725e07d1..89d1b939f 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4329,7 +4329,7 @@ static function refund( $success, $order ) { global $current_user; $notes = $order->notes; - $order->notes = $notes.' '.sprintf( __('Order successfully refunded on %1s for transation ID %2s by %3s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $order->notes = $notes.' '.sprintf( __('Order successfully refunded on %1$s for translation ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); if ( $refund->status == "succeeded" ) { $order->status = "refunded"; From 12515b041800f731c532e2a934683dbe922f8c21 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:14:38 +0200 Subject: [PATCH 051/145] Update includes/functions.php Co-authored-by: Scott Kingsley Clark --- includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/functions.php b/includes/functions.php index b982f7408..287ac6f5a 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3977,7 +3977,7 @@ function pmpro_allowed_refunds( $order ) { } if( - in_array( $order->status, array( 'success' ) ) && //Only successfully paid orders + in_array( $order->status, array( 'success' ), true ) && //Only successfully paid orders in_array( $order->gateway, array( 'stripe', 'paypal-express' ) ) //Only apply to these gateways ) { return true; From 33d56120deaff620e5b556fc4403d38b079cb284 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:14:49 +0200 Subject: [PATCH 052/145] Update includes/functions.php Co-authored-by: Scott Kingsley Clark --- includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/functions.php b/includes/functions.php index 287ac6f5a..f80116972 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3978,7 +3978,7 @@ function pmpro_allowed_refunds( $order ) { if( in_array( $order->status, array( 'success' ), true ) && //Only successfully paid orders - in_array( $order->gateway, array( 'stripe', 'paypal-express' ) ) //Only apply to these gateways + in_array( $order->gateway, array( 'stripe', 'paypal-express' ), true ) //Only apply to these gateways ) { return true; } From 6c1f6095cf531a017feaebc84aedf1c30252a2b5 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:15:00 +0200 Subject: [PATCH 053/145] Update includes/profile.php Co-authored-by: Scott Kingsley Clark --- includes/profile.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/includes/profile.php b/includes/profile.php index 2e316d615..836477c12 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -307,8 +307,7 @@ function pmpro_membership_level_profile_fields_update() //remove filter after ward if(empty($_REQUEST['cancel_subscription'])) - remove_filter('pmpro_cancel_previous_subscriptions', 'pmpro_cancel_previous_subscriptions_false'); - + remove_filter('pmpro_cancel_previous_subscriptions', 'pmpro_cancel_previous_subscriptions_false'); } //expiration change From 7d09ccb541858f94e2720b9b40223df42dc81bc6 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 12:15:55 +0200 Subject: [PATCH 054/145] Update adminpages/orders.php Co-authored-by: Scott Kingsley Clark --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index c70d9160c..8d4b7bbcb 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -1516,7 +1516,7 @@ class="alternate"> $actions['refund'] = sprintf( '%3$s', esc_attr__( 'Refund', 'paid-memberships-pro' ), - 'javascript:pmpro_askfirst(\'' . esc_js( $refund_text ) . '\', \'' . esc_js( $refund_nonce_url ) . '\'); void(0);', + esc_js( 'javascript:pmpro_askfirst(' . wp_json_encode( $refund_text ) . ', ' . wp_json_encode( $refund_nonce_url ) . '); void(0);' ), esc_html__( 'Refund', 'paid-memberships-pro' ) ); } From be1c45290f89a1e560a5493a88c9d78eeb5675f9 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 13:24:24 +0200 Subject: [PATCH 055/145] Adjustments to quotes/syntax and order notes --- .../class.pmprogateway_paypalexpress.php | 25 +++++++++++++------ .../gateways/class.pmprogateway_stripe.php | 20 ++++++--------- includes/functions.php | 2 +- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 8b13701ed..7bfc5c37a 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1078,26 +1078,35 @@ function PPHttpPost( $methodName_, $nvpStr_ ) { * * @return bool Status of the processed refund */ - function process_refund( $success, $morder ){ + public static function process_refund( $success, $morder ){ $transaction_id = $morder->payment_transaction_id; if ( $transaction_id === $morder->subscription_transaction_id ) { $transaction_id = $morder->Gateway->getRealPaymentTransactionId( $morder ); } - - $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', "&TRANSACTIONID=$transaction_id" ); +var_dump($transaction_id); + $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', '&TRANSACTIONID=$transaction_id' ); if ( 'SUCCESS' === strtoupper( $httpParsedResponseAr['ACK'] ) ) { + + $success = true; + $morder->updateStatus( 'refunded' ); - return true; + + global $current_user; + + // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. + $morder->notes = trim( $morder->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + } else { - //Localize this with better wording - $morder->notes = $morder->notes.' Attempted refund failed '.print_r( $httpParsedResponseAr, true ); - return false; + //The refund failed, so lets return the gateway message + + // translators: %1$s is the Transaction ID. %1$s is the Gateway Error + $morder->notes = trim( $morder->notes ) .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s ', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ); } - return false; + $morder->SaveOrder(); } diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 89d1b939f..c4e57a3fe 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4274,15 +4274,12 @@ public function void( &$order, $transaction_id = null ) { /** * Refund a payment or invoice * - * @deprecated 2.7.0. - * * @param object &$order Related PMPro order object. * @param string $transaction_id Payment or invoice id to void. * * @return bool True or false if the refund worked. */ static function refund( $success, $order ) { - // _deprecated_function( __FUNCTION__, '2.7.0' ); //default to using the payment id from the order if ( !empty( $order->payment_transaction_id ) ) { @@ -4308,7 +4305,7 @@ static function refund( $success, $order ) { //attempt refund try { - $secretkey = pmpro_getOption( "stripe_secretkey" ); + $secretkey = pmpro_getOption( 'stripe_secretkey' ); // If they are not using legacy keys, get Stripe Connect keys for the relevant environment. if ( ! self::using_legacy_keys() && empty( $secretkey ) ) { @@ -4329,22 +4326,19 @@ static function refund( $success, $order ) { global $current_user; $notes = $order->notes; - $order->notes = $notes.' '.sprintf( __('Order successfully refunded on %1$s for translation ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $order->notes = '\n\n'.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); - if ( $refund->status == "succeeded" ) { - $order->status = "refunded"; + if ( $refund->status == 'succeeded' ) { + $order->status = 'refunded'; } else { - $notes = $order->notes; - $order->notes = $notes.' '.__('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + $order->notes = trim( $order->notes ) .' '. __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); } } catch ( \Throwable $e ) { - $notes = $order->notes; - $order->notes .= __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); + $order->notes = trim( $order->notes ) .' '. __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); } catch ( \Exception $e ) { - $notes = $order->notes; - $order->notes .= __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); + $order->notes = trim( $order->notes ) .' '. __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); } $order->saveOrder(); diff --git a/includes/functions.php b/includes/functions.php index f80116972..a53b7ff16 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3978,7 +3978,7 @@ function pmpro_allowed_refunds( $order ) { if( in_array( $order->status, array( 'success' ), true ) && //Only successfully paid orders - in_array( $order->gateway, array( 'stripe', 'paypal-express' ), true ) //Only apply to these gateways + in_array( $order->gateway, array( 'stripe', 'paypalexpress' ), true ) //Only apply to these gateways ) { return true; } From 460bd666e7374ad97a979345a8041c75bf12af81 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 13:39:29 +0200 Subject: [PATCH 056/145] Docblocks added for new filters --- .../class.pmprogateway_paypalexpress.php | 2 +- includes/functions.php | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 7bfc5c37a..1824172a4 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1085,7 +1085,7 @@ public static function process_refund( $success, $morder ){ if ( $transaction_id === $morder->subscription_transaction_id ) { $transaction_id = $morder->Gateway->getRealPaymentTransactionId( $morder ); } -var_dump($transaction_id); + $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', '&TRANSACTIONID=$transaction_id' ); if ( 'SUCCESS' === strtoupper( $httpParsedResponseAr['ACK'] ) ) { diff --git a/includes/functions.php b/includes/functions.php index a53b7ff16..8c0cf4c43 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -4004,10 +4004,28 @@ function pmpro_refund_order( $order ){ } if( $order->gateway === 'stripe' ) { + /** + * Processes a refund for Stripe orders + * + * @since TBA + * + * @param bool Default return value is false to determine if the refund was successfully processed. + * @param object $order The Member Order we want to refund + * @return bool If the refund was successfully processed + */ $success = apply_filters( 'pmpro_process_refund_stripe', false, $order ); } if( strpos( $order->gateway, 'paypal' ) !== FALSE ) { + /** + * Processes a refund for PayPal orders + * + * @since TBA + * + * @param bool Default return value is false to determine if the refund was successfully processed. + * @param object $order The Member Order we want to refund + * @return bool If the refund was successfully processed + */ $success = apply_filters( 'pmpro_process_refund_paypal', false, $order ); } From f73edb4caec5919817a8bb9aee2cc671d22a4d8d Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 14:06:48 +0200 Subject: [PATCH 057/145] Better handling of JS in refund button --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 8d4b7bbcb..e6f12c349 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -437,7 +437,7 @@ - + " class="page-title-action">

    From 254ca498f87cf7422fa526f568203921dcaf88e8 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 14:38:12 +0200 Subject: [PATCH 058/145] Filter added for refund statuses. Renamed refund action name --- includes/functions.php | 14 +++++++++++++- includes/profile.php | 6 +++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/includes/functions.php b/includes/functions.php index 8c0cf4c43..075be1518 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3976,8 +3976,20 @@ function pmpro_allowed_refunds( $order ) { return false; } + /** + * Processes a refund for Stripe orders + * + * @since TBA + * + * @param bool Default return value is false to determine if the refund was successfully processed. + * @param object $order The Member Order we want to refund + * @return bool If the refund was successfully processed + */ + + $disallowed_statuses = apply_filters( 'pmpro_disallowed_refund_statuses', array( 'pending', 'refunded' ) ); + if( - in_array( $order->status, array( 'success' ), true ) && //Only successfully paid orders + !in_array( $order->status, $disallowed_statuses, true ) && //Don't allow pending orders to be refunded in_array( $order->gateway, array( 'stripe', 'paypalexpress' ), true ) //Only apply to these gateways ) { return true; diff --git a/includes/profile.php b/includes/profile.php index 836477c12..b49529874 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -123,7 +123,7 @@ function pmpro_membership_level_profile_fields($user) - + getLastMemberOrder( $user_ID ); From 92aaf774b2e7bcdff067b95d455de66bd67a9d0d Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 14:42:00 +0200 Subject: [PATCH 059/145] Adjusted comment --- includes/profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/profile.php b/includes/profile.php index b49529874..b994f32b9 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -362,7 +362,7 @@ function pmpro_membership_level_profile_fields_update() } } - //Refund their most recent subscription if the level was successfully changed + //Refund their most recent subscription if( !empty( $_REQUEST['refund_last_subscription'] ) ) { $order = new MemberOrder(); From ca30b293cf7cfe4db8c11cab500ad64696abf81c Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 18 Feb 2022 17:59:09 +0200 Subject: [PATCH 060/145] Update classes/gateways/class.pmprogateway_stripe.php Co-authored-by: Scott Kingsley Clark --- classes/gateways/class.pmprogateway_stripe.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index c4e57a3fe..5b93d3c1b 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4331,7 +4331,7 @@ static function refund( $success, $order ) { if ( $refund->status == 'succeeded' ) { $order->status = 'refunded'; } else { - $order->notes = trim( $order->notes ) .' '. __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + $order->notes = trim( $order->notes . ' ' . __( 'An error occured while attempting to process this refund.', 'paid-memberships-pro' ) ); } From 39a53f99c70b96a72f173e0277f23e2543307fa6 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Tue, 22 Feb 2022 16:58:28 +0200 Subject: [PATCH 061/145] Webhook handling for refunds. Refund emails. Bug fixes. --- adminpages/orders.php | 4 +- classes/class.pmproemail.php | 71 ++++++++++++++++++ .../class.pmprogateway_paypalexpress.php | 2 +- .../gateways/class.pmprogateway_stripe.php | 5 +- includes/functions.php | 2 +- includes/profile.php | 12 ++- services/ipnhandler.php | 75 +++++++++++++++++++ services/stripe-webhook.php | 14 ++++ 8 files changed, 177 insertions(+), 8 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index e6f12c349..a1e910d84 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -187,12 +187,12 @@ $pmpro_msg = __( 'Order refunded successfully.', 'paid-memberships-pro' ); $pmpro_msgt = 'success'; } else { - $pmpro_msg = __( 'Error refunding order.', 'paid-memberships-pro' ); + $pmpro_msg = __( 'Error refunding order. Please check the order notes for more information.', 'paid-memberships-pro' ); $pmpro_msgt = 'error'; } } else { - $pmpro_msg = __( 'Error refunding order.', 'paid-memberships-pro' ); + $pmpro_msg = __( 'Error refunding order. Please check the order notes for more information.', 'paid-memberships-pro' ); $pmpro_msgt = 'error'; } } diff --git a/classes/class.pmproemail.php b/classes/class.pmproemail.php index 17c4cc4d2..377e9a5f5 100644 --- a/classes/class.pmproemail.php +++ b/classes/class.pmproemail.php @@ -248,6 +248,77 @@ function sendCancelAdminEmail($user = NULL, $old_level_id = NULL) return $this->sendEmail(); } + + function sendRefundedEmail($user = NULL, $old_level_id = NULL) + { + global $wpdb, $current_user; + if(!$user) + $user = $current_user; + + if(!$user) + return false; + + $this->email = $user->user_email; + $this->subject = sprintf(__('Your membership at %s has been REFUNDED', 'paid-memberships-pro'), get_option("blogname")); + + $this->data = array("user_email" => $user->user_email, "display_name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "siteemail" => pmpro_getOption("from_email")); + + if(!empty($old_level_id)) { + if(!is_array($old_level_id)) + $old_level_id = array($old_level_id); + $this->data['membership_id'] = $old_level_id[0]; //pass just the first as the level id + $this->data['membership_level_name'] = pmpro_implodeToEnglish($wpdb->get_col("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id IN('" . implode("','", $old_level_id) . "')")); + } else { + $this->data['membership_id'] = ''; + $this->data['membership_level_name'] = __('All Levels', 'paid-memberships-pro' ); + } + + $this->template = apply_filters("pmpro_email_template", "refund", $this); + return $this->sendEmail(); + } + + function sendRefundedAdminEmail($user = NULL, $old_level_id = NULL) + { + global $wpdb, $current_user; + if(!$user) + $user = $current_user; + + if(!$user) + return false; + + $this->email = get_bloginfo("admin_email"); + $this->subject = sprintf(__("Membership for %s at %s has been REFUNDED", 'paid-memberships-pro'), $user->user_login, get_option("blogname")); + + $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" => pmpro_login_url(), "login_url" => pmpro_login_url()); + + if(!empty($old_level_id)) { + if(!is_array($old_level_id)) + $old_level_id = array($old_level_id); + $this->data['membership_id'] = $old_level_id[0]; //pass just the first as the level id + $this->data['membership_level_name'] = pmpro_implodeToEnglish($wpdb->get_col("SELECT name FROM $wpdb->pmpro_membership_levels WHERE id IN('" . implode("','", $old_level_id) . "')")); + + //start and end date + $startdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(CONVERT_TZ(startdate, '+00:00', @@global.time_zone)) as startdate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND membership_id = '" . $old_level_id[0] . "' AND status IN('inactive', 'cancelled', 'admin_cancelled') ORDER BY id DESC"); + if(!empty($startdate)) + $this->data['startdate'] = date_i18n(get_option('date_format'), $startdate); + else + $this->data['startdate'] = ""; + $enddate = $wpdb->get_var("SELECT UNIX_TIMESTAMP(CONVERT_TZ(enddate, '+00:00', @@global.time_zone)) as enddate FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user->ID . "' AND membership_id = '" . $old_level_id[0] . "' AND status IN('inactive', 'cancelled', 'admin_cancelled') ORDER BY id DESC"); + if(!empty($enddate)) + $this->data['enddate'] = date_i18n(get_option('date_format'), $enddate); + else + $this->data['enddate'] = ""; + } else { + $this->data['membership_id'] = ''; + $this->data['membership_level_name'] = __('All Levels', 'paid-memberships-pro' ); + $this->data['startdate'] = ''; + $this->data['enddate'] = ''; + } + + $this->template = apply_filters("pmpro_email_template", "refund_admin", $this); + + return $this->sendEmail(); + } function sendCheckoutEmail($user = NULL, $invoice = NULL) { diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 1824172a4..1f91cd276 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1086,7 +1086,7 @@ public static function process_refund( $success, $morder ){ $transaction_id = $morder->Gateway->getRealPaymentTransactionId( $morder ); } - $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', '&TRANSACTIONID=$transaction_id' ); + $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', '&TRANSACTIONID='.$transaction_id ); if ( 'SUCCESS' === strtoupper( $httpParsedResponseAr['ACK'] ) ) { diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 5b93d3c1b..b7b7d7882 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4325,13 +4325,12 @@ static function refund( $success, $order ) { global $current_user; - $notes = $order->notes; - $order->notes = '\n\n'.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $order->notes = $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); if ( $refund->status == 'succeeded' ) { $order->status = 'refunded'; } else { - $order->notes = trim( $order->notes . ' ' . __( 'An error occured while attempting to process this refund.', 'paid-memberships-pro' ) ); + $order->notes = trim( $order->notes ) .' '. __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); } diff --git a/includes/functions.php b/includes/functions.php index 075be1518..abf7156e6 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3972,7 +3972,7 @@ function pmpro_get_ip() { */ function pmpro_allowed_refunds( $order ) { - if( empty( $order ) || empty( $order->gateway ) ) { + if( empty( $order ) || empty( $order->gateway ) || empty( $order->status ) ) { return false; } diff --git a/includes/profile.php b/includes/profile.php index b994f32b9..421b411da 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -60,6 +60,16 @@ function pmpro_membership_level_profile_fields($user) $selected_expires_hour = date( 'H', $end_date ? $user->membership_level->enddate : current_time('timestamp') ); $selected_expires_minute = date( 'i', $end_date ? $user->membership_level->enddate : current_time('timestamp') ); + + $last_order = new MemberOrder(); + + $last_order->getLastMemberOrder( $user->ID ); + + $allows_refunds = false; + + if( pmpro_allowed_refunds( $last_order ) ) { + $allows_refunds = true; + } ?> @@ -123,7 +133,7 @@ function pmpro_membership_level_profile_fields($user) - + getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + + if ( ! isset( $m->id ) ) { + + if ( $recurring_payment_id ) { + try { + + $last_order_by_subscription = new MemberOrder(); + $last_order_by_subscription->getLastMemberOrderBySubscriptionTransactionID( $recurring_payment_id ); + + $first_order_by_subscription = $last_order_by_subscription->get_original_subscription_order(); + if ( $first_order_by_subscription && $first_order_by_subscription->id ) { + if ( 'paypalexpress' === $first_order_by_subscription->gateway ) { + $first_order_payment_transaction_id = $first_order_by_subscription->Gateway->getRealPaymentTransactionId( $first_order_by_subscription ); + + if ( $first_order_payment_transaction_id === $payment_transaction_id ) { + $m = $first_order_by_subscription; + } + } + } + } catch ( Exception $e ) { + // if something goes wrong with the logic above, + // we dont want to miss the management of the current ipn request. + // so ignoring the error is the best thing to do. dont care too much. + //The refund failed, so lets return the gateway message + + // translators: %1$s is the Transaction ID. %1$s is the Gateway Error + $morder->notes = trim( $morder->notes ) .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s ', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ); + + ipnlog( "Canceled membership for user with id = " . $last_subscription_order->user_id . ". Subscription transaction id = " . $subscr_id . "." ); + + } + } + } + + if ( isset( $m->id ) ) { + + $success = true; + + $m->updateStatus( 'refunded' ); + + global $current_user; + + // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. + $m->notes = trim( $m->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + + ipnlog( "Canceled membership for user with id = " . $last_subscription_order->user_id . ". Subscription transaction id = " . $subscr_id . "." ); + + //send an email to the member + $myemail = new PMProEmail(); + $myemail->sendCancelEmail( $user ); + + //send an email to the admin + $myemail = new PMProEmail(); + $myemail->sendCancelAdminEmail( $user, $last_subscription_order->membership_id ); + + } + + $m->SaveOrder(); + } + +} + // Order Refunded (PayPal Express) if( '' === $txn_type && 'Refunded' === $payment_status ) { ipnlog( 'Refund for this payment: ' . print_r( $_POST, true ) ); diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index d39af0093..b52241e84 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -413,6 +413,20 @@ } } } + elseif( $pmpro_stripe_event->type == "charge.refunded" ) + { + + //Lets handle refunds here + + $payment_transaction_id = $pmpro_stripe_event->id; + + $morder = new MemberOrder(); + + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + + error_log(print_r( $morder, true ) ); + + } else { if(!empty($event_id)) From b952bb228b6bb80efa6aea404357ebf5a0c0ce68 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Thu, 24 Feb 2022 15:15:47 +0200 Subject: [PATCH 062/145] Refunded emails. Webhook support for refunds. Stripe webhook works. --- .../class.pmprogateway_paypalexpress.php | 8 +++ .../gateways/class.pmprogateway_stripe.php | 20 ++++-- includes/email-templates.php | 23 +++++++ services/ipnhandler.php | 4 +- services/stripe-webhook.php | 64 ++++++++++++++++--- 5 files changed, 101 insertions(+), 18 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 1f91cd276..78cde56b9 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1099,6 +1099,14 @@ public static function process_refund( $success, $morder ){ // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. $morder->notes = trim( $morder->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + //send an email to the member + $myemail = new PMProEmail(); + $myemail->sendRefundedEmail( $user ); + + //send an email to the admin + $myemail = new PMProEmail(); + $myemail->sendRefundedAdminEmail( $user, $last_subscription_order->membership_id ); + } else { //The refund failed, so lets return the gateway message diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index b7b7d7882..ed428fe4f 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4319,16 +4319,24 @@ static function refund( $success, $order ) { $client = new Stripe_Client( $secretkey ); $refund = $client->refunds->create( [ 'charge' => $transaction_id, - ] ); + ] ); - $success = true; + if ( $refund->status == 'succeeded' ) { + $order->status = 'refunded'; + + $success = true; - global $current_user; + global $current_user; - $order->notes = $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $order->notes = $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); - if ( $refund->status == 'succeeded' ) { - $order->status = 'refunded'; + //send an email to the member + $myemail = new PMProEmail(); + $myemail->sendRefundedEmail( $current_user ); + + //send an email to the admin + $myemail = new PMProEmail(); + $myemail->sendRefundedAdminEmail( $current_user, $order->membership_id ); } else { $order->notes = trim( $order->notes ) .' '. __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); diff --git a/includes/email-templates.php b/includes/email-templates.php index b828beb1f..c093342a0 100644 --- a/includes/email-templates.php +++ b/includes/email-templates.php @@ -498,7 +498,30 @@

    Log in to your membership account here: !!login_url!!

    ', 'paid-memberships-pro' ), 'help_text' => __( 'This email is sent to the member when the trial portion of their membership level is approaching, at an interval based on the term of the trial.', 'paid-memberships-pro' ) ), + 'refund' => array( + 'subject' => __( "Your membership at !!sitename!! has been REFUNDED", 'paid-memberships-pro' ), + 'description' => __('Refund', 'paid-memberships-pro'), + 'body' => __( '

    Your membership at !!sitename!! has been refunded.

    +

    Account: !!display_name!! (!!user_email!!)

    +

    Membership Level: !!membership_level_name!!

    + +

    If you did not request this refund and would like more information please contact us at !!siteemail!!

    ', 'paid-memberships-pro' ), + 'help_text' => __( 'The site administrator can manually refund a user\'s membership through the WordPress admin. This email is sent to the member as confirmation of a refunded membership.', 'paid-memberships-pro' ) + ), + 'refund_admin' => array( + 'subject' => __( "Membership for !!user_login!! at !!sitename!! has been REFUNDED", 'paid-memberships-pro' ), + 'description' => __('Refund (admin)', 'paid-memberships-pro'), + 'body' => __( '

    The membership for !!user_login!! at !!sitename!! has been refunded.

    + +

    Account: !!display_name!! (!!user_email!!)

    +

    Membership Level: !!membership_level_name!!

    +

    Start Date: !!startdate!!

    +

    End Date: !!enddate!!

    + +

    Log in to your WordPress admin here: !!login_url!!

    ', 'paid-memberships-pro' ), + 'help_text' => __( 'The site administrator can manually refund a user\'s membership through the WordPress admin. This email is sent to the site administrator as confirmation of a refunded membership.', 'paid-memberships-pro' ) + ), ); // add SCA payment action required emails if we're using PMPro 2.1 or later diff --git a/services/ipnhandler.php b/services/ipnhandler.php index 38945c4f6..7fbcfb21f 100644 --- a/services/ipnhandler.php +++ b/services/ipnhandler.php @@ -410,11 +410,11 @@ //send an email to the member $myemail = new PMProEmail(); - $myemail->sendCancelEmail( $user ); + $myemail->sendRefundedEmail( $user ); //send an email to the admin $myemail = new PMProEmail(); - $myemail->sendCancelAdminEmail( $user, $last_subscription_order->membership_id ); + $myemail->sendRefundedAdminEmail( $user, $last_subscription_order->membership_id ); } diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index b52241e84..a6df4fcfc 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -82,7 +82,8 @@ } global $wpdb; - + error_log( print_r( $pmpro_stripe_event, true ) ); + error_log($pmpro_stripe_event->type); //real event? if(!empty($pmpro_stripe_event->id)) { @@ -412,19 +413,62 @@ pmpro_stripeWebhookExit(); } } - } - elseif( $pmpro_stripe_event->type == "charge.refunded" ) - { + elseif( $pmpro_stripe_event->type == "charge.refunded" ) + { + + /** + * Stripe's charge.refunded takes a while to come through. + * + * When requesting a refund, you'll have a payment_intent.succeeded first, + * and then the charge.refunded will come through later. + */ + + /** + * ch_ prefixed. Using this in case someone tries to resend a webhook, then we get this ID + * instead of an event ID + */ + $payment_transaction_id = $pmpro_stripe_event->data->object->id; + + $morder = new MemberOrder(); - //Lets handle refunds here + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); - $payment_transaction_id = $pmpro_stripe_event->id; + if( !empty( $morder ) ) { - $morder = new MemberOrder(); + //We've got the right order + $morder->status = 'refunded'; + + // translators: %1$s is the date of the refund. %2$s is the transaction ID. + + $logstr .= sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); + //Add to order notes. + + // translators: %1$s is the date of the refund. %2$s is the transaction ID. + $morder->notes = trim( $morder->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); + + $morder->SaveOrder(); - $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + $user = get_user_by( 'email', $morder->Email ); - error_log(print_r( $morder, true ) ); + //send an email to the member + $myemail = new PMProEmail(); + $myemail->sendRefundedEmail( $user ); + + //send an email to the admin + $myemail = new PMProEmail(); + $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); + + pmpro_stripeWebhookExit(); + + } else { + + //We can't find that order + + $logstr .= sprintf( __('%1$s - Failed to update transaction ID %2$s after it was refunded at the gateway.', 'paid-memberships-pro' ), $payment_transaction_id, date_i18n('Y-m-d H:i:s') ); + + pmpro_stripeWebhookExit(); + + } } else @@ -435,7 +479,7 @@ $logstr .= "No event ID given."; pmpro_stripeWebhookExit(); } - +} /** * @deprecated 2.7.0. */ From 08b087ccbd801260d1ea4cf6580f188ef69087fb Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Thu, 24 Feb 2022 16:14:44 +0200 Subject: [PATCH 063/145] PPExpress IPN Refund Handling Fixes --- .../class.pmprogateway_paypalexpress.php | 5 +- services/ipnhandler.php | 69 +++++++++---------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 78cde56b9..b48eff6d2 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1099,13 +1099,14 @@ public static function process_refund( $success, $morder ){ // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. $morder->notes = trim( $morder->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $user = get_user_by( 'email', $morder->Email ); //send an email to the member $myemail = new PMProEmail(); $myemail->sendRefundedEmail( $user ); //send an email to the admin $myemail = new PMProEmail(); - $myemail->sendRefundedAdminEmail( $user, $last_subscription_order->membership_id ); + $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); } else { //The refund failed, so lets return the gateway message @@ -1116,6 +1117,8 @@ public static function process_refund( $success, $morder ){ $morder->SaveOrder(); + return $success; + } /** diff --git a/services/ipnhandler.php b/services/ipnhandler.php index 7fbcfb21f..b188b472d 100644 --- a/services/ipnhandler.php +++ b/services/ipnhandler.php @@ -350,7 +350,7 @@ } } -if ( '' === $txn_type && 'Refunded' === $payment_status ) { +if ( strtolower( $payment_status ) === 'refunded' ) { $payment_transaction_id = $parent_txn_id; @@ -358,55 +358,51 @@ $success = false; - $m = new MemberOrder(); + $morder = new MemberOrder(); - $m->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); - if ( ! isset( $m->id ) ) { + if ( ! isset( $morder->id ) ) { - if ( $recurring_payment_id ) { - try { + try { - $last_order_by_subscription = new MemberOrder(); - $last_order_by_subscription->getLastMemberOrderBySubscriptionTransactionID( $recurring_payment_id ); + $last_order_by_subscription = new MemberOrder(); + $last_order_by_subscription->getLastMemberOrderBySubscriptionTransactionID( $recurring_payment_id ); - $first_order_by_subscription = $last_order_by_subscription->get_original_subscription_order(); - if ( $first_order_by_subscription && $first_order_by_subscription->id ) { - if ( 'paypalexpress' === $first_order_by_subscription->gateway ) { - $first_order_payment_transaction_id = $first_order_by_subscription->Gateway->getRealPaymentTransactionId( $first_order_by_subscription ); + $first_order_by_subscription = $last_order_by_subscription->get_original_subscription_order(); + if ( $first_order_by_subscription && $first_order_by_subscription->id ) { + if ( 'paypalexpress' === $first_order_by_subscription->gateway ) { + $first_order_payment_transaction_id = $first_order_by_subscription->Gateway->getRealPaymentTransactionId( $first_order_by_subscription ); - if ( $first_order_payment_transaction_id === $payment_transaction_id ) { - $m = $first_order_by_subscription; - } + if ( $first_order_payment_transaction_id === $payment_transaction_id ) { + $morder = $first_order_by_subscription; } } - } catch ( Exception $e ) { - // if something goes wrong with the logic above, - // we dont want to miss the management of the current ipn request. - // so ignoring the error is the best thing to do. dont care too much. - //The refund failed, so lets return the gateway message - - // translators: %1$s is the Transaction ID. %1$s is the Gateway Error - $morder->notes = trim( $morder->notes ) .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s ', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ); - - ipnlog( "Canceled membership for user with id = " . $last_subscription_order->user_id . ". Subscription transaction id = " . $subscr_id . "." ); - } + } catch ( Exception $e ) { + // if something goes wrong with the logic above, + // we dont want to miss the management of the current ipn request. + // so ignoring the error is the best thing to do. dont care too much. + //The refund failed, so lets return the gateway message + + ipnlog( "Canceled membership for user with id = " . $last_subscription_order->user_id . ". Subscription transaction ID = " . $payment_transaction_id . ". " . $httpParsedResponseAr['L_LONGMESSAGE0'] ); + } + } - if ( isset( $m->id ) ) { + if ( isset( $morder->id ) ) { $success = true; - $m->updateStatus( 'refunded' ); + $morder->status = 'refunded'; - global $current_user; + // translators: %1$s is the date. %2$s is the transaction ID. + $morder->notes = trim( $morder->notes .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); - // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. - $m->notes = trim( $m->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + ipnlog( printf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); - ipnlog( "Canceled membership for user with id = " . $last_subscription_order->user_id . ". Subscription transaction id = " . $subscr_id . "." ); + $user = get_user_by( 'email', $morder->Email ); //send an email to the member $myemail = new PMProEmail(); @@ -414,11 +410,14 @@ //send an email to the admin $myemail = new PMProEmail(); - $myemail->sendRefundedAdminEmail( $user, $last_subscription_order->membership_id ); + $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); - } + $morder->SaveOrder(); + + } + + return $success; - $m->SaveOrder(); } } From e9d0ff11de68e1751ca70f4a45b8d69fd2ef402a Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 25 Feb 2022 14:12:40 +0200 Subject: [PATCH 064/145] Formatting, comments, minor changes --- .../gateways/class.pmprogateway_paypalexpress.php | 15 +++++++++++---- classes/gateways/class.pmprogateway_stripe.php | 4 +++- services/ipnhandler.php | 9 +-------- services/stripe-webhook.php | 6 +++--- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index b48eff6d2..8841a081c 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1075,24 +1075,31 @@ function PPHttpPost( $methodName_, $nvpStr_ ) { * * @param bool Status of the refund (default: false) * @param object The Member Order Object - * + * @since TBD + * * @return bool Status of the processed refund */ public static function process_refund( $success, $morder ){ + //need a transaction id + if ( empty( $morder->payment_transaction_id ) ) { + return false; + } + $transaction_id = $morder->payment_transaction_id; + //Get the real transaction ID if ( $transaction_id === $morder->subscription_transaction_id ) { $transaction_id = $morder->Gateway->getRealPaymentTransactionId( $morder ); } $httpParsedResponseAr = $morder->Gateway->PPHttpPost( 'RefundTransaction', '&TRANSACTIONID='.$transaction_id ); - if ( 'SUCCESS' === strtoupper( $httpParsedResponseAr['ACK'] ) ) { + if ( 'success' === strtolower( $httpParsedResponseAr['ACK'] ) ) { $success = true; - $morder->updateStatus( 'refunded' ); + $morder->status = 'refunded'; global $current_user; @@ -1112,7 +1119,7 @@ public static function process_refund( $success, $morder ){ //The refund failed, so lets return the gateway message // translators: %1$s is the Transaction ID. %1$s is the Gateway Error - $morder->notes = trim( $morder->notes ) .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s ', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ); + $morder->notes = trim( $morder->notes .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s ', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ) ); } $morder->SaveOrder(); diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index ed428fe4f..4efbe4b94 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4321,14 +4321,16 @@ static function refund( $success, $order ) { 'charge' => $transaction_id, ] ); + //Make sure we're refunding an order that was successful if ( $refund->status == 'succeeded' ) { + $order->status = 'refunded'; $success = true; global $current_user; - $order->notes = $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $order->notes = trim( $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); //send an email to the member $myemail = new PMProEmail(); diff --git a/services/ipnhandler.php b/services/ipnhandler.php index b188b472d..75955e710 100644 --- a/services/ipnhandler.php +++ b/services/ipnhandler.php @@ -385,7 +385,7 @@ // so ignoring the error is the best thing to do. dont care too much. //The refund failed, so lets return the gateway message - ipnlog( "Canceled membership for user with id = " . $last_subscription_order->user_id . ". Subscription transaction ID = " . $payment_transaction_id . ". " . $httpParsedResponseAr['L_LONGMESSAGE0'] ); + ipnlog( "Canceled membership for user with id = " . $morder->user_id . ". Subscription transaction ID = " . $payment_transaction_id . ". " . $httpParsedResponseAr['L_LONGMESSAGE0'] ); } @@ -422,13 +422,6 @@ } -// Order Refunded (PayPal Express) -if( '' === $txn_type && 'Refunded' === $payment_status ) { - ipnlog( 'Refund for this payment: ' . print_r( $_POST, true ) ); - - pmpro_ipnExit(); -} - //Other //if we got here, this is a different kind of txn ipnlog( "No recurring payment id or item number. txn_type = " . $txn_type ); diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index a6df4fcfc..d47adfe54 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -433,9 +433,9 @@ $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); - if( !empty( $morder ) ) { - - //We've got the right order + //We've got the right order + if( !empty( $morder->id ) ) { + $morder->status = 'refunded'; // translators: %1$s is the date of the refund. %2$s is the transaction ID. From 761f52b8545a383bbe532f421e98c2a0543444ca Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 25 Feb 2022 14:43:43 +0200 Subject: [PATCH 065/145] Bug fixed for orders that get cancelled and refunded on orders page --- includes/functions.php | 7 ++++--- includes/profile.php | 14 +++++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/includes/functions.php b/includes/functions.php index bf7555259..c7efa65e5 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -4040,7 +4040,7 @@ function pmpro_refund_order( $order ){ /** * Processes a refund for Stripe orders * - * @since TBA + * @since TBD * * @param bool Default return value is false to determine if the refund was successfully processed. * @param object $order The Member Order we want to refund @@ -4053,7 +4053,7 @@ function pmpro_refund_order( $order ){ /** * Processes a refund for PayPal orders * - * @since TBA + * @since TBD * * @param bool Default return value is false to determine if the refund was successfully processed. * @param object $order The Member Order we want to refund @@ -4065,7 +4065,8 @@ function pmpro_refund_order( $order ){ return $success; } - * Send the WP new user notification email, but also check our filter. + +/* Send the WP new user notification email, but also check our filter. * NOTE: includes/email.php has code to check for the related setting and * filters on the pmpro_wp_new_user_notification hook. * @since 2.7.4 diff --git a/includes/profile.php b/includes/profile.php index 421b411da..bc11e9065 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -376,10 +376,18 @@ function pmpro_membership_level_profile_fields_update() if( !empty( $_REQUEST['refund_last_subscription'] ) ) { $order = new MemberOrder(); - $order->getLastMemberOrder( $user_ID ); - if( !empty( $order ) && !empty( $order->id ) ) { - + //We need to get a different order if we already cancelled it on the profile edit page. + if( !empty( $_REQUEST['cancel_subscription'] ) ){ + $order_status = 'cancelled'; + } else { + $order_status = 'success'; + } + + $order->getLastMemberOrder( $user_ID, $order_status ); + + if( !empty( $order ) && !empty( $order->id ) ) { + //Gateways that we want to support this can run the action from their own class. pmpro_refund_order( $order ); From af05cf81710812fdcc484802ba3bdce99fa52932 Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Tue, 8 Mar 2022 17:10:12 -0600 Subject: [PATCH 066/145] Apply suggestions from code review for trim() usage, phpdoc info, escaping, and disabled() usage --- .../gateways/class.pmprogateway_paypalexpress.php | 2 +- classes/gateways/class.pmprogateway_stripe.php | 8 ++++---- includes/functions.php | 14 +++++--------- includes/profile.php | 2 +- services/stripe-webhook.php | 2 +- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index 8841a081c..0e9fb6f41 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1104,7 +1104,7 @@ public static function process_refund( $success, $morder ){ global $current_user; // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. - $morder->notes = trim( $morder->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ); + $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); $user = get_user_by( 'email', $morder->Email ); //send an email to the member diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 5ef993ecd..f81eb2525 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4277,7 +4277,7 @@ public function void( &$order, $transaction_id = null ) { * * @return bool True or false if the refund worked. */ - static function refund( $success, $order ) { + public static function refund( $success, $order ) { //default to using the payment id from the order if ( !empty( $order->payment_transaction_id ) ) { @@ -4338,14 +4338,14 @@ static function refund( $success, $order ) { $myemail = new PMProEmail(); $myemail->sendRefundedAdminEmail( $current_user, $order->membership_id ); } else { - $order->notes = trim( $order->notes ) .' '. __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ); + $order->notes = trim( $order->notes . ' ' . __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ) ); } } catch ( \Throwable $e ) { - $order->notes = trim( $order->notes ) .' '. __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); + $order->notes = trim( $order->notes . ' ' . __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() ); } catch ( \Exception $e ) { - $order->notes = trim( $order->notes ) .' '. __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage(); + $order->notes = trim( $order->notes . ' ' . __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() ); } $order->saveOrder(); diff --git a/includes/functions.php b/includes/functions.php index c7efa65e5..3a413ebe2 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3998,15 +3998,12 @@ function pmpro_allowed_refunds( $order ) { } /** - * Processes a refund for Stripe orders + * Allow filtering the list of statuses that can not be refunded from. * - * @since TBA + * @since TBD * - * @param bool Default return value is false to determine if the refund was successfully processed. - * @param object $order The Member Order we want to refund - * @return bool If the refund was successfully processed + * @param array $disallowed_statuses The list of statuses that can not be refunded from. */ - $disallowed_statuses = apply_filters( 'pmpro_disallowed_refund_statuses', array( 'pending', 'refunded' ) ); if( @@ -4055,9 +4052,8 @@ function pmpro_refund_order( $order ){ * * @since TBD * - * @param bool Default return value is false to determine if the refund was successfully processed. - * @param object $order The Member Order we want to refund - * @return bool If the refund was successfully processed + * @param bool $success Default return value is false to determine if the refund was successfully processed. + * @param object $order The Member Order we want to refund. */ $success = apply_filters( 'pmpro_process_refund_paypal', false, $order ); } diff --git a/includes/profile.php b/includes/profile.php index bc11e9065..2e36e56b0 100644 --- a/includes/profile.php +++ b/includes/profile.php @@ -133,7 +133,7 @@ function pmpro_membership_level_profile_fields($user) - + notes = trim( $morder->notes ) .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); + $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); $morder->SaveOrder(); From 4fe799258884264efaa597624a5591774279728f Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Tue, 8 Mar 2022 17:10:59 -0600 Subject: [PATCH 067/145] Fix whitespace --- includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/functions.php b/includes/functions.php index 3a413ebe2..a818d528e 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3959,7 +3959,7 @@ function pmpro_get_ip() { 'HTTP_X_IP_TRAIL', 'HTTP_X_REAL_IP', 'HTTP_X_VARNISH', - 'REMOTE_ADDR', + 'REMOTE_ADDR', ); foreach ( $address_headers as $header ) { From 95d21dbe31d3f1ad8af2e8d7562e26ce5aa13f9e Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Tue, 8 Mar 2022 18:04:00 -0600 Subject: [PATCH 068/145] Implement the refund link the same as line 1515 --- adminpages/orders.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index da25e8c5a..0acbe04c5 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -436,9 +436,16 @@

    #id ); ?>: code ); ?>

    - - " class="page-title-action"> - + %3$s', + esc_attr__( 'Refund', 'paid-memberships-pro' ), + esc_js( 'javascript:pmpro_askfirst(' . wp_json_encode( $refund_text ) . ', ' . wp_json_encode( $refund_nonce_url ) . '); void(0);' ), + esc_html__( 'Refund', 'paid-memberships-pro' ) + ); + } + ?>

    From ba2d044e3cdc8637dab0c16729a6b31342bd3d19 Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Wed, 9 Mar 2022 11:45:39 -0600 Subject: [PATCH 069/145] Add additional check for payment transaction ID being set in order to refund the order --- includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/functions.php b/includes/functions.php index a818d528e..49000fcb5 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3993,7 +3993,7 @@ function pmpro_get_ip() { */ function pmpro_allowed_refunds( $order ) { - if( empty( $order ) || empty( $order->gateway ) || empty( $order->status ) ) { + if( empty( $order ) || empty( $order->gateway ) || empty( $order->status ) || empty( $order->payment_transaction_id ) ) { return false; } From 6ce0642ee0fe9d7e8aebde9407181412df97ff34 Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Fri, 11 Mar 2022 12:42:10 -0600 Subject: [PATCH 070/145] Add cron helper functions and implement filter to hook into to register Stripe sub cron --- .../gateways/class.pmprogateway_stripe.php | 20 ++- includes/cron.php | 124 ++++++++++++++++++ includes/functions.php | 3 +- includes/license.php | 8 +- includes/updates/upgrade_1_8_7.php | 6 +- includes/updates/upgrade_2_6.php | 2 +- includes/upgradecheck.php | 4 +- paid-memberships-pro.php | 9 +- 8 files changed, 160 insertions(+), 16 deletions(-) create mode 100644 includes/cron.php diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 5ced05d6b..428125780 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -26,6 +26,7 @@ // loading plugin activation actions add_action( 'activate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_activation' ) ); add_action( 'deactivate_paid-memberships-pro', array( 'PMProGateway_stripe', 'pmpro_deactivation' ) ); +add_filter( 'pmpro_registered_crons', array( 'PMProGateway_stripe', 'register_cron' ) ); /** * PMProGateway_stripe Class @@ -940,7 +941,7 @@ static function user_profile_fields_save( $user_id ) { * @since 1.8 */ public static function pmpro_activation() { - pmpro_maybe_schedule_event( time(), 'daily', 'pmpro_cron_stripe_subscription_updates' ); + pmpro_maybe_schedule_cron( time(), 'daily', 'pmpro_cron_stripe_subscription_updates' ); } /** @@ -955,6 +956,23 @@ public static function pmpro_deactivation() { wp_clear_scheduled_hook( 'pmpro_cron_stripe_subscription_updates' ); } + /** + * Register the cron we need for Stripe subscription updates. + * + * @since TBD + * + * @param array $crons The list of registered crons for Paid Memberships Pro. + * + * @return array The list of registered crons for Paid Memberships Pro. + */ + public static function register_cron( $crons ) { + $crons['pmpro_cron_stripe_subscription_updates'] = [ + 'interval' => 'daily', + ]; + + return $crons; + } + /** * Cron job for subscription updates. * diff --git a/includes/cron.php b/includes/cron.php new file mode 100644 index 000000000..a9fa73e04 --- /dev/null +++ b/includes/cron.php @@ -0,0 +1,124 @@ + [ + 'interval' => 'hourly', + ], + 'pmpro_cron_expiration_warnings' => [ + 'interval' => 'hourly', + 'timestamp' => current_time( 'timestamp' ) + 1, + ], + 'pmpro_cron_credit_card_expiring_warnings' => [ + 'interval' => 'monthly', + ], + 'pmpro_cron_admin_activity_email' => [ + 'interval' => 'daily', + 'timestamp' => strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), + ], + 'pmpro_license_check_key' => [ + 'interval' => 'monthly', + ], + ]; + + /** + * Allow filtering the list of registered crons for Paid Memberships Pro. + * + * @since TBD + * + * @param array $crons The list of registered crons for Paid Memberships Pro. + */ + $crons = (array) apply_filters( 'pmpro_registered_crons', $crons ); + + // Set up the default information for each cron if not set. + foreach ( $crons as $hook => $cron ) { + if ( empty( $cron['timestamp'] ) ) { + $cron['timestamp'] = current_time( 'timestamp' ); + } + + if ( empty( $cron['recurrence'] ) ) { + $cron['recurrence'] = 'hourly'; + } + + if ( empty( $cron['args'] ) ) { + $cron['args'] = []; + } + + $crons[ $hook ] = $cron; + } + + return $crons; +} + +/** + * Maybe schedule our registered crons. + * + * @since TBD + */ +function pmpro_maybe_schedule_crons() { + $crons = pmpro_get_crons(); + + foreach ( $crons as $hook => $cron ) { + pmpro_maybe_schedule_cron( $cron['timestamp'], $cron['recurrence'], $hook, $cron['args'] ); + } +} + +/** + * Handle rescheduling Paid Memberships Pro crons when checking for ready cron tasks. + * + * @since TBD + * + * @param null|array[] $pre Array of ready cron tasks to return instead. Default null + * to continue using results from _get_cron_array(). + * + * @return null|array[] Array of ready cron tasks to return instead. Default null + * to continue using results from _get_cron_array(). + */ +function pmpro_handle_schedule_crons_on_cron_ready_check( $pre ) { + pmpro_maybe_schedule_crons(); + + return $pre; +} + +add_filter( 'pre_get_ready_cron_jobs', 'pmpro_handle_schedule_crons_on_cron_ready_check' ); + +/** + * Schedule a periodic event unless one with the same hook is already scheduled. + * + * @since TBD + * + * @see wp_schedule_event() + * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/ + * + * @param int $timestamp Unix timestamp (UTC) for when to next run the event. + * @param string $recurrence How often the event should subsequently recur. + * See wp_get_schedules() for accepted values. + * @param string $hook Action hook to execute when the event is run. + * @param array $args Optional. Array containing arguments to pass to the + * hook's callback function. Each value in the array + * is passed to the callback as an individual parameter. + * The array keys are ignored. Default empty array. + * + * @return bool|WP_Error True when an event is scheduled, WP_Error on failure, and false if the event was already scheduled. + */ +function pmpro_maybe_schedule_cron( $timestamp, $recurrence, $hook, $args = [] ) { + $next = wp_next_scheduled( $hook, $args ); + + if ( empty( $next ) ) { + return wp_schedule_event( $timestamp, $recurrence, $hook, $args, true ); + } + + return false; +} diff --git a/includes/functions.php b/includes/functions.php index 7cf230d83..a45ea98fe 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3333,6 +3333,8 @@ function pmpro_generatePages( $pages ) { * @param array $args Optional. Arguments to pass to the hook's callback function. * @return false|void False when an event is not scheduled. * @since 1.8.7.3 + * + * @deprecated TBD Use pmpro_maybe_schedule_cron() going forward. */ function pmpro_maybe_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) { $next = wp_next_scheduled( $hook, $args ); @@ -3342,7 +3344,6 @@ function pmpro_maybe_schedule_event( $timestamp, $recurrence, $hook, $args = arr return false; } } - /** * Get an array of orders for a specific checkout ID * diff --git a/includes/license.php b/includes/license.php index 1ac843b68..28948156f 100644 --- a/includes/license.php +++ b/includes/license.php @@ -87,15 +87,15 @@ function pmpro_license_isValid($key = NULL, $type = NULL, $force = false) { */ //activation function pmpro_license_activation() { - pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_license_check_key'); + pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'monthly', 'pmpro_license_check_key' ); } -register_activation_hook(__FILE__, 'pmpro_activation'); +add_action( 'activate_paid-memberships-pro', 'pmpro_license_activation' ); //deactivation function pmpro_license_deactivation() { - wp_clear_scheduled_hook('pmpro_license_check_key'); + wp_clear_scheduled_hook( 'pmpro_license_check_key' ); } -register_deactivation_hook(__FILE__, 'pmpro_deactivation'); +add_action( 'deactivate_paid-memberships-pro', 'pmpro_license_deactivation' ); /** * Check a key against the PMPro license server. diff --git a/includes/updates/upgrade_1_8_7.php b/includes/updates/upgrade_1_8_7.php index 58ecc69bd..ca1dd70c4 100644 --- a/includes/updates/upgrade_1_8_7.php +++ b/includes/updates/upgrade_1_8_7.php @@ -25,9 +25,9 @@ function pmpro_upgrade_1_8_7() { _set_cron_array($jobs); //add the three we want back - pmpro_maybe_schedule_event(current_time('timestamp'), 'daily', 'pmpro_cron_expire_memberships'); - pmpro_maybe_schedule_event(current_time('timestamp')+1, 'daily', 'pmpro_cron_expiration_warnings'); - pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); + pmpro_maybe_schedule_cron(current_time('timestamp'), 'daily', 'pmpro_cron_expire_memberships'); + pmpro_maybe_schedule_cron(current_time('timestamp')+1, 'daily', 'pmpro_cron_expiration_warnings'); + pmpro_maybe_schedule_cron(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); pmpro_setOption("db_version", "1.87"); diff --git a/includes/updates/upgrade_2_6.php b/includes/updates/upgrade_2_6.php index 620ab50fa..d8d5bf55d 100644 --- a/includes/updates/upgrade_2_6.php +++ b/includes/updates/upgrade_2_6.php @@ -42,5 +42,5 @@ function pmpro_upgrade_2_6() { if ( ! empty( $next ) ) { wp_unschedule_event( $next, 'pmpro_cron_expire_memberships' ); } - pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); + pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); } \ No newline at end of file diff --git a/includes/upgradecheck.php b/includes/upgradecheck.php index 229fe92c2..5c9c07484 100644 --- a/includes/upgradecheck.php +++ b/includes/upgradecheck.php @@ -105,7 +105,7 @@ function pmpro_checkForUpgrades() if($pmpro_db_version < 1.72) { //schedule the credit card expiring cron - pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); + pmpro_maybe_schedule_cron(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); pmpro_setOption("db_version", "1.72"); $pmpro_db_version = 1.72; @@ -234,7 +234,7 @@ function pmpro_checkForUpgrades() } if ( $pmpro_db_version < 2.3 ) { - pmpro_maybe_schedule_event( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); + pmpro_maybe_schedule_cron( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); pmpro_setOption( 'db_version', '2.3' ); } diff --git a/paid-memberships-pro.php b/paid-memberships-pro.php index 8477452ef..436431815 100644 --- a/paid-memberships-pro.php +++ b/paid-memberships-pro.php @@ -40,6 +40,7 @@ require_once( PMPRO_DIR . '/includes/license.php' ); // defines location of addons data and licenses } +require_once( PMPRO_DIR . '/includes/crons.php' ); // cron-related functionality require_once( PMPRO_DIR . '/scheduled/crons.php' ); // crons for expiring members, sending expiration emails, etc require_once( PMPRO_DIR . '/classes/class.memberorder.php' ); // class to process and save orders @@ -201,10 +202,10 @@ function pmpro_cron_schedules_monthly( $schedules ) { // activation function pmpro_activation() { // schedule crons - pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); - pmpro_maybe_schedule_event( current_time( 'timestamp' ) + 1, 'hourly', 'pmpro_cron_expiration_warnings' ); - pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'monthly', 'pmpro_cron_credit_card_expiring_warnings' ); - pmpro_maybe_schedule_event( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); + pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); + pmpro_maybe_schedule_cron( current_time( 'timestamp' ) + 1, 'hourly', 'pmpro_cron_expiration_warnings' ); + pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'monthly', 'pmpro_cron_credit_card_expiring_warnings' ); + pmpro_maybe_schedule_cron( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); pmpro_set_capabilities_for_role( 'administrator', 'enable' ); From 350a024dd7be5abceeaac26f55845ca7ce9f318b Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Fri, 11 Mar 2022 13:01:32 -0600 Subject: [PATCH 071/145] Implement pmpro_get_crons() function for Site Health checks --- classes/class-pmpro-site-health.php | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/classes/class-pmpro-site-health.php b/classes/class-pmpro-site-health.php index 5e031a477..8d4d5de71 100644 --- a/classes/class-pmpro-site-health.php +++ b/classes/class-pmpro-site-health.php @@ -313,18 +313,7 @@ public function get_cron_jobs() { $cron_times = []; // These are our crons. - $expected_crons = [ - 'pmpro_cron_expire_memberships', - 'pmpro_cron_expiration_warnings', - 'pmpro_cron_credit_card_expiring_warnings', - 'pmpro_cron_admin_activity_email', - ]; - - $gateway = pmpro_getOption( 'gateway' ); - - if ( 'stripe' === $gateway ) { - $expected_crons[] = 'pmpro_cron_stripe_subscription_updates'; - } + $expected_crons = array_keys( pmpro_get_crons() ); // Find any of our crons and when their next run is. if ( $crons ) { @@ -366,7 +355,7 @@ public function get_pmpro_pages() { global $pmpro_pages; $page_information = array(); - + if( !empty( $pmpro_pages ) ){ foreach( $pmpro_pages as $key => $val ){ From 1b5fed86a55057280b44940ca3c48ef4351ad3f5 Mon Sep 17 00:00:00 2001 From: Scott Kingsley Clark Date: Mon, 14 Mar 2022 16:30:54 -0500 Subject: [PATCH 072/145] Update file name --- includes/{cron.php => crons.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename includes/{cron.php => crons.php} (100%) diff --git a/includes/cron.php b/includes/crons.php similarity index 100% rename from includes/cron.php rename to includes/crons.php From f8cdba4151bb0111b5334754fcb8d016fa64000c Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 18 Mar 2022 13:50:18 -0400 Subject: [PATCH 073/145] Fixing error message when Stripe Checkout cannot get customer. --- classes/gateways/class.pmprogateway_stripe.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 95c962b37..233904e50 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1569,7 +1569,7 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) if ( empty( $customer ) ) { // There was an issue creating/updating the Stripe customer. // $order will have an error message. - pmpro_setMessage( __( 'Could not get customer. ', 'paid-memberships-pro' ) . $order->error, 'pmpro_error', true ); + pmpro_setMessage( __( 'Could not get customer. ', 'paid-memberships-pro' ) . $morder->error, 'pmpro_error', true ); return; } From 763ee1fe8f917df1b4eb9eab86d3854771179964 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Wed, 23 Mar 2022 16:45:53 +0200 Subject: [PATCH 074/145] Improvements to filters interacting with gateways --- .../gateways/class.pmprogateway_stripe.php | 3 +- includes/functions.php | 82 +++++++++++-------- 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index ab84c582e..f502fbaab 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4318,8 +4318,7 @@ public static function refund( $success, $order ) { ] ); //Make sure we're refunding an order that was successful - if ( $refund->status == 'succeeded' ) { - + if ( !in_array( $refund->status, pmpro_disallowed_refund_statuses() ) ) { $order->status = 'refunded'; $success = true; diff --git a/includes/functions.php b/includes/functions.php index eb87427b7..f5ef5acb5 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -4084,27 +4084,37 @@ function pmpro_get_ip() { */ function pmpro_allowed_refunds( $order ) { + //If this isn't a valid order then lets not allow it if( empty( $order ) || empty( $order->gateway ) || empty( $order->status ) || empty( $order->payment_transaction_id ) ) { return false; } + $disallowed_statuses = pmpro_disallowed_refund_statuses(); + /** - * Allow filtering the list of statuses that can not be refunded from. + * Specify which gateways support refund functionality * * @since TBD * - * @param array $disallowed_statuses The list of statuses that can not be refunded from. + * @param bool $okay If an order can be refunded */ - $disallowed_statuses = apply_filters( 'pmpro_disallowed_refund_statuses', array( 'pending', 'refunded' ) ); + $allowed_gateways = apply_filters( 'pmpro_allowed_refunds_gateways', array( 'stripe', 'paypalexpress' ) ); - if( - !in_array( $order->status, $disallowed_statuses, true ) && //Don't allow pending orders to be refunded - in_array( $order->gateway, array( 'stripe', 'paypalexpress' ), true ) //Only apply to these gateways - ) { - return true; + $okay = false; + + //Don't allow pending orders to be refunded + if( !in_array( $order->status, $disallowed_statuses, true ) ){ + $okay = true; } - return false; + //Only apply to these gateways + if( in_array( $order->gateway, $allowed_gateways, true ) ) { + $okay = true; + } + + $okay = apply_filters( 'pmpro_refund_allowed', $okay, $order ); + + return $okay; } @@ -4116,7 +4126,7 @@ function pmpro_allowed_refunds( $order ) { function pmpro_refund_order( $order ){ if( empty( $order ) ){ - return; + return false; } //Not going to refund an order that has already been refunded @@ -4124,33 +4134,37 @@ function pmpro_refund_order( $order ){ return true; } - if( $order->gateway === 'stripe' ) { - /** - * Processes a refund for Stripe orders - * - * @since TBD - * - * @param bool Default return value is false to determine if the refund was successfully processed. - * @param object $order The Member Order we want to refund - * @return bool If the refund was successfully processed - */ - $success = apply_filters( 'pmpro_process_refund_stripe', false, $order ); - } + /** + * Processes a refund for a specific gateway + * + * @since TBD + * + * @param bool $success Default return value is false to determine if the refund was successfully processed. + * @param object $order The Member Order we want to refund. + */ + $success = apply_filters( 'pmpro_process_refund_'.$order->gateway, false, $order ); + + return $success; - if( strpos( $order->gateway, 'paypal' ) !== FALSE ) { - /** - * Processes a refund for PayPal orders - * - * @since TBD - * - * @param bool $success Default return value is false to determine if the refund was successfully processed. - * @param object $order The Member Order we want to refund. - */ - $success = apply_filters( 'pmpro_process_refund_paypal', false, $order ); - } +} - return $success; +/** + * Returns an array of order statuses that do not qualify for a refund + * + * @return array Returns an array of statuses that are not allowe to be refunded + */ +function pmpro_disallowed_refund_statuses() { + + /** + * Allow filtering the list of statuses that can not be refunded from. + * + * @since TBD + * + * @param array $disallowed_statuses The list of statuses that can not be refunded from. + */ + $disallowed_statuses = apply_filters( 'pmpro_disallowed_refund_statuses', array( 'pending', 'refunded', 'review', 'token', 'error' ) ); + return $disallowed_statuses; } /* Send the WP new user notification email, but also check our filter. From 7df0400ac567f10f0c96dd78108b53415697ed79 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Thu, 24 Mar 2022 16:30:21 +0200 Subject: [PATCH 075/145] Tidied up code. Docblocs updated. Refunds not allowed on $0 orders --- .../class.pmprogateway_paypalexpress.php | 8 +++---- .../gateways/class.pmprogateway_stripe.php | 20 ++++++++-------- includes/functions.php | 23 +++++++++++-------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index f2f06996c..d4415cf20 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -71,7 +71,7 @@ static function init() add_filter('pmpro_checkout_default_submit_button', array('PMProGateway_paypalexpress', 'pmpro_checkout_default_submit_button')); add_action('http_api_curl', array('PMProGateway_paypalexpress', 'http_api_curl'), 10, 3); } - add_filter( 'pmpro_process_refund_paypal', array('PMProGateway_paypalexpress', 'process_refund' ), 10, 2 ); + add_filter( 'pmpro_process_refund_paypalexpress', array('PMProGateway_paypalexpress', 'process_refund' ), 10, 2 ); } /** @@ -1115,9 +1115,9 @@ public static function process_refund( $success, $morder ){ global $current_user; // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. - $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); + $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); - $user = get_user_by( 'email', $morder->Email ); + $user = get_user_by( 'id', $morder->user_id ); //send an email to the member $myemail = new PMProEmail(); $myemail->sendRefundedEmail( $user ); @@ -1130,7 +1130,7 @@ public static function process_refund( $success, $morder ){ //The refund failed, so lets return the gateway message // translators: %1$s is the Transaction ID. %1$s is the Gateway Error - $morder->notes = trim( $morder->notes .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s ', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ) ); + $morder->notes = trim( $morder->notes .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s.', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ) ); } $morder->SaveOrder(); diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index f502fbaab..19d46e4d4 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -178,7 +178,7 @@ public static function init() { add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_show_errors' ) ); add_action( 'admin_notices', array( 'PMProGateway_stripe', 'stripe_connect_deauthorize' ) ); - add_filter( 'pmpro_process_refund_stripe', array( 'PMProGateway_stripe', 'refund' ), 10, 2 ); + add_filter( 'pmpro_process_refund_stripe', array( 'PMProGateway_stripe', 'process_refund' ), 10, 2 ); } /** @@ -4268,14 +4268,15 @@ public function void( &$order, $transaction_id = null ) { } /** - * Refund a payment or invoice - * - * @param object &$order Related PMPro order object. - * @param string $transaction_id Payment or invoice id to void. + * Refunds an order (only supports full amounts) * - * @return bool True or false if the refund worked. + * @param bool Status of the refund (default: false) + * @param object The Member Order Object + * @since TBD + * + * @return bool Status of the processed refund */ - public static function refund( $success, $order ) { + public static function process_refund( $success, $order ) { //default to using the payment id from the order if ( !empty( $order->payment_transaction_id ) ) { @@ -4325,11 +4326,12 @@ public static function refund( $success, $order ) { global $current_user; - $order->notes = trim( $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); + $order->notes = trim( $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); + $user = get_user_by( 'id', $order->user_id ); //send an email to the member $myemail = new PMProEmail(); - $myemail->sendRefundedEmail( $current_user ); + $myemail->sendRefundedEmail( $user ); //send an email to the admin $myemail = new PMProEmail(); diff --git a/includes/functions.php b/includes/functions.php index f5ef5acb5..27e4feaa2 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -4087,30 +4087,33 @@ function pmpro_allowed_refunds( $order ) { //If this isn't a valid order then lets not allow it if( empty( $order ) || empty( $order->gateway ) || empty( $order->status ) || empty( $order->payment_transaction_id ) ) { return false; + } + + //Orders with a 0 total shouldn't be able to be refunded + if( $order->total == 0 ){ + return false; } - $disallowed_statuses = pmpro_disallowed_refund_statuses(); + $okay = false; /** * Specify which gateways support refund functionality * * @since TBD * - * @param bool $okay If an order can be refunded + * @param array $allowed_gateways A list of allowed gateways to work with refunds */ $allowed_gateways = apply_filters( 'pmpro_allowed_refunds_gateways', array( 'stripe', 'paypalexpress' ) ); - - $okay = false; - - //Don't allow pending orders to be refunded - if( !in_array( $order->status, $disallowed_statuses, true ) ){ - $okay = true; - } - //Only apply to these gateways if( in_array( $order->gateway, $allowed_gateways, true ) ) { $okay = true; } + + $disallowed_statuses = pmpro_disallowed_refund_statuses(); + //Don't allow pending orders to be refunded + if( in_array( $order->status, $disallowed_statuses, true ) ){ + $okay = false; + } $okay = apply_filters( 'pmpro_refund_allowed', $okay, $order ); From a455e896443506776889e0aab5c461fcf1d04311 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Fri, 25 Mar 2022 09:59:34 +0200 Subject: [PATCH 076/145] Existing method deprecated. Notice added back in --- .../gateways/class.pmprogateway_stripe.php | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 19d46e4d4..46c00db32 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -4352,6 +4352,88 @@ public static function process_refund( $success, $order ) { return $success; } + /** + * Refund a payment or invoice + * + * @deprecated 2.7.0. + * + * @param object &$order Related PMPro order object. + * @param string $transaction_id Payment or invoice id to void. + * + * @return bool True or false if the refund worked. + */ + public function refund( &$order, $transaction_id = null ) { + _deprecated_function( __FUNCTION__, '2.7.0' ); + //default to using the payment id from the order + if ( empty( $transaction_id ) && ! empty( $order->payment_transaction_id ) ) { + $transaction_id = $order->payment_transaction_id; + } + + //need a transaction id + if ( empty( $transaction_id ) ) { + return false; + } + + //if an invoice ID is passed, get the charge/payment id + if ( strpos( $transaction_id, "in_" ) !== false ) { + $invoice = Stripe_Invoice::retrieve( $transaction_id ); + + if ( ! empty( $invoice ) && ! empty( $invoice->charge ) ) { + $transaction_id = $invoice->charge; + } + } + + //get the charge + try { + $charge = Stripe_Charge::retrieve( $transaction_id ); + } catch ( \Throwable $e ) { + $charge = false; + } catch ( \Exception $e ) { + $charge = false; + } + + //can't find the charge? + if ( empty( $charge ) ) { + $order->status = "error"; + $order->errorcode = ""; + $order->error = ""; + $order->shorterror = ""; + + return false; + } + + //attempt refund + try { + $refund = $charge->refund(); + } catch ( \Throwable $e ) { + $order->errorcode = true; + $order->error = __( "Error: ", 'paid-memberships-pro' ) . $e->getMessage(); + $order->shorterror = $order->error; + + return false; + } catch ( \Exception $e ) { + $order->errorcode = true; + $order->error = __( "Error: ", 'paid-memberships-pro' ) . $e->getMessage(); + $order->shorterror = $order->error; + + return false; + } + + if ( $refund->status == "succeeded" ) { + $order->status = "refunded"; + $order->saveOrder(); + + return true; + } else { + $order->status = "error"; + $order->errorcode = true; + $order->error = sprintf( __( "Error: Unkown error while refunding charge #%s", 'paid-memberships-pro' ), $transaction_id ); + $order->shorterror = $order->error; + + return false; + } + } + /** * @deprecated 2.7.0. Use get_payment_method() instead. */ From 123c25a267aa8a9c6fe1cc3184538207ec8ecc60 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 25 Mar 2022 10:35:18 -0400 Subject: [PATCH 077/145] Now sending tax to Stripe Checkout for initial payment --- classes/gateways/class.pmprogateway_stripe.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index cbde8ca68..bbeace71c 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1588,7 +1588,10 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) // First, let's handle the initial payment. if ( ! empty( $morder->InitialPayment ) ) { - $initial_payment_price = $stripe->get_price_for_product( $product_id, $morder->InitialPayment ); + $initial_subtotal = $morder->InitialPayment; + $initial_tax = $morder->getTaxForPrice( $initial_subtotal ); + $initial_payment_amount = pmpro_round_price( (float) $initial_subtotal + (float) $initial_tax ); + $initial_payment_price = $stripe->get_price_for_product( $product_id, $initial_payment_amount ); if ( is_string( $initial_payment_price ) ) { // There was an error getting the price. pmpro_setMessage( __( 'Could not get price for initial payment. ', 'paid-memberships-pro' ) . $initial_payment_price, 'pmpro_error', true ); @@ -1610,9 +1613,9 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) // Now, let's handle the recurring payments. if ( pmpro_isLevelRecurring( $morder->membership_level ) ) { - $subtotal = $morder->PaymentAmount; - $tax = $morder->getTaxForPrice( $subtotal ); - $recurring_payment_amount = pmpro_round_price( (float) $subtotal + (float) $tax ); + $recurring_subtotal = $morder->PaymentAmount; + $recurring_tax = $morder->getTaxForPrice( $recurring_subtotal ); + $recurring_payment_amount = pmpro_round_price( (float) $recurring_subtotal + (float) $recurring_tax ); $recurring_payment_price = $stripe->get_price_for_product( $product_id, $recurring_payment_amount, $morder->BillingPeriod, $morder->BillingFrequency ); if ( is_string( $recurring_payment_price ) ) { // There was an error getting the price. From e7114ddefb0068fd3b297a77b4c71f6cee30e58f Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 25 Mar 2022 10:53:38 -0400 Subject: [PATCH 078/145] Improved error message when Stripe cannot find a payment method. --- classes/gateways/class.pmprogateway_stripe.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index bbeace71c..54249fd72 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1792,7 +1792,7 @@ public function process( &$order ) { $payment_method = $this->get_payment_method( $order ); if ( empty( $payment_method ) ) { // There was an issue getting the payment method. - $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ); + $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . ' ' . $order->error; $order->shorterror = $order->error; return false; } @@ -2045,7 +2045,7 @@ public function update( &$order ) { $payment_method = $this->get_payment_method( $order ); if ( empty( $payment_method ) ) { // There was an issue getting the payment method. - $order->error = __( "Error retrieving payment method.", 'paid-memberships-pro' ); + $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . ' ' . $order->error; $order->shorterror = $order->error; return false; } From 2505c676411451cd7f457e73b6354612977dbb31 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 25 Mar 2022 11:45:57 -0400 Subject: [PATCH 079/145] Improved error handling when can't get Stripe customer portal URL --- .../gateways/class.pmprogateway_stripe.php | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 54249fd72..ee6cc5360 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1702,34 +1702,42 @@ public static function pmpro_billing_preheader_stripe_checkout() { // Check whether the user's most recent order is a Stripe subscription. if ( empty( $user_order->gateway ) || 'stripe' !== $user_order->gateway ) { - return; + $error = __( 'Last order was not charged with Stripe.', 'paid-memberships-pro' ); } - $stripe = new PMProGateway_stripe(); - $customer = $stripe->get_customer_for_user( $user_order->user_id ); - if ( empty( $customer->id ) ) { - return; + if ( empty( $error ) ) { + $stripe = new PMProGateway_stripe(); + $customer = $stripe->get_customer_for_user( $user_order->user_id ); + if ( empty( $customer->id ) ) { + $error = __( 'Could not get Stripe customer for user.', 'paid-memberships-pro' ); + } } - $customer_portal_url = $stripe->get_customer_portal_url( $customer->id ); - if ( ! empty( $customer_portal_url ) ) { - wp_redirect( $customer_portal_url ); - exit; + if ( empty( $error ) ) { + $customer_portal_url = $stripe->get_customer_portal_url( $customer->id ); + if ( ! empty( $customer_portal_url ) ) { + wp_redirect( $customer_portal_url ); + exit; + } + $error = __( 'Could not get Customer Portal URL. This feature may not be set up in Stripe.', 'paid-memberships-pro' ); } - } else { - // Disable Stripe Checkout functionality for the rest of this page load. - add_filter( 'pmpro_include_cardtype_field', array( - 'PMProGateway_stripe', - 'pmpro_include_billing_address_fields' - ), 15 ); - add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ), 15 ); - add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ), 15 ); - add_filter( 'pmpro_include_payment_information_fields', array( - 'PMProGateway_stripe', - 'pmpro_include_payment_information_fields' - ), 15 ); - add_filter( 'option_pmpro_stripe_payment_flow', '__return_false' ); // Disable Stripe Checkout for rest of page load. + + // There must have been an error while getting the customer portal URL. Show an error and let user update + // their billing info onsite. + pmpro_setMessage( $error . ' ' . __( 'Please contact the site administrator.', 'paid-memberships-pro' ), 'pmpro_alert', true ); } + // Disable Stripe Checkout functionality for the rest of this page load. + add_filter( 'pmpro_include_cardtype_field', array( + 'PMProGateway_stripe', + 'pmpro_include_billing_address_fields' + ), 15 ); + add_action( 'pmpro_billing_preheader', array( 'PMProGateway_stripe', 'pmpro_checkout_after_preheader' ), 15 ); + add_filter( 'pmpro_billing_order', array( 'PMProGateway_stripe', 'pmpro_checkout_order' ), 15 ); + add_filter( 'pmpro_include_payment_information_fields', array( + 'PMProGateway_stripe', + 'pmpro_include_payment_information_fields' + ), 15 ); + add_filter( 'option_pmpro_stripe_payment_flow', '__return_false' ); // Disable Stripe Checkout for rest of page load. } /**************************************** From 8047d70ea09ab4cd187ccb5651509f423b8a4bc0 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 25 Mar 2022 11:50:29 -0400 Subject: [PATCH 080/145] Fixed undefined variable error --- classes/gateways/class.pmprogateway_stripe.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 54249fd72..6c580472e 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1792,7 +1792,7 @@ public function process( &$order ) { $payment_method = $this->get_payment_method( $order ); if ( empty( $payment_method ) ) { // There was an issue getting the payment method. - $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . ' ' . $order->error; + $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' , ' ' . $order->error; $order->shorterror = $order->error; return false; } @@ -2045,7 +2045,7 @@ public function update( &$order ) { $payment_method = $this->get_payment_method( $order ); if ( empty( $payment_method ) ) { // There was an issue getting the payment method. - $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . ' ' . $order->error; + $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' , ' ' . $order->error; $order->shorterror = $order->error; return false; } From 4d6c7090713cb13c57c8cb50fc9062d516615fc5 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Fri, 25 Mar 2022 11:52:20 -0400 Subject: [PATCH 081/145] Fixed undefined variable error. --- classes/gateways/class.pmprogateway_stripe.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 6c580472e..dfeecda9e 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1792,7 +1792,7 @@ public function process( &$order ) { $payment_method = $this->get_payment_method( $order ); if ( empty( $payment_method ) ) { // There was an issue getting the payment method. - $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' , ' ' . $order->error; + $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' : ' ' . $order->error; $order->shorterror = $order->error; return false; } @@ -2045,7 +2045,7 @@ public function update( &$order ) { $payment_method = $this->get_payment_method( $order ); if ( empty( $payment_method ) ) { // There was an issue getting the payment method. - $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' , ' ' . $order->error; + $order->error = __( 'Error retrieving payment method.', 'paid-memberships-pro' ) . empty( $order->error ) ? '' : ' ' . $order->error; $order->shorterror = $order->error; return false; } From 7364fff7680b93076097c95915147dbf0f69ec7c Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 28 Mar 2022 20:17:29 -0400 Subject: [PATCH 082/145] Updating block names, descriptions, keywords, and groupings; some block editor style improvemnets --- blocks/account-invoices-section/block.js | 21 +- blocks/account-links-section/block.js | 21 +- blocks/account-membership-section/block.js | 19 +- blocks/account-page/block.js | 26 +- blocks/account-profile-section/block.js | 18 +- blocks/billing-page/block.js | 18 +- blocks/blocks.js | 1 + blocks/blocks.php | 4 + blocks/cancel-page/block.js | 18 +- blocks/checkout-button/block.js | 13 +- blocks/checkout-page/block.js | 15 +- blocks/confirmation-page/block.js | 20 +- blocks/invoice-page/block.js | 19 +- blocks/levels-page/block.js | 16 +- blocks/login/block.js | 69 +- blocks/member-profile-edit/block.js | 61 +- blocks/membership/block.js | 26 +- css/blocks.editor.css | 37 +- js/blocks.build.js | 1884 +------------------- 19 files changed, 274 insertions(+), 2032 deletions(-) diff --git a/blocks/account-invoices-section/block.js b/blocks/account-invoices-section/block.js index 5a74e696b..d9899f3f5 100644 --- a/blocks/account-invoices-section/block.js +++ b/blocks/account-invoices-section/block.js @@ -19,15 +19,24 @@ export default registerBlockType( 'pmpro/account-invoices-section', { - title: __( 'Membership Account: Invoices', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s invoices.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Account Invoices', 'paid-memberships-pro' ), + description: __( 'Dynamic page section that displays a list of the last 5 membership invoices for the active member.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'archive', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'account', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'order', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'purchases', 'paid-memberships-pro' ), + __( 'receipt', 'paid-memberships-pro' ), + __( 'user', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/account-links-section/block.js b/blocks/account-links-section/block.js index 6ee306b74..cc4884a29 100644 --- a/blocks/account-links-section/block.js +++ b/blocks/account-links-section/block.js @@ -19,15 +19,24 @@ export default registerBlockType( 'pmpro/account-links-section', { - title: __( 'Membership Account: Links', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s member links. This block is only visible if other Add Ons or custom code have added links.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Account Links', 'paid-memberships-pro' ), + description: __( 'Dynamic page section that displays custom links available for the active member only. This block is only visible if other Add Ons or custom code have added links.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'external', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'access', 'paid-memberships-pro' ), + __( 'account', 'paid-memberships-pro' ), + __( 'link', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'quick link', 'paid-memberships-pro' ), + __( 'user', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/account-membership-section/block.js b/blocks/account-membership-section/block.js index d1b4a9b7e..41b0f8a59 100644 --- a/blocks/account-membership-section/block.js +++ b/blocks/account-membership-section/block.js @@ -19,15 +19,22 @@ export default registerBlockType( 'pmpro/account-membership-section', { - title: __( 'Membership Account: Memberships', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s membership information.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Account Memberships', 'paid-memberships-pro' ), + description: __( 'Dynamic page section to display the member\'s active membership information with links to view all membership options, update billing information, and change or cancel membership.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'groups', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'active', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'purchases', 'paid-memberships-pro' ), + __( 'user', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/account-page/block.js b/blocks/account-page/block.js index 4cce0ad7c..b2c1c2706 100644 --- a/blocks/account-page/block.js +++ b/blocks/account-page/block.js @@ -21,15 +21,29 @@ export default registerBlockType( 'pmpro/account-page', { - title: __( 'Membership Account Page', 'paid-memberships-pro' ), - description: __( 'Displays the sections of the Membership Account page as selected below.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Account (Full)', 'paid-memberships-pro' ), + description: __( 'Dynamic page section to display the selected sections of the Membership Account page including Memberships, Profile, Invoices, and Member Links. These sections can also be added via separate blocks.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'admin-users', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'account', 'paid-memberships-pro' ), + __( 'billing', 'paid-memberships-pro' ), + __( 'invoice', 'paid-memberships-pro' ), + __( 'links', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'order', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'profile', 'paid-memberships-pro' ), + __( 'purchases', 'paid-memberships-pro' ), + __( 'quick link', 'paid-memberships-pro' ), + __( 'receipt', 'paid-memberships-pro' ), + __( 'user', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/account-profile-section/block.js b/blocks/account-profile-section/block.js index 5c1ae6402..8bed94b58 100644 --- a/blocks/account-profile-section/block.js +++ b/blocks/account-profile-section/block.js @@ -20,15 +20,21 @@ export default registerBlockType( 'pmpro/account-profile-section', { - title: __( 'Membership Account: Profile', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s profile information.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Account Profile View', 'paid-memberships-pro' ), + description: __( 'Dynamic page section that displays the member\'s profile as read-only information with a link to edit fields or their change password.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'admin-users', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'fields', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'user', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/billing-page/block.js b/blocks/billing-page/block.js index b5ad68cf6..7a152f3f0 100644 --- a/blocks/billing-page/block.js +++ b/blocks/billing-page/block.js @@ -19,15 +19,21 @@ export default registerBlockType( 'pmpro/billing-page', { - title: __( 'Membership Billing Page', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s billing information and allows them to update the payment method.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Billing', 'paid-memberships-pro' ), + description: __( 'Dynamic page section to display the member\'s billing information. Members can update their subscription payment method from this form.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'list-view', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'credit card', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'payment method', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/blocks.js b/blocks/blocks.js index 60aa74c8e..c3b95a5d9 100644 --- a/blocks/blocks.js +++ b/blocks/blocks.js @@ -108,4 +108,5 @@ import './login/block.js'; L5.33,4.91L9.46,3.96z"/> ; wp.blocks.updateCategory( 'pmpro', { icon: PMProSVG } ); + wp.blocks.updateCategory( 'pmpro-pages', { icon: PMProSVG } ); } )(); diff --git a/blocks/blocks.php b/blocks/blocks.php index bad8547eb..4c6f51d4b 100644 --- a/blocks/blocks.php +++ b/blocks/blocks.php @@ -40,6 +40,10 @@ function pmpro_place_blocks_in_panel( $categories, $post_or_context ) { 'slug' => 'pmpro', 'title' => __( 'Paid Memberships Pro', 'paid-memberships-pro' ), ), + array( + 'slug' => 'pmpro-pages', + 'title' => __( 'Paid Memberships Pro Pages', 'paid-memberships-pro' ), + ), ) ); } diff --git a/blocks/cancel-page/block.js b/blocks/cancel-page/block.js index ae8032bb5..caf8be4e1 100644 --- a/blocks/cancel-page/block.js +++ b/blocks/cancel-page/block.js @@ -19,15 +19,21 @@ export default registerBlockType( 'pmpro/cancel-page', { - title: __( 'Membership Cancel Page', 'paid-memberships-pro' ), - description: __( 'Generates the Membership Cancel page.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Cancel', 'paid-memberships-pro' ), + description: __( 'Dynamic page section where members can cancel their membership and active subscription if applicable.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'no', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'payment method', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'terminate', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/checkout-button/block.js b/blocks/checkout-button/block.js index 92bb8f969..26a0a4b3d 100644 --- a/blocks/checkout-button/block.js +++ b/blocks/checkout-button/block.js @@ -29,17 +29,20 @@ export default registerBlockType( 'pmpro/checkout-button', { title: __( 'Membership Checkout Button', 'paid-memberships-pro' ), - description: __( 'Displays a button-styled link to Membership Checkout for the specified level.', 'paid-memberships-pro' ), + description: __( 'Inserts a button that links directly to membership checkout for the selected level.', 'paid-memberships-pro' ), category: 'pmpro', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#658B24', src: 'migrate', }, - keywords: [ - __( 'pmpro', 'paid-memberships-pro' ), + keywords: [ __( 'buy', 'paid-memberships-pro' ), __( 'level', 'paid-memberships-pro' ), + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'purchase', 'paid-memberships-pro' ), ], supports: { }, diff --git a/blocks/checkout-page/block.js b/blocks/checkout-page/block.js index 91219b1ab..9a6897c1f 100644 --- a/blocks/checkout-page/block.js +++ b/blocks/checkout-page/block.js @@ -26,14 +26,21 @@ const { 'pmpro/checkout-page', { title: __( 'Membership Checkout Form', 'paid-memberships-pro' ), - description: __( 'Displays the Membership Checkout form.', 'paid-memberships-pro' ), + description: __( 'Dynamic form that allows users to complete free registration or paid checkout for the selected membership level.', 'paid-memberships-pro' ), category: 'pmpro', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#658B24', src: 'list-view', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'member', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'buy', 'paid-memberships-pro' ), + __( 'purchase', 'paid-memberships-pro' ), + __( 'sell', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/confirmation-page/block.js b/blocks/confirmation-page/block.js index fe9adfe09..beae62af1 100644 --- a/blocks/confirmation-page/block.js +++ b/blocks/confirmation-page/block.js @@ -19,15 +19,23 @@ export default registerBlockType( 'pmpro/confirmation-page', { - title: __( 'Membership Confirmation Page', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s Membership Confirmation after Membership Checkout.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Confirmation', 'paid-memberships-pro' ), + description: __( 'Dynamic page section that displays a confirmation message and purchase information for the active member immediately after membership registration and checkout.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'yes', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'member', 'paid-memberships-pro' ), + __( 'buy', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'purchase', 'paid-memberships-pro' ), + __( 'receipt', 'paid-memberships-pro' ), + __( 'success', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/invoice-page/block.js b/blocks/invoice-page/block.js index d3bd882f3..30b2129fb 100644 --- a/blocks/invoice-page/block.js +++ b/blocks/invoice-page/block.js @@ -19,15 +19,22 @@ export default registerBlockType( 'pmpro/invoice-page', { - title: __( 'Membership Invoice Page', 'paid-memberships-pro' ), - description: __( 'Displays the member\'s Membership Invoices.', 'paid-memberships-pro' ), - category: 'pmpro', + title: __( 'PMPro Page: Invoice', 'paid-memberships-pro' ), + description: __( 'Dynamic page section that displays a list of all invoices (purchase history) for the active member. Each invoice can be selected and viewed in full detail.', 'paid-memberships-pro' ), + category: 'pmpro-pages', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'archive', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'history', 'paid-memberships-pro' ), + __( 'order', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'purchases', 'paid-memberships-pro' ), + __( 'receipt', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/levels-page/block.js b/blocks/levels-page/block.js index b2610f3b4..b0c210c33 100644 --- a/blocks/levels-page/block.js +++ b/blocks/levels-page/block.js @@ -19,15 +19,21 @@ export default registerBlockType( 'pmpro/levels-page', { - title: __( 'Membership Levels List', 'paid-memberships-pro' ), - description: __( 'Displays a list of Membership Levels. To change the order, go to Memberships > Settings > Levels.', 'paid-memberships-pro' ), + title: __( 'Membership Levels and Pricing Table', 'paid-memberships-pro' ), + description: __( 'Dynamic page section that displays a list of membership levels and pricing, linked to membership checkout. To reorder the display, navigate to Memberships > Settings > Levels.', 'paid-memberships-pro' ), category: 'pmpro', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#658B24', src: 'list-view', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'level', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'price', 'paid-memberships-pro' ), + __( 'pricing table', 'paid-memberships-pro' ), + ], supports: { }, attributes: { diff --git a/blocks/login/block.js b/blocks/login/block.js index 434b21901..6b570e95c 100644 --- a/blocks/login/block.js +++ b/blocks/login/block.js @@ -19,37 +19,38 @@ const { Fragment } = wp.element; /** * Register block */ -export default registerBlockType("pmpro/login-form", { - title: __("Log in Form", "paid-memberships-pro"), - description: __( - "Displays a Log In Form for Paid Memberships Pro.", - "paid-memberships-pro" - ), - category: "pmpro", - icon: { - background: "#2997c8", - foreground: "#ffffff", - src: "unlock", - }, - keywords: [ - __("pmpro", "paid-memberships-pro"), - __("login", "paid-memberships-pro"), - __("form", "paid-memberships-pro"), - __("log in", "paid-memberships-pro"), - ], - supports: {}, - edit: (props) => { - return [ - - -
    - {__("Paid Memberships Pro", "paid-memberships-pro")} - {__("Log in Form", "paid-memberships-pro")} -
    -
    , - ]; - }, - save() { - return null; - }, -}); +export default registerBlockType( + 'pmpro/login-form', + { + title: __( 'Login Form', 'paid-memberships-pro' ), + description: __( 'Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.', 'paid-memberships-pro' ), + category: 'pmpro', + icon: { + background: '#FFFFFF', + foreground: '#658B24', + src: 'unlock', + }, + keywords: [ + __( 'log in', 'paid-memberships-pro' ), + __( 'lost password', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'password reset', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + ], + supports: {}, + edit: (props) => { + return [ + + +
    + {__("Paid Memberships Pro", "paid-memberships-pro")} + {__("Log in Form", "paid-memberships-pro")} +
    +
    , + ]; + }, + save() { + return null; + }, + } +); diff --git a/blocks/member-profile-edit/block.js b/blocks/member-profile-edit/block.js index 563c381c7..85c95daac 100644 --- a/blocks/member-profile-edit/block.js +++ b/blocks/member-profile-edit/block.js @@ -13,31 +13,36 @@ const { registerBlockType } = wp.blocks; /** * Register block */ -export default registerBlockType("pmpro/member-profile-edit", { - title: __("Member Profile Edit", "paid-memberships-pro"), - description: __("Allow member profile editing.", "paid-memberships-pro"), - category: "pmpro", - icon: { - background: "#2997c8", - foreground: "#ffffff", - src: "admin-users", - }, - keywords: [ - __("pmpro", "paid-memberships-pro"), - __("member", "paid-memberships-pro"), - __("profile", "paid-memberships-pro"), - ], - edit: (props) => { - return ( -
    - {__("Paid Memberships Pro", "paid-memberships-pro")} - - {__("Member Profile Edit", "paid-memberships-pro")} - -
    - ); - }, - save() { - return null; - }, -}); +export default registerBlockType( + 'pmpro/member-profile-edit', + { + title: __( 'PMPro Page: Account Profile Edit', 'paid-memberships-pro' ), + description: __( 'Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.', 'paid-memberships-pro' ), + category: 'pmpro-pages', + icon: { + background: '#FFFFFF', + foreground: '#1A688B', + src: 'admin-users', + }, + keywords: [ + __( 'custom field', 'paid-memberships-pro' ), + __( 'fields', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'user fields', 'paid-memberships-pro' ), + ], + edit: (props) => { + return ( +
    + {__("Paid Memberships Pro", "paid-memberships-pro")} + + {__("Member Profile Edit", "paid-memberships-pro")} + +
    + ); + }, + save() { + return null; + }, + } +); diff --git a/blocks/membership/block.js b/blocks/membership/block.js index a6419b958..0c70e0da6 100644 --- a/blocks/membership/block.js +++ b/blocks/membership/block.js @@ -28,15 +28,25 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ export default registerBlockType( 'pmpro/membership', { - title: __( 'Require Membership Block', 'paid-memberships-pro' ), - description: __( 'Control the visibility of nested blocks for members or non-members.', 'paid-memberships-pro' ), + title: __( 'Membership Required Block', 'paid-memberships-pro' ), + description: __( 'Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.', 'paid-memberships-pro' ), category: 'pmpro', icon: { - background: '#2997c8', - foreground: '#ffffff', + background: '#FFFFFF', + foreground: '#1A688B', src: 'visibility', }, - keywords: [ __( 'pmpro', 'paid-memberships-pro' ) ], + keywords: [ + __( 'block visibility', 'paid-memberships-pro' ), + __( 'confitional', 'paid-memberships-pro' ), + __( 'content', 'paid-memberships-pro' ), + __( 'hide', 'paid-memberships-pro' ), + __( 'hidden', 'paid-memberships-pro' ), + __( 'paid memberships pro', 'paid-memberships-pro' ), + __( 'pmpro', 'paid-memberships-pro' ), + __( 'private', 'paid-memberships-pro' ), + __( 'restrict', 'paid-memberships-pro' ), + ], attributes: { levels: { type: 'array', @@ -86,10 +96,12 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ , isSelected &&
    - { __( 'Require Membership', 'paid-memberships-pro' ) } + { __( 'Membership Required', 'paid-memberships-pro' ) } +
    {checkboxes} +
    ( @@ -98,7 +110,7 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ />
    , ! isSelected &&
    - { __( 'Require Membership', 'paid-memberships-pro' ) } + { __( 'Membership Required', 'paid-memberships-pro' ) } ( diff --git a/css/blocks.editor.css b/css/blocks.editor.css index b184c9487..e95b06de2 100644 --- a/css/blocks.editor.css +++ b/css/blocks.editor.css @@ -21,6 +21,10 @@ position: relative; text-transform: uppercase; } +.pmpro-block-element hr { + margin-bottom: 16px; + margin-top: 16px; +} .pmpro-block-element .components-base-control { margin-bottom: 16px; } @@ -33,11 +37,11 @@ /* Require Membership Block */ .pmpro-block-require-membership-element { + background: rgba(237, 239, 240, 0.8); border-bottom: 5px solid #8d96a0; border-top: 5px solid #8d96a0; } .pmpro-block-require-membership-element .pmpro-block-title { - background: rgba(237, 239, 240, 0.8); color: #555d66; display: block; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue, sans-serif; @@ -46,24 +50,33 @@ position: relative; text-transform: uppercase; } -.pmpro-block-require-membership-element .components-panel__body { - background: rgba(237, 239, 240, 0); - border-bottom: 0; +.pmpro-block-require-membership-element .components-panel__body, +.pmpro-block-require-membership-element .components-panel__body.is-opened { + background: rgba(237, 239, 240, 0.8); + border-bottom: none; border-top: none; - border-left: 5px solid rgba(237, 239, 240, 0.8); - border-bottom: 5px solid rgba(237, 239, 240, 0.8); - padding-top: 0; - height: 200px; - overflow: auto; +} +.pmpro-block-require-membership-element .pmpro-block-inspector-scrollable { + border: 1px solid #CCC; + margin: 0px 16px 16px 16px; } .pmpro-block-require-membership-element .block-editor-inner-blocks { - padding-left: 16px; - padding-right: 16px; + background-color: #FFF; + padding: 16px; } .pmpro-block-inspector-scrollable { - height: 200px; + height: 170px; overflow: auto; } +.pmpro-block-inspector-scrollable::-webkit-scrollbar { + background-color: #c3c4c7; + width: 8px; + height: 8px; +} +.pmpro-block-inspector-scrollable::-webkit-scrollbar-thumb { + background: #2c3338; + border-radius: 5px; +} /* Checkout Button Block */ .wp-block-pmpro-checkout-button { diff --git a/js/blocks.build.js b/js/blocks.build.js index deb4e5519..deda34f3f 100644 --- a/js/blocks.build.js +++ b/js/blocks.build.js @@ -1,1883 +1 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./blocks/blocks.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./blocks/account-invoices-section/block.js": -/*!**************************************************!*\ - !*** ./blocks/account-invoices-section/block.js ***! - \**************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Account: Invoices - * - * Displays the Membership Account > Invoices page section. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-invoices-section', { - title: __('Membership Account: Invoices', 'paid-memberships-pro'), - description: __('Displays the member\'s invoices.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'archive' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, " ", __('Membership Account: Invoices', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/account-links-section/block.js": -/*!***********************************************!*\ - !*** ./blocks/account-links-section/block.js ***! - \***********************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Account: Member Links - * - * Displays the Membership Account > Member Links page section. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-links-section', { - title: __('Membership Account: Links', 'paid-memberships-pro'), - description: __('Displays the member\'s member links. This block is only visible if other Add Ons or custom code have added links.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'external' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Account: Member Links', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/account-membership-section/block.js": -/*!****************************************************!*\ - !*** ./blocks/account-membership-section/block.js ***! - \****************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Account: Memberships - * - * Displays the Membership Account > My Memberships page section. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-membership-section', { - title: __('Membership Account: Memberships', 'paid-memberships-pro'), - description: __('Displays the member\'s membership information.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'groups' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Account: My Memberships', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/account-page/block.js": -/*!**************************************!*\ - !*** ./blocks/account-page/block.js ***! - \**************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inspector */ "./blocks/account-page/inspector.js"); - - - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -/** - * Block: PMPro Membership Account - * - * Displays the Membership Account page. - * - */ - -/** - * Block dependencies - */ - -/** - * Internal block libraries - */ - -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-page', { - title: __('Membership Account Page', 'paid-memberships-pro'), - description: __('Displays the sections of the Membership Account page as selected below.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'admin-users' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: { - membership: { - type: 'boolean', - default: false - }, - profile: { - type: 'boolean', - default: false - }, - invoices: { - type: 'boolean', - default: false - }, - links: { - type: 'boolean', - default: false - } - }, - edit: function edit(props) { - var setAttributes = props.setAttributes, - isSelected = props.isSelected; - return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_2__["default"], _objectSpread({ - setAttributes: setAttributes - }, props)), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Account Page', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/account-page/inspector.js": -/*!******************************************!*\ - !*** ./blocks/account-page/inspector.js ***! - \******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; }); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var Component = wp.element.Component; -var _wp$components = wp.components, - PanelBody = _wp$components.PanelBody, - CheckboxControl = _wp$components.CheckboxControl; -var InspectorControls = wp.blockEditor.InspectorControls; -/** - * Create an Inspector Controls wrapper Component - */ - -var Inspector = /*#__PURE__*/function (_Component) { - _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component); - - var _super = _createSuper(Inspector); - - function Inspector() { - _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector); - - return _super.apply(this, arguments); - } - - _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{ - key: "render", - value: function render() { - var _this$props = this.props, - _this$props$attribute = _this$props.attributes, - membership = _this$props$attribute.membership, - profile = _this$props$attribute.profile, - invoices = _this$props$attribute.invoices, - links = _this$props$attribute.links, - setAttributes = _this$props.setAttributes; - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, { - label: __("Show 'My Memberships' Section", 'paid-memberships-pro'), - checked: membership, - onChange: function onChange(membership) { - return setAttributes({ - membership: membership - }); - } - })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, { - label: __("Show 'Profile' Section", 'paid-memberships-pro'), - checked: profile, - onChange: function onChange(profile) { - return setAttributes({ - profile: profile - }); - } - })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, { - label: __("Show 'Invoices' Section", 'paid-memberships-pro'), - checked: invoices, - onChange: function onChange(invoices) { - return setAttributes({ - invoices: invoices - }); - } - })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(CheckboxControl, { - label: __("Show 'Member Links' Section", 'paid-memberships-pro'), - checked: links, - onChange: function onChange(links) { - return setAttributes({ - links: links - }); - } - }))); - } - }]); - - return Inspector; -}(Component); - - - -/***/ }), - -/***/ "./blocks/account-profile-section/block.js": -/*!*************************************************!*\ - !*** ./blocks/account-profile-section/block.js ***! - \*************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Checkout Button - * - * Add a styled link to the PMPro checkout page for a - * specific level. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/account-profile-section', { - title: __('Membership Account: Profile', 'paid-memberships-pro'), - description: __('Displays the member\'s profile information.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'admin-users' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Account: Profile', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/billing-page/block.js": -/*!**************************************!*\ - !*** ./blocks/billing-page/block.js ***! - \**************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Billing - * - * Displays the Membership Billing page and form. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/billing-page', { - title: __('Membership Billing Page', 'paid-memberships-pro'), - description: __('Displays the member\'s billing information and allows them to update the payment method.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'list-view' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Billing Page', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/blocks.js": -/*!**************************!*\ - !*** ./blocks/blocks.js ***! - \**************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _i18n_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./i18n.js */ "./blocks/i18n.js"); -/* harmony import */ var _i18n_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_i18n_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _checkout_button_block_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./checkout-button/block.js */ "./blocks/checkout-button/block.js"); -/* harmony import */ var _account_page_block_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./account-page/block.js */ "./blocks/account-page/block.js"); -/* harmony import */ var _account_membership_section_block_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./account-membership-section/block.js */ "./blocks/account-membership-section/block.js"); -/* harmony import */ var _account_profile_section_block_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./account-profile-section/block.js */ "./blocks/account-profile-section/block.js"); -/* harmony import */ var _account_invoices_section_block_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./account-invoices-section/block.js */ "./blocks/account-invoices-section/block.js"); -/* harmony import */ var _account_links_section_block_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./account-links-section/block.js */ "./blocks/account-links-section/block.js"); -/* harmony import */ var _billing_page_block_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./billing-page/block.js */ "./blocks/billing-page/block.js"); -/* harmony import */ var _cancel_page_block_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./cancel-page/block.js */ "./blocks/cancel-page/block.js"); -/* harmony import */ var _checkout_page_block_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./checkout-page/block.js */ "./blocks/checkout-page/block.js"); -/* harmony import */ var _confirmation_page_block_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./confirmation-page/block.js */ "./blocks/confirmation-page/block.js"); -/* harmony import */ var _invoice_page_block_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./invoice-page/block.js */ "./blocks/invoice-page/block.js"); -/* harmony import */ var _levels_page_block_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./levels-page/block.js */ "./blocks/levels-page/block.js"); -/* harmony import */ var _membership_block_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./membership/block.js */ "./blocks/membership/block.js"); -/* harmony import */ var _member_profile_edit_block_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./member-profile-edit/block.js */ "./blocks/member-profile-edit/block.js"); -/* harmony import */ var _login_block_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./login/block.js */ "./blocks/login/block.js"); - - -/** - * Import internationalization - */ - -/** - * Import registerBlockType blocks - */ - - - - - - - - - - - - - - - - - -(function () { - var PMProSVG = Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("svg", { - version: "1.1", - id: "Layer_1", - x: "0px", - y: "0px", - viewBox: "0 0 18 18" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("path", { - d: "M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z" - })); - wp.blocks.updateCategory('pmpro', { - icon: PMProSVG - }); -})(); - -/***/ }), - -/***/ "./blocks/cancel-page/block.js": -/*!*************************************!*\ - !*** ./blocks/cancel-page/block.js ***! - \*************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Cancel - * - * Displays the Membership Cancel page. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/cancel-page', { - title: __('Membership Cancel Page', 'paid-memberships-pro'), - description: __('Generates the Membership Cancel page.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'no' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Cancel Page', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/checkout-button/block.js": -/*!*****************************************!*\ - !*** ./blocks/checkout-button/block.js ***! - \*****************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inspector */ "./blocks/checkout-button/inspector.js"); - - - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -/** - * Block: PMPro Checkout Button - * - * Add a styled link to the PMPro checkout page for a specific level. - * - */ - -/** - * Block dependencies - */ - -/** - * Internal block libraries - */ - -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -var _wp$components = wp.components, - TextControl = _wp$components.TextControl, - SelectControl = _wp$components.SelectControl; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/checkout-button', { - title: __('Membership Checkout Button', 'paid-memberships-pro'), - description: __('Displays a button-styled link to Membership Checkout for the specified level.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'migrate' - }, - keywords: [__('pmpro', 'paid-memberships-pro'), __('buy', 'paid-memberships-pro'), __('level', 'paid-memberships-pro')], - supports: {}, - attributes: { - text: { - type: 'string', - default: 'Buy Now' - }, - css_class: { - type: 'string', - default: 'pmpro_btn' - }, - level: { - type: 'string' - } - }, - edit: function edit(props) { - var _props$attributes = props.attributes, - text = _props$attributes.text, - level = _props$attributes.level, - css_class = _props$attributes.css_class, - className = props.className, - setAttributes = props.setAttributes, - isSelected = props.isSelected; - return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_2__["default"], _objectSpread({ - setAttributes: setAttributes - }, props)), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", { - className: className - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("a", { - class: css_class - }, text)), isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(TextControl, { - label: __('Button Text', 'paid-memberships-pro'), - value: text, - onChange: function onChange(text) { - return setAttributes({ - text: text - }); - } - }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(SelectControl, { - label: __('Membership Level', 'paid-memberships-pro'), - value: level, - onChange: function onChange(level) { - return setAttributes({ - level: level - }); - }, - options: window.pmpro.all_level_values_and_labels - }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(TextControl, { - label: __('CSS Class', 'paid-memberships-pro'), - value: css_class, - onChange: function onChange(css_class) { - return setAttributes({ - css_class: css_class - }); - } - }))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/checkout-button/inspector.js": -/*!*********************************************!*\ - !*** ./blocks/checkout-button/inspector.js ***! - \*********************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; }); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var Component = wp.element.Component; -var _wp$components = wp.components, - PanelBody = _wp$components.PanelBody, - TextControl = _wp$components.TextControl, - SelectControl = _wp$components.SelectControl; -var InspectorControls = wp.blockEditor.InspectorControls; -/** - * Create an Inspector Controls wrapper Component - */ - -var Inspector = /*#__PURE__*/function (_Component) { - _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component); - - var _super = _createSuper(Inspector); - - function Inspector() { - _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector); - - return _super.apply(this, arguments); - } - - _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{ - key: "render", - value: function render() { - var _this$props = this.props, - _this$props$attribute = _this$props.attributes, - text = _this$props$attribute.text, - level = _this$props$attribute.level, - css_class = _this$props$attribute.css_class, - setAttributes = _this$props.setAttributes; - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(TextControl, { - label: __('Button Text', 'paid-memberships-pro'), - help: __('Text for checkout button', 'paid-memberships-pro'), - value: text, - onChange: function onChange(text) { - return setAttributes({ - text: text - }); - } - })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(SelectControl, { - label: __('Level', 'paid-memberships-pro'), - help: __('The level to link to for checkout button', 'paid-memberships-pro'), - value: level, - onChange: function onChange(level) { - return setAttributes({ - level: level - }); - }, - options: window.pmpro.all_level_values_and_labels - })), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(TextControl, { - label: __('CSS Class', 'paid-memberships-pro'), - help: __('Additional styling for checkout button', 'paid-memberships-pro'), - value: css_class, - onChange: function onChange(css_class) { - return setAttributes({ - css_class: css_class - }); - } - }))); - } - }]); - - return Inspector; -}(Component); - - - -/***/ }), - -/***/ "./blocks/checkout-page/block.js": -/*!***************************************!*\ - !*** ./blocks/checkout-page/block.js ***! - \***************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inspector */ "./blocks/checkout-page/inspector.js"); - - - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -/** - * Block: PMPro Membership Checkout - * - * Displays the Membership Checkout form. - * - */ - -/** - * Block dependencies - */ - -/** - * Internal block libraries - */ - -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -var SelectControl = wp.components.SelectControl; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/checkout-page', { - title: __('Membership Checkout Form', 'paid-memberships-pro'), - description: __('Displays the Membership Checkout form.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'list-view' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: { - pmpro_default_level: { - type: 'string', - source: 'meta', - meta: 'pmpro_default_level' - } - }, - edit: function edit(props) { - var pmpro_default_level = props.attributes.pmpro_default_level, - className = props.className, - setAttributes = props.setAttributes, - isSelected = props.isSelected; - return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_2__["default"], _objectSpread({ - setAttributes: setAttributes - }, props)), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Checkout Form', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])("hr", null), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__["createElement"])(SelectControl, { - label: __('Membership Level', 'paid-memberships-pro'), - value: pmpro_default_level, - onChange: function onChange(pmpro_default_level) { - return setAttributes({ - pmpro_default_level: pmpro_default_level - }); - }, - options: window.pmpro.all_level_values_and_labels - }))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/checkout-page/inspector.js": -/*!*******************************************!*\ - !*** ./blocks/checkout-page/inspector.js ***! - \*******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; }); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var Component = wp.element.Component; -var _wp$components = wp.components, - PanelBody = _wp$components.PanelBody, - PanelRow = _wp$components.PanelRow, - SelectControl = _wp$components.SelectControl; -var InspectorControls = wp.blockEditor.InspectorControls; -/** - * Create an Inspector Controls wrapper Component - */ - -var Inspector = /*#__PURE__*/function (_Component) { - _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component); - - var _super = _createSuper(Inspector); - - function Inspector() { - _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector); - - return _super.apply(this, arguments); - } - - _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{ - key: "render", - value: function render() { - var _this$props = this.props, - pmpro_default_level = _this$props.attributes.pmpro_default_level, - setAttributes = _this$props.setAttributes; - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(SelectControl, { - label: __('Membership Level', 'paid-memberships-pro'), - help: __('Choose a default level for Membership Checkout.', 'paid-memberships-pro'), - value: pmpro_default_level, - onChange: function onChange(pmpro_default_level) { - return setAttributes({ - pmpro_default_level: pmpro_default_level - }); - }, - options: [''].concat(window.pmpro.all_level_values_and_labels) - }))); - } - }]); - - return Inspector; -}(Component); - - - -/***/ }), - -/***/ "./blocks/confirmation-page/block.js": -/*!*******************************************!*\ - !*** ./blocks/confirmation-page/block.js ***! - \*******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Confirmation - * - * Displays the Membership Confirmation template. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/confirmation-page', { - title: __('Membership Confirmation Page', 'paid-memberships-pro'), - description: __('Displays the member\'s Membership Confirmation after Membership Checkout.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'yes' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Confirmation Page', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/i18n.js": -/*!************************!*\ - !*** ./blocks/i18n.js ***! - \************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -wp.i18n.setLocaleData({ - '': {} -}, 'paid-memberships-pro'); - -/***/ }), - -/***/ "./blocks/invoice-page/block.js": -/*!**************************************!*\ - !*** ./blocks/invoice-page/block.js ***! - \**************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Invoices - * - * Displays the Membership Invoices template. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/invoice-page', { - title: __('Membership Invoice Page', 'paid-memberships-pro'), - description: __('Displays the member\'s Membership Invoices.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'archive' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Invoices', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/levels-page/block.js": -/*!*************************************!*\ - !*** ./blocks/levels-page/block.js ***! - \*************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership Levels - * - * Displays the Membership Levels template. - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/levels-page', { - title: __('Membership Levels List', 'paid-memberships-pro'), - description: __('Displays a list of Membership Levels. To change the order, go to Memberships > Settings > Levels.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'list-view' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - supports: {}, - attributes: {}, - edit: function edit() { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Paid Memberships Pro', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __('Membership Levels List', 'paid-memberships-pro')))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/login/block.js": -/*!*******************************!*\ - !*** ./blocks/login/block.js ***! - \*******************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _inspector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inspector */ "./blocks/login/inspector.js"); - - -/** - * Block: PMPro Login Form - * - * Add a login form to any page or post. - * - */ - -/** - * Block dependencies - */ - -/** - * Internal block libraries - */ - -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -var Fragment = wp.element.Fragment; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType("pmpro/login-form", { - title: __("Log in Form", "paid-memberships-pro"), - description: __("Displays a Log In Form for Paid Memberships Pro.", "paid-memberships-pro"), - category: "pmpro", - icon: { - background: "#2997c8", - foreground: "#ffffff", - src: "unlock" - }, - keywords: [__("pmpro", "paid-memberships-pro"), __("login", "paid-memberships-pro"), __("form", "paid-memberships-pro"), __("log in", "paid-memberships-pro")], - supports: {}, - edit: function edit(props) { - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(Fragment, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(_inspector__WEBPACK_IMPORTED_MODULE_1__["default"], props), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __("Paid Memberships Pro", "paid-memberships-pro")), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __("Log in Form", "paid-memberships-pro"))))]; - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/login/inspector.js": -/*!***********************************!*\ - !*** ./blocks/login/inspector.js ***! - \***********************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Inspector; }); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__); - - - - - - - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var Component = wp.element.Component; -var _wp$components = wp.components, - PanelBody = _wp$components.PanelBody, - SelectControl = _wp$components.SelectControl, - ToggleControl = _wp$components.ToggleControl; -var InspectorControls = wp.blockEditor.InspectorControls; -/** - * Create an Inspector Controls wrapper Component - */ - -var Inspector = /*#__PURE__*/function (_Component) { - _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(Inspector, _Component); - - var _super = _createSuper(Inspector); - - function Inspector() { - _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Inspector); - - return _super.apply(this, arguments); - } - - _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Inspector, [{ - key: "render", - value: function render() { - var _this = this; - - var _this$props = this.props, - attributes = _this$props.attributes, - setAttributes = _this$props.setAttributes; - var display_if_logged_in = attributes.display_if_logged_in, - show_menu = attributes.show_menu, - show_logout_link = attributes.show_logout_link, - location = attributes.location; - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(ToggleControl, { - label: __("Display 'Welcome' content when logged in.", "paid-memberships-pro"), - checked: display_if_logged_in, - onChange: function onChange(value) { - _this.props.setAttributes({ - display_if_logged_in: value - }); - } - }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(ToggleControl, { - label: __("Display the 'Log In Widget' menu.", "paid-memberships-pro"), - help: __("Assign the menu under Appearance > Menus.", "paid-memberships-pro"), - checked: show_menu, - onChange: function onChange(value) { - _this.props.setAttributes({ - show_menu: value - }); - } - }), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_5__["createElement"])(ToggleControl, { - label: __("Display a 'Log Out' link.", "paid-memberships-pro"), - checked: show_logout_link, - onChange: function onChange(value) { - _this.props.setAttributes({ - show_logout_link: value - }); - } - }))); - } - }]); - - return Inspector; -}(Component); - - - -/***/ }), - -/***/ "./blocks/member-profile-edit/block.js": -/*!*********************************************!*\ - !*** ./blocks/member-profile-edit/block.js ***! - \*********************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Member Profile Edit - * - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType("pmpro/member-profile-edit", { - title: __("Member Profile Edit", "paid-memberships-pro"), - description: __("Allow member profile editing.", "paid-memberships-pro"), - category: "pmpro", - icon: { - background: "#2997c8", - foreground: "#ffffff", - src: "admin-users" - }, - keywords: [__("pmpro", "paid-memberships-pro"), __("member", "paid-memberships-pro"), __("profile", "paid-memberships-pro")], - edit: function edit(props) { - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __("Paid Memberships Pro", "paid-memberships-pro")), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-subtitle" - }, __("Member Profile Edit", "paid-memberships-pro"))); - }, - save: function save() { - return null; - } -})); - -/***/ }), - -/***/ "./blocks/membership/block.js": -/*!************************************!*\ - !*** ./blocks/membership/block.js ***! - \************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element"); -/* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__); - - -/** - * Block: PMPro Membership - * - * - */ - -/** - * Internal block libraries - */ -var __ = wp.i18n.__; -var registerBlockType = wp.blocks.registerBlockType; -var _wp$components = wp.components, - PanelBody = _wp$components.PanelBody, - CheckboxControl = _wp$components.CheckboxControl; -var _wp$blockEditor = wp.blockEditor, - InspectorControls = _wp$blockEditor.InspectorControls, - InnerBlocks = _wp$blockEditor.InnerBlocks; -var all_levels = [{ - value: 0, - label: "Non-Members" -}].concat(pmpro.all_level_values_and_labels); -/** - * Register block - */ - -/* harmony default export */ __webpack_exports__["default"] = (registerBlockType('pmpro/membership', { - title: __('Require Membership Block', 'paid-memberships-pro'), - description: __('Control the visibility of nested blocks for members or non-members.', 'paid-memberships-pro'), - category: 'pmpro', - icon: { - background: '#2997c8', - foreground: '#ffffff', - src: 'visibility' - }, - keywords: [__('pmpro', 'paid-memberships-pro')], - attributes: { - levels: { - type: 'array', - default: [] - }, - uid: { - type: 'string', - default: '' - } - }, - edit: function edit(props) { - var _props$attributes = props.attributes, - levels = _props$attributes.levels, - uid = _props$attributes.uid, - setAttributes = props.setAttributes, - isSelected = props.isSelected; - - if (uid == '') { - var rand = Math.random() + ""; - setAttributes({ - uid: rand - }); - } // Build an array of checkboxes for each level. - - - var checkboxes = all_levels.map(function (level) { - function setLevelsAttribute(nowChecked) { - if (nowChecked && !levels.some(function (levelID) { - return levelID == level.value; - })) { - // Add the level. - var newLevels = levels.slice(); - newLevels.push(level.value + ''); - setAttributes({ - levels: newLevels - }); - } else if (!nowChecked && levels.some(function (levelID) { - return levelID == level.value; - })) { - // Remove the level. - var _newLevels = levels.filter(function (levelID) { - return levelID != level.value; - }); - - setAttributes({ - levels: _newLevels - }); - } - } - - return [Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(CheckboxControl, { - label: level.label, - checked: levels.some(function (levelID) { - return levelID == level.value; - }), - onChange: setLevelsAttribute - })]; - }); - return [isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InspectorControls, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(PanelBody, null, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - class: "pmpro-block-inspector-scrollable" - }, checkboxes))), isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-require-membership-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Require Membership', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(PanelBody, null, checkboxes), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks, { - renderAppender: function renderAppender() { - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks.ButtonBlockAppender, null); - }, - templateLock: false - })), !isSelected && Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: "pmpro-block-require-membership-element" - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("span", { - className: "pmpro-block-title" - }, __('Require Membership', 'paid-memberships-pro')), Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks, { - renderAppender: function renderAppender() { - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks.ButtonBlockAppender, null); - }, - templateLock: false - }))]; - }, - save: function save(props) { - var className = props.className; - return Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])("div", { - className: className - }, Object(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__["createElement"])(InnerBlocks.Content, null)); - } -})); - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js": -/*!**********************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/assertThisInitialized.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; -} - -module.exports = _assertThisInitialized; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js": -/*!***************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -module.exports = _classCallCheck; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/createClass.js": -/*!************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/createClass.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -module.exports = _createClass; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/defineProperty.js": -/*!***************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -} - -module.exports = _defineProperty; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js": -/*!***************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/getPrototypeOf.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _getPrototypeOf(o) { - module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - module.exports["default"] = module.exports, module.exports.__esModule = true; - return _getPrototypeOf(o); -} - -module.exports = _getPrototypeOf; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/inherits.js": -/*!*********************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/inherits.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) setPrototypeOf(subClass, superClass); -} - -module.exports = _inherits; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js": -/*!**************************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***! - \**************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js")["default"]; - -var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized.js */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); - -function _possibleConstructorReturn(self, call) { - if (call && (_typeof(call) === "object" || typeof call === "function")) { - return call; - } - - return assertThisInitialized(self); -} - -module.exports = _possibleConstructorReturn; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js": -/*!***************************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _setPrototypeOf(o, p) { - module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - module.exports["default"] = module.exports, module.exports.__esModule = true; - return _setPrototypeOf(o, p); -} - -module.exports = _setPrototypeOf; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "./node_modules/@babel/runtime/helpers/typeof.js": -/*!*******************************************************!*\ - !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - module.exports = _typeof = function _typeof(obj) { - return typeof obj; - }; - - module.exports["default"] = module.exports, module.exports.__esModule = true; - } else { - module.exports = _typeof = function _typeof(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - - module.exports["default"] = module.exports, module.exports.__esModule = true; - } - - return _typeof(obj); -} - -module.exports = _typeof; -module.exports["default"] = module.exports, module.exports.__esModule = true; - -/***/ }), - -/***/ "@wordpress/element": -/*!*********************************!*\ - !*** external ["wp","element"] ***! - \*********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -(function() { module.exports = window["wp"]["element"]; }()); - -/***/ }) - -/******/ }); -//# sourceMappingURL=blocks.build.js.map +!function(e){var r={};function t(p){if(r[p])return r[p].exports;var o=r[p]={i:p,l:!1,exports:{}};return e[p].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=r,t.d=function(e,r,p){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:p})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var p=Object.create(null);if(t.r(p),Object.defineProperty(p,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)t.d(p,o,function(r){return e[r]}.bind(null,o));return p},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(p.createElement)("div",{className:"pmpro-block-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(p.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=wp.blockEditor,ye=fe.InspectorControls,ve=fe.InnerBlocks,ge=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),ke=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""}},edit:function(e){var r=e.attributes,t=r.levels,o=r.uid,s=e.setAttributes,i=e.isSelected;if(""==o){var c=Math.random()+"";s({uid:c})}var n=ge.map((function(e){return[Object(p.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var p=t.slice();p.push(e.value+""),s({levels:p})}else if(!r&&t.some((function(r){return r==e.value}))){var o=t.filter((function(r){return r!=e.value}));s({levels:o})}}})]}));return[i&&Object(p.createElement)(ye,null,Object(p.createElement)(de,null,Object(p.createElement)("div",{class:"pmpro-block-inspector-scrollable"},n))),i&&Object(p.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(p.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(p.createElement)(de,null,n)),Object(p.createElement)(ve,{renderAppender:function(){return Object(p.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1})),!i&&Object(p.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(p.createElement)(ve,{renderAppender:function(){return Object(p.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(p.createElement)("div",{className:r},Object(p.createElement)(ve.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:ke("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:ke("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[ke("custom field","paid-memberships-pro"),ke("fields","paid-memberships-pro"),ke("paid memberships pro","paid-memberships-pro"),ke("pmpro","paid-memberships-pro"),ke("user fields","paid-memberships-pro")],edit:function(e){return Object(p.createElement)("div",{className:"pmpro-block-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},ke("Paid Memberships Pro","paid-memberships-pro")),Object(p.createElement)("span",{className:"pmpro-block-subtitle"},ke("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function Oe(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,p=h()(e);if(r){var o=h()(this).constructor;t=Reflect.construct(p,arguments,o)}else t=p.apply(this,arguments);return u()(this,t)}}var je,we=wp.i18n.__,_e=wp.element.Component,Pe=wp.components,Ee=Pe.PanelBody,Ce=(Pe.SelectControl,Pe.ToggleControl),Fe=wp.blockEditor.InspectorControls,Me=function(e){m()(t,e);var r=Oe(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,o=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,i=t.show_logout_link;t.location;return Object(p.createElement)(Fe,null,Object(p.createElement)(Ee,null,Object(p.createElement)(Ce,{label:we("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:o,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(p.createElement)(Ce,{label:we("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:we("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(p.createElement)(Ce,{label:we("Display a 'Log Out' link.","paid-memberships-pro"),checked:i,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(_e),xe=wp.i18n.__,Be=wp.blocks.registerBlockType,Ne=wp.element.Fragment;Be("pmpro/login-form",{title:xe("Login Form","paid-memberships-pro"),description:xe("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[xe("log in","paid-memberships-pro"),xe("lost password","paid-memberships-pro"),xe("paid memberships pro","paid-memberships-pro"),xe("password reset","paid-memberships-pro"),xe("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(p.createElement)(Ne,null,Object(p.createElement)(Me,e),Object(p.createElement)("div",{className:"pmpro-block-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},xe("Paid Memberships Pro","paid-memberships-pro")),Object(p.createElement)("span",{className:"pmpro-block-subtitle"},xe("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});je=Object(p.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(p.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:je}),wp.blocks.updateCategory("pmpro-pages",{icon:je})}]); \ No newline at end of file From c7c13333b09f25bf3465bcb701d4f9e98001b53a Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Wed, 30 Mar 2022 06:08:53 -0400 Subject: [PATCH 083/145] Starting work to make the Membership Required block include the shownoaccess message. --- blocks/membership/block.js | 18 ++++++++++++++++-- blocks/membership/block.php | 2 ++ js/blocks.build.js | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/blocks/membership/block.js b/blocks/membership/block.js index 0c70e0da6..49ceb4f6d 100644 --- a/blocks/membership/block.js +++ b/blocks/membership/block.js @@ -56,9 +56,13 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ type: 'string', default:'', }, + show_noaccess: { + type: 'boolean', + default: false, + }, }, edit: props => { - const { attributes: {levels, uid}, setAttributes, isSelected } = props; + const { attributes: {levels, uid, show_noaccess}, setAttributes, isSelected } = props; if( uid=='' ) { var rand = Math.random()+""; setAttributes( { uid:rand } ); @@ -89,7 +93,12 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ return [ isSelected && - + + setAttributes( {show_noaccess} ) } + />
    {checkboxes}
    @@ -97,6 +106,11 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_
    , isSelected &&
    { __( 'Membership Required', 'paid-memberships-pro' ) } + setAttributes( {show_noaccess} ) } + />
    {checkboxes} diff --git a/blocks/membership/block.php b/blocks/membership/block.php index 5c2acd095..4c58b567e 100644 --- a/blocks/membership/block.php +++ b/blocks/membership/block.php @@ -44,6 +44,8 @@ function render_dynamic_block( $attributes, $content ) { } else { if ( pmpro_hasMembershipLevel( $attributes['levels'] ) ) { return do_blocks( $content ); + } elseif ( ! empty( $attributes['show_noaccess'] ) ) { + return pmpro_get_no_access_message( NULL, $attributes['levels'] ); } } } diff --git a/js/blocks.build.js b/js/blocks.build.js index deda34f3f..916775a7c 100644 --- a/js/blocks.build.js +++ b/js/blocks.build.js @@ -1 +1 @@ -!function(e){var r={};function t(p){if(r[p])return r[p].exports;var o=r[p]={i:p,l:!1,exports:{}};return e[p].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=r,t.d=function(e,r,p){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:p})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var p=Object.create(null);if(t.r(p),Object.defineProperty(p,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)t.d(p,o,function(r){return e[r]}.bind(null,o));return p},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(p.createElement)("div",{className:"pmpro-block-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(p.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=wp.blockEditor,ye=fe.InspectorControls,ve=fe.InnerBlocks,ge=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),ke=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""}},edit:function(e){var r=e.attributes,t=r.levels,o=r.uid,s=e.setAttributes,i=e.isSelected;if(""==o){var c=Math.random()+"";s({uid:c})}var n=ge.map((function(e){return[Object(p.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var p=t.slice();p.push(e.value+""),s({levels:p})}else if(!r&&t.some((function(r){return r==e.value}))){var o=t.filter((function(r){return r!=e.value}));s({levels:o})}}})]}));return[i&&Object(p.createElement)(ye,null,Object(p.createElement)(de,null,Object(p.createElement)("div",{class:"pmpro-block-inspector-scrollable"},n))),i&&Object(p.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(p.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(p.createElement)(de,null,n)),Object(p.createElement)(ve,{renderAppender:function(){return Object(p.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1})),!i&&Object(p.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(p.createElement)(ve,{renderAppender:function(){return Object(p.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(p.createElement)("div",{className:r},Object(p.createElement)(ve.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:ke("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:ke("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[ke("custom field","paid-memberships-pro"),ke("fields","paid-memberships-pro"),ke("paid memberships pro","paid-memberships-pro"),ke("pmpro","paid-memberships-pro"),ke("user fields","paid-memberships-pro")],edit:function(e){return Object(p.createElement)("div",{className:"pmpro-block-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},ke("Paid Memberships Pro","paid-memberships-pro")),Object(p.createElement)("span",{className:"pmpro-block-subtitle"},ke("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function Oe(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,p=h()(e);if(r){var o=h()(this).constructor;t=Reflect.construct(p,arguments,o)}else t=p.apply(this,arguments);return u()(this,t)}}var je,we=wp.i18n.__,_e=wp.element.Component,Pe=wp.components,Ee=Pe.PanelBody,Ce=(Pe.SelectControl,Pe.ToggleControl),Fe=wp.blockEditor.InspectorControls,Me=function(e){m()(t,e);var r=Oe(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,o=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,i=t.show_logout_link;t.location;return Object(p.createElement)(Fe,null,Object(p.createElement)(Ee,null,Object(p.createElement)(Ce,{label:we("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:o,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(p.createElement)(Ce,{label:we("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:we("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(p.createElement)(Ce,{label:we("Display a 'Log Out' link.","paid-memberships-pro"),checked:i,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(_e),xe=wp.i18n.__,Be=wp.blocks.registerBlockType,Ne=wp.element.Fragment;Be("pmpro/login-form",{title:xe("Login Form","paid-memberships-pro"),description:xe("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[xe("log in","paid-memberships-pro"),xe("lost password","paid-memberships-pro"),xe("paid memberships pro","paid-memberships-pro"),xe("password reset","paid-memberships-pro"),xe("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(p.createElement)(Ne,null,Object(p.createElement)(Me,e),Object(p.createElement)("div",{className:"pmpro-block-element"},Object(p.createElement)("span",{className:"pmpro-block-title"},xe("Paid Memberships Pro","paid-memberships-pro")),Object(p.createElement)("span",{className:"pmpro-block-subtitle"},xe("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});je=Object(p.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(p.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:je}),wp.blocks.updateCategory("pmpro-pages",{icon:je})}]); \ No newline at end of file +!function(e){var r={};function t(o){if(r[o])return r[o].exports;var p=r[o]={i:o,l:!1,exports:{}};return e[o].call(p.exports,p,p.exports,t),p.l=!0,p.exports}t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var p in e)t.d(o,p,function(r){return e[r]}.bind(null,p));return o},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=wp.blockEditor,ye=fe.InspectorControls,ge=fe.InnerBlocks,ve=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),ke=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""},show_noaccess:{type:"boolean",default:!1}},edit:function(e){var r=e.attributes,t=r.levels,p=r.uid,s=r.show_noaccess,c=e.setAttributes,i=e.isSelected;if(""==p){var n=Math.random()+"";c({uid:n})}var a=ve.map((function(e){return[Object(o.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var o=t.slice();o.push(e.value+""),c({levels:o})}else if(!r&&t.some((function(r){return r==e.value}))){var p=t.filter((function(r){return r!=e.value}));c({levels:p})}}})]}));return[i&&Object(o.createElement)(ye,null,Object(o.createElement)(de,null,Object(o.createElement)(he,{label:me("Swap Content With a 'No Access' Message","paid-memberships-pro"),checked:s,onChange:function(e){return c({show_noaccess:e})}}),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},a))),i&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(he,{label:me("Swap Content With a 'No Access' Message","paid-memberships-pro"),checked:s,onChange:function(e){return c({show_noaccess:e})}}),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(o.createElement)(de,null,a)),Object(o.createElement)(ge,{renderAppender:function(){return Object(o.createElement)(ge.ButtonBlockAppender,null)},templateLock:!1})),!i&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(ge,{renderAppender:function(){return Object(o.createElement)(ge.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(o.createElement)("div",{className:r},Object(o.createElement)(ge.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:ke("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:ke("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[ke("custom field","paid-memberships-pro"),ke("fields","paid-memberships-pro"),ke("paid memberships pro","paid-memberships-pro"),ke("pmpro","paid-memberships-pro"),ke("user fields","paid-memberships-pro")],edit:function(e){return Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},ke("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},ke("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function Oe(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var we,je=wp.i18n.__,_e=wp.element.Component,Ee=wp.components,Pe=Ee.PanelBody,Ce=(Ee.SelectControl,Ee.ToggleControl),Fe=wp.blockEditor.InspectorControls,Me=function(e){m()(t,e);var r=Oe(t);function t(){return i()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,p=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,c=t.show_logout_link;t.location;return Object(o.createElement)(Fe,null,Object(o.createElement)(Pe,null,Object(o.createElement)(Ce,{label:je("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:p,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(o.createElement)(Ce,{label:je("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:je("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(o.createElement)(Ce,{label:je("Display a 'Log Out' link.","paid-memberships-pro"),checked:c,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(_e),xe=wp.i18n.__,Be=wp.blocks.registerBlockType,Ne=wp.element.Fragment;Be("pmpro/login-form",{title:xe("Login Form","paid-memberships-pro"),description:xe("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[xe("log in","paid-memberships-pro"),xe("lost password","paid-memberships-pro"),xe("paid memberships pro","paid-memberships-pro"),xe("password reset","paid-memberships-pro"),xe("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(o.createElement)(Ne,null,Object(o.createElement)(Me,e),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},xe("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},xe("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});we=Object(o.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(o.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:we}),wp.blocks.updateCategory("pmpro-pages",{icon:we})}]); \ No newline at end of file From 0f35140982de80cd194e722b243d24c2464bcc65 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Wed, 30 Mar 2022 12:16:57 +0200 Subject: [PATCH 084/145] Enable refund events in webhook --- classes/gateways/class.pmprogateway_stripe.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 46c00db32..67adbf84d 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -2793,7 +2793,8 @@ public static function webhook_events() { 'invoice.payment_succeeded', 'invoice.payment_action_required', 'customer.subscription.deleted', - 'charge.failed' + 'charge.failed', + 'charge.refunded' ) ); } From e856d534ccb079cba620a4cfa018f7740a79b5df Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Wed, 30 Mar 2022 14:14:29 +0200 Subject: [PATCH 085/145] Admin refunded email recipient in PPExp fixed --- classes/gateways/class.pmprogateway_paypalexpress.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index d4415cf20..499a95aa2 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1124,7 +1124,7 @@ public static function process_refund( $success, $morder ){ //send an email to the admin $myemail = new PMProEmail(); - $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); + $myemail->sendRefundedAdminEmail( $current_user, $morder->membership_id ); } else { //The refund failed, so lets return the gateway message From 907b217096711c6a696c978cc27338a2255124e8 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Thu, 31 Mar 2022 12:36:25 -0400 Subject: [PATCH 086/145] Began order adjustments for better usability and scanning. --- adminpages/orders.php | 196 +++++++++++++++++++++++++++--------------- css/admin.css | 159 +++++++++++++++++++++++----------- 2 files changed, 237 insertions(+), 118 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 0a26a3fff..f79a26868 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -1324,41 +1324,46 @@ function pmpro_ShowMonthOrYear() {

    get_var( "SELECT id FROM $wpdb->pmpro_discount_codes LIMIT 1" ) ) { + $pmpro_discount_codes = true; + } else { + $pmpro_discount_codes = false; + } ?> - +
    - - - + + - - - - - - - - + + + + + + + + + + nogateway = true; $order->getMemberOrderByID( $order_id ); $order->getUser(); ?> - - class="alternate"> - - + - - - - + - - - - - + + + + Date: Thu, 31 Mar 2022 14:26:37 -0400 Subject: [PATCH 087/145] Adding the "show no access message" atrribute to the block membership required --- blocks/membership/block.js | 27 +++++++++++++++------------ css/blocks.editor.css | 5 ++++- js/blocks.build.js | 2 +- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/blocks/membership/block.js b/blocks/membership/block.js index 49ceb4f6d..4eab34085 100644 --- a/blocks/membership/block.js +++ b/blocks/membership/block.js @@ -9,11 +9,12 @@ */ const { __ } = wp.i18n; const { - registerBlockType, + registerBlockType } = wp.blocks; const { PanelBody, CheckboxControl, + SelectControl, } = wp.components; const { InspectorControls, @@ -83,7 +84,7 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ } } return [ - levelID == level.value ) } onChange = { setLevelsAttribute } @@ -94,23 +95,25 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_ return [ isSelected && - setAttributes( {show_noaccess} ) } - /> +

    { __( 'Which membership levels can view this block?', 'paid-memberships-pro' ) }

    {checkboxes}
    +
    +

    { __( 'What should users without access see?', 'paid-memberships-pro' ) }

    + setAttributes( { show_noaccess } ) } + />
    , isSelected &&
    { __( 'Membership Required', 'paid-memberships-pro' ) } - setAttributes( {show_noaccess} ) } - />
    {checkboxes} diff --git a/css/blocks.editor.css b/css/blocks.editor.css index e95b06de2..59203ccc0 100644 --- a/css/blocks.editor.css +++ b/css/blocks.editor.css @@ -31,7 +31,7 @@ .pmpro-block-element .components-base-control .components-select-control { height: auto; } -.pmpro-block-element .components-base-control .components-base-control__label { +..pmpro-block-element .components-base-control .components-base-control__label { display: block; } @@ -77,6 +77,9 @@ background: #2c3338; border-radius: 5px; } +.pmpro-block-inspector-scrollable .components-base-control.components-checkbox-control { + margin-bottom: 5px; +} /* Checkout Button Block */ .wp-block-pmpro-checkout-button { diff --git a/js/blocks.build.js b/js/blocks.build.js index 916775a7c..72f8e1043 100644 --- a/js/blocks.build.js +++ b/js/blocks.build.js @@ -1 +1 @@ -!function(e){var r={};function t(o){if(r[o])return r[o].exports;var p=r[o]={i:o,l:!1,exports:{}};return e[o].call(p.exports,p,p.exports,t),p.l=!0,p.exports}t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var p in e)t.d(o,p,function(r){return e[r]}.bind(null,p));return o},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=wp.blockEditor,ye=fe.InspectorControls,ge=fe.InnerBlocks,ve=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),ke=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""},show_noaccess:{type:"boolean",default:!1}},edit:function(e){var r=e.attributes,t=r.levels,p=r.uid,s=r.show_noaccess,c=e.setAttributes,i=e.isSelected;if(""==p){var n=Math.random()+"";c({uid:n})}var a=ve.map((function(e){return[Object(o.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var o=t.slice();o.push(e.value+""),c({levels:o})}else if(!r&&t.some((function(r){return r==e.value}))){var p=t.filter((function(r){return r!=e.value}));c({levels:p})}}})]}));return[i&&Object(o.createElement)(ye,null,Object(o.createElement)(de,null,Object(o.createElement)(he,{label:me("Swap Content With a 'No Access' Message","paid-memberships-pro"),checked:s,onChange:function(e){return c({show_noaccess:e})}}),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},a))),i&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(he,{label:me("Swap Content With a 'No Access' Message","paid-memberships-pro"),checked:s,onChange:function(e){return c({show_noaccess:e})}}),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(o.createElement)(de,null,a)),Object(o.createElement)(ge,{renderAppender:function(){return Object(o.createElement)(ge.ButtonBlockAppender,null)},templateLock:!1})),!i&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(ge,{renderAppender:function(){return Object(o.createElement)(ge.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(o.createElement)("div",{className:r},Object(o.createElement)(ge.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:ke("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:ke("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[ke("custom field","paid-memberships-pro"),ke("fields","paid-memberships-pro"),ke("paid memberships pro","paid-memberships-pro"),ke("pmpro","paid-memberships-pro"),ke("user fields","paid-memberships-pro")],edit:function(e){return Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},ke("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},ke("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function Oe(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var we,je=wp.i18n.__,_e=wp.element.Component,Ee=wp.components,Pe=Ee.PanelBody,Ce=(Ee.SelectControl,Ee.ToggleControl),Fe=wp.blockEditor.InspectorControls,Me=function(e){m()(t,e);var r=Oe(t);function t(){return i()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,p=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,c=t.show_logout_link;t.location;return Object(o.createElement)(Fe,null,Object(o.createElement)(Pe,null,Object(o.createElement)(Ce,{label:je("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:p,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(o.createElement)(Ce,{label:je("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:je("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(o.createElement)(Ce,{label:je("Display a 'Log Out' link.","paid-memberships-pro"),checked:c,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(_e),xe=wp.i18n.__,Be=wp.blocks.registerBlockType,Ne=wp.element.Fragment;Be("pmpro/login-form",{title:xe("Login Form","paid-memberships-pro"),description:xe("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[xe("log in","paid-memberships-pro"),xe("lost password","paid-memberships-pro"),xe("paid memberships pro","paid-memberships-pro"),xe("password reset","paid-memberships-pro"),xe("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(o.createElement)(Ne,null,Object(o.createElement)(Me,e),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},xe("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},xe("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});we=Object(o.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(o.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:we}),wp.blocks.updateCategory("pmpro-pages",{icon:we})}]); \ No newline at end of file +!function(e){var r={};function t(o){if(r[o])return r[o].exports;var p=r[o]={i:o,l:!1,exports:{}};return e[o].call(p.exports,p,p.exports,t),p.l=!0,p.exports}t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var p in e)t.d(o,p,function(r){return e[r]}.bind(null,p));return o},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=ue.SelectControl,ye=wp.blockEditor,ge=ye.InspectorControls,ve=ye.InnerBlocks,ke=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),Oe=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""},show_noaccess:{type:"boolean",default:!1}},edit:function(e){var r=e.attributes,t=r.levels,p=r.uid,s=r.show_noaccess,i=e.setAttributes,c=e.isSelected;if(""==p){var n=Math.random()+"";i({uid:n})}var a=ke.map((function(e){return[Object(o.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var o=t.slice();o.push(e.value+""),i({levels:o})}else if(!r&&t.some((function(r){return r==e.value}))){var p=t.filter((function(r){return r!=e.value}));i({levels:p})}}})]}));return[c&&Object(o.createElement)(ge,null,Object(o.createElement)(de,null,Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("Which membership levels can view this block?","paid-memberships-pro"))),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},a),Object(o.createElement)("hr",null),Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("What should users without access see?","paid-memberships-pro"))),Object(o.createElement)(fe,{value:s,help:me("Optionally show the message for visitors or logged-in users without access as defined in PMPro Advanced Settings.","paid-memberships-pro"),options:[{label:me("Show nothing","paid-memberships-pro"),value:"0"},{label:me("Show the 'no access' message","paid-memberships-pro"),value:"1"}],onChange:function(e){return i({show_noaccess:e})}}))),c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(o.createElement)(de,null,a)),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1})),!c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(o.createElement)("div",{className:r},Object(o.createElement)(ve.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:Oe("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:Oe("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[Oe("custom field","paid-memberships-pro"),Oe("fields","paid-memberships-pro"),Oe("paid memberships pro","paid-memberships-pro"),Oe("pmpro","paid-memberships-pro"),Oe("user fields","paid-memberships-pro")],edit:function(e){return Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Oe("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Oe("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function we(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var je,_e=wp.i18n.__,Ee=wp.element.Component,Pe=wp.components,Ce=Pe.PanelBody,Fe=(Pe.SelectControl,Pe.ToggleControl),Me=wp.blockEditor.InspectorControls,xe=function(e){m()(t,e);var r=we(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,p=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,i=t.show_logout_link;t.location;return Object(o.createElement)(Me,null,Object(o.createElement)(Ce,null,Object(o.createElement)(Fe,{label:_e("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:p,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(o.createElement)(Fe,{label:_e("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:_e("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(o.createElement)(Fe,{label:_e("Display a 'Log Out' link.","paid-memberships-pro"),checked:i,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(Ee),Be=wp.i18n.__,Ne=wp.blocks.registerBlockType,Ae=wp.element.Fragment;Ne("pmpro/login-form",{title:Be("Login Form","paid-memberships-pro"),description:Be("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[Be("log in","paid-memberships-pro"),Be("lost password","paid-memberships-pro"),Be("paid memberships pro","paid-memberships-pro"),Be("password reset","paid-memberships-pro"),Be("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(o.createElement)(Ae,null,Object(o.createElement)(xe,e),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Be("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Be("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});je=Object(o.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(o.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:je}),wp.blocks.updateCategory("pmpro-pages",{icon:je})}]); \ No newline at end of file From 3de539bacbb6df81a304deb91a52d182d5d335f9 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Thu, 31 Mar 2022 14:51:52 -0400 Subject: [PATCH 088/145] Improving appearance of the edit order / add new order screen --- adminpages/orders.php | 159 ++++++++++++++++++++++++------------------ css/admin.css | 20 ++++++ 2 files changed, 113 insertions(+), 66 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index f79a26868..34c529d04 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -384,15 +384,19 @@ ?> +
    id ) ) { ?> -

    #id ); ?>: code ); ?>

    - - +

    #id ); ?>

    +
    + + + + +

    -
    + - +*/ ?> + + + + + +
    - id ); ?> - - code ); ?> -
    +
    + code ); ?>
    > ); $actions = [ + 'id' => sprintf( + // translators: %s is the Order ID. + __( 'ID: %s', 'paid-memberships-pro' ), + esc_attr( $order->id ), + ), 'edit' => sprintf( '%3$s', esc_attr__( 'Edit', 'paid-memberships-pro' ), @@ -1412,7 +1422,7 @@ class="alternate"> ), esc_html__( 'Copy', 'paid-memberships-pro' ) ), - 'delete' => sprintf( + 'delete' => sprintf( '%3$s', esc_attr__( 'Delete', 'paid-memberships-pro' ), 'javascript:pmpro_askfirst(\'' . esc_js( $delete_text ) . '\', \'' . esc_js( $delete_nonce_url ) . '\'); void(0);', @@ -1466,7 +1476,7 @@ class="alternate"> ?>
    + getUser(); ?> user ) ) { ?> user->user_login ); ?>
    @@ -1478,56 +1488,84 @@ class="alternate">
    + membership_id ); if ( ! empty( $level ) ) { echo esc_html( $level->name ); } elseif ( $order->membership_id > 0 ) { ?> [] - - [] - total ) ); ?> + total ) ); ?> payment_type ) ) { - echo esc_html( $order->payment_type ) . '
    '; - } - ?> - accountnumber ) ) { ?> - cardtype ); ?>: xaccountnumber ) ); ?>
    - - billing->name ) ) { ?> - billing->name ); ?>
    - - billing->street ) ) { ?> - billing->street ); ?>
    - billing->city && $order->billing->state ) { ?> - billing->city ); ?>, billing->state ); ?> billing->zip ); ?> - billing->country ) ) { - echo esc_html( $order->billing->country ); } - ?> -
    - - - billing->phone ) ) { - echo esc_html( formatPhone( $order->billing->phone ) ); - } + // Build our return variable. + $r = ''; + + if ( ! empty( $order->payment_type ) ) { + if ( in_array( $order->payment_type, array( 'PayPal Standard', 'PayPal Express' ) ) ) { + $r .= esc_html( 'PayPal', 'paid-memberships-pro' ); + } else { + $r .= esc_html( ucwords( $order->payment_type ) ); + } + $r .= '
    '; + } + + if ( ! empty( $order->accountnumber ) ) { + $r .= esc_html( $order->cardtype ) . ': x' . esc_html( last4( $order->accountnumber ) ) . '
    '; + } + + if ( ! empty( $order->billing->name ) ) { + $r .= esc_html( $order->billing->name ) . '
    '; + } + + if ( ! empty( $order->billing->street ) ) { + $r .= esc_html( $order->billing->street ) . '
    '; + } + + if ( $order->billing->city && $order->billing->state ) { + $r .= esc_html( $order->billing->city ) . ', '; + $r .= esc_html( $order->billing->state ) . ' '; + $r .= esc_html( $order->billing->zip ) . ' '; + if ( ! empty( $order->billing->country ) ) { + $r .= esc_html( $order->billing->country ); + } + } + + if ( ! empty( $order->billing->phone ) ) { + $r .= '
    ' . esc_html( formatPhone( $order->billing->phone ) ); + } + + // If this column is completely empty, set $r to a dash. + if ( empty( $r ) ) { + $r .= esc_html( '—', 'paid-memberships-pro' ); + } + + // Echo the data for this column. + echo $r; ?>
    gateway; ?> + gateway_environment == 'test' ) { - echo '(test)'; - } + if ( ! empty( $order->gateway ) ) { + if ( ! empty( $pmpro_gateways[$order->gateway] ) ) { + echo $pmpro_gateways[$order->gateway]; + } else { + esc_html_e( ucwords( $order->gateway ) ); + } + if ( $order->gateway_environment == 'sandbox' ) { + echo ' (test)'; + } + } else { + esc_html_e( '—', 'paid-memberships-pro' ); + } ?> + : payment_transaction_id ) ) { @@ -1546,18 +1584,38 @@ class="alternate"> } ?> status ); if( $order->is_renewal() ){ echo "
    (".__( 'renewal', 'paid-memberships-pro' ).")"; } ?>
    - getTimestamp() ) ); ?>
    - getTimestamp() ) ); ?> -
    - getDiscountCode() ) { ?> - - discount_code->code ); ?> - + + + status, array( 'success', 'cancelled' ) ) ) { + esc_html_e( 'Paid', 'paid-memberships-pro' ); + } else { + esc_html_e( ucwords( $order->status ) ); + } ?> + + is_renewal() ) { ?> + + getTimestamp() ) ), + esc_html( date_i18n( get_option( 'time_format' ), $order->getTimestamp() ) ), + ) ); ?> + + getDiscountCode() ) { ?> + + discount_code->code ); ?> + + +
    @@ -423,7 +428,7 @@ ?>
    @@ -431,15 +436,63 @@ if ( in_array( 'code', $read_only_fields ) ) { echo esc_html( $order->code ); } else { ?> - + +

    + 0 ) { + echo esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $order->getTimestamp() ) ); + } else { + // set up date vars + if ( ! empty( $order->timestamp ) ) { + $timestamp = $order->getTimestamp(); + } else { + $timestamp = current_time( 'timestamp' ); + } + + $year = date( 'Y', $timestamp ); + $month = date( 'n', $timestamp ); + $day = date( 'j', $timestamp ); + $hour = date( 'H', $timestamp ); + $minute = date( 'i', $timestamp ); + $second = date( 's', $timestamp ); + ?> + + + + + : + + +
    +
    +

    + + + + +
    @@ -447,7 +500,7 @@ if ( in_array( 'user_id', $read_only_fields ) && $order_id > 0 ) { echo esc_html( $order->user_id ); } else { ?> - + @@ -460,12 +513,18 @@ if ( in_array( 'membership_id', $read_only_fields ) && $order_id > 0 ) { echo esc_html( $order->membership_id ); } else { ?> - +
    +
    +

    + + @@ -555,6 +614,13 @@ + +
    +
    +

    + + + 0 ) { $order->getDiscountCode(); @@ -711,23 +777,15 @@ - - - - + } else { ?> - + @@ -736,7 +794,7 @@ - + +
    - - MM -
    + / - YYYY + MM/YYYY
    0 ) { - echo esc_html( $order->status ); + echo esc_html( ucwords( $order->status ) ); } else { ?> + value="" status, $status ); ?>>
    +
    +

    + + - - - - - - + +
    @@ -822,48 +885,12 @@

    - 0 ) { - echo esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $order->getTimestamp() ) ); - } else { - // set up date vars - if ( ! empty( $order->timestamp ) ) { - $timestamp = $order->getTimestamp(); - } else { - $timestamp = current_time( 'timestamp' ); - } - - $year = date( 'Y', $timestamp ); - $month = date( 'n', $timestamp ); - $day = date( 'j', $timestamp ); - $hour = date( 'H', $timestamp ); - $minute = date( 'i', $timestamp ); - $second = date( 's', $timestamp ); - ?> - - - - - : - - -
    +
    +

    + + * { + margin: 0 1.5em 0 0; +} +.pmpro-page-actions a { + font-weight: 500; + text-decoration: none; +} + /* Consent Log */ .pmpro_consent_log.pmpro_scrollable { max-width: 800px; From 714bceff0a449b392d86161be8a67a4186f436e4 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Thu, 31 Mar 2022 15:36:50 -0400 Subject: [PATCH 089/145] Adjusting the help text for the show_noaccess setting --- blocks/membership/block.js | 2 +- js/blocks.build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blocks/membership/block.js b/blocks/membership/block.js index 4eab34085..3db915146 100644 --- a/blocks/membership/block.js +++ b/blocks/membership/block.js @@ -103,7 +103,7 @@ const all_levels = [{ value: 0, label: "Non-Members" }].concat( pmpro.all_level_

    { __( 'What should users without access see?', 'paid-memberships-pro' ) }

    Advanced Settings page.", "paid-memberships-pro" ) } options={ [ { label: __( "Show nothing", 'paid-memberships-pro' ), value: '0' }, { label: __( "Show the 'no access' message", 'paid-memberships-pro' ), value: '1' }, diff --git a/js/blocks.build.js b/js/blocks.build.js index 72f8e1043..ea32ddc1f 100644 --- a/js/blocks.build.js +++ b/js/blocks.build.js @@ -1 +1 @@ -!function(e){var r={};function t(o){if(r[o])return r[o].exports;var p=r[o]={i:o,l:!1,exports:{}};return e[o].call(p.exports,p,p.exports,t),p.l=!0,p.exports}t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var p in e)t.d(o,p,function(r){return e[r]}.bind(null,p));return o},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=ue.SelectControl,ye=wp.blockEditor,ge=ye.InspectorControls,ve=ye.InnerBlocks,ke=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),Oe=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""},show_noaccess:{type:"boolean",default:!1}},edit:function(e){var r=e.attributes,t=r.levels,p=r.uid,s=r.show_noaccess,i=e.setAttributes,c=e.isSelected;if(""==p){var n=Math.random()+"";i({uid:n})}var a=ke.map((function(e){return[Object(o.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var o=t.slice();o.push(e.value+""),i({levels:o})}else if(!r&&t.some((function(r){return r==e.value}))){var p=t.filter((function(r){return r!=e.value}));i({levels:p})}}})]}));return[c&&Object(o.createElement)(ge,null,Object(o.createElement)(de,null,Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("Which membership levels can view this block?","paid-memberships-pro"))),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},a),Object(o.createElement)("hr",null),Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("What should users without access see?","paid-memberships-pro"))),Object(o.createElement)(fe,{value:s,help:me("Optionally show the message for visitors or logged-in users without access as defined in PMPro Advanced Settings.","paid-memberships-pro"),options:[{label:me("Show nothing","paid-memberships-pro"),value:"0"},{label:me("Show the 'no access' message","paid-memberships-pro"),value:"1"}],onChange:function(e){return i({show_noaccess:e})}}))),c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(o.createElement)(de,null,a)),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1})),!c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(o.createElement)("div",{className:r},Object(o.createElement)(ve.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:Oe("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:Oe("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[Oe("custom field","paid-memberships-pro"),Oe("fields","paid-memberships-pro"),Oe("paid memberships pro","paid-memberships-pro"),Oe("pmpro","paid-memberships-pro"),Oe("user fields","paid-memberships-pro")],edit:function(e){return Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Oe("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Oe("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function we(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var je,_e=wp.i18n.__,Ee=wp.element.Component,Pe=wp.components,Ce=Pe.PanelBody,Fe=(Pe.SelectControl,Pe.ToggleControl),Me=wp.blockEditor.InspectorControls,xe=function(e){m()(t,e);var r=we(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,p=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,i=t.show_logout_link;t.location;return Object(o.createElement)(Me,null,Object(o.createElement)(Ce,null,Object(o.createElement)(Fe,{label:_e("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:p,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(o.createElement)(Fe,{label:_e("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:_e("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(o.createElement)(Fe,{label:_e("Display a 'Log Out' link.","paid-memberships-pro"),checked:i,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(Ee),Be=wp.i18n.__,Ne=wp.blocks.registerBlockType,Ae=wp.element.Fragment;Ne("pmpro/login-form",{title:Be("Login Form","paid-memberships-pro"),description:Be("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[Be("log in","paid-memberships-pro"),Be("lost password","paid-memberships-pro"),Be("paid memberships pro","paid-memberships-pro"),Be("password reset","paid-memberships-pro"),Be("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(o.createElement)(Ae,null,Object(o.createElement)(xe,e),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Be("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Be("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});je=Object(o.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(o.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:je}),wp.blocks.updateCategory("pmpro-pages",{icon:je})}]); \ No newline at end of file +!function(e){var r={};function t(o){if(r[o])return r[o].exports;var p=r[o]={i:o,l:!1,exports:{}};return e[o].call(p.exports,p,p.exports,t),p.l=!0,p.exports}t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var p in e)t.d(o,p,function(r){return e[r]}.bind(null,p));return o},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=11)}([function(e,r){e.exports=window.wp.element},function(e,r){function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){e.exports=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,r){function t(e,r){for(var t=0;t Settings > Levels.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"list-view"},keywords:[le("level","paid-memberships-pro"),le("paid memberships pro","paid-memberships-pro"),le("pmpro","paid-memberships-pro"),le("price","paid-memberships-pro"),le("pricing table","paid-memberships-pro")],supports:{},attributes:{},edit:function(){return[Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},le("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},le("Membership Levels List","paid-memberships-pro")))]},save:function(){return null}}),wp.i18n.__),be=wp.blocks.registerBlockType,ue=wp.components,de=ue.PanelBody,he=ue.CheckboxControl,fe=ue.SelectControl,ye=wp.blockEditor,ge=ye.InspectorControls,ve=ye.InnerBlocks,ke=[{value:0,label:"Non-Members"}].concat(pmpro.all_level_values_and_labels),Oe=(be("pmpro/membership",{title:me("Membership Required Block","paid-memberships-pro"),description:me("Nest blocks within this wrapper to control the inner block visibility by membership level or for non-members only.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"visibility"},keywords:[me("block visibility","paid-memberships-pro"),me("confitional","paid-memberships-pro"),me("content","paid-memberships-pro"),me("hide","paid-memberships-pro"),me("hidden","paid-memberships-pro"),me("paid memberships pro","paid-memberships-pro"),me("pmpro","paid-memberships-pro"),me("private","paid-memberships-pro"),me("restrict","paid-memberships-pro")],attributes:{levels:{type:"array",default:[]},uid:{type:"string",default:""},show_noaccess:{type:"boolean",default:!1}},edit:function(e){var r=e.attributes,t=r.levels,p=r.uid,s=r.show_noaccess,i=e.setAttributes,c=e.isSelected;if(""==p){var n=Math.random()+"";i({uid:n})}var a=ke.map((function(e){return[Object(o.createElement)(he,{label:e.label,checked:t.some((function(r){return r==e.value})),onChange:function(r){if(r&&!t.some((function(r){return r==e.value}))){var o=t.slice();o.push(e.value+""),i({levels:o})}else if(!r&&t.some((function(r){return r==e.value}))){var p=t.filter((function(r){return r!=e.value}));i({levels:p})}}})]}));return[c&&Object(o.createElement)(ge,null,Object(o.createElement)(de,null,Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("Which membership levels can view this block?","paid-memberships-pro"))),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},a),Object(o.createElement)("hr",null),Object(o.createElement)("p",null,Object(o.createElement)("strong",null,me("What should users without access see?","paid-memberships-pro"))),Object(o.createElement)(fe,{value:s,help:me("Modify the 'no access' message on the Memberships > Advanced Settings page.","paid-memberships-pro"),options:[{label:me("Show nothing","paid-memberships-pro"),value:"0"},{label:me("Show the 'no access' message","paid-memberships-pro"),value:"1"}],onChange:function(e){return i({show_noaccess:e})}}))),c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)("div",{class:"pmpro-block-inspector-scrollable"},Object(o.createElement)(de,null,a)),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1})),!c&&Object(o.createElement)("div",{className:"pmpro-block-require-membership-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},me("Membership Required","paid-memberships-pro")),Object(o.createElement)(ve,{renderAppender:function(){return Object(o.createElement)(ve.ButtonBlockAppender,null)},templateLock:!1}))]},save:function(e){var r=e.className;return Object(o.createElement)("div",{className:r},Object(o.createElement)(ve.Content,null))}}),wp.i18n.__);(0,wp.blocks.registerBlockType)("pmpro/member-profile-edit",{title:Oe("PMPro Page: Account Profile Edit","paid-memberships-pro"),description:Oe("Dynaimc form that allows the current logged in member to edit their default user profile information and any custom user profile fields.","paid-memberships-pro"),category:"pmpro-pages",icon:{background:"#FFFFFF",foreground:"#1A688B",src:"admin-users"},keywords:[Oe("custom field","paid-memberships-pro"),Oe("fields","paid-memberships-pro"),Oe("paid memberships pro","paid-memberships-pro"),Oe("pmpro","paid-memberships-pro"),Oe("user fields","paid-memberships-pro")],edit:function(e){return Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Oe("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Oe("Member Profile Edit","paid-memberships-pro")))},save:function(){return null}});function je(e){var r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var t,o=h()(e);if(r){var p=h()(this).constructor;t=Reflect.construct(o,arguments,p)}else t=o.apply(this,arguments);return u()(this,t)}}var we,_e=wp.i18n.__,Ee=wp.element.Component,Pe=wp.components,Ce=Pe.PanelBody,Fe=(Pe.SelectControl,Pe.ToggleControl),Me=wp.blockEditor.InspectorControls,xe=function(e){m()(t,e);var r=je(t);function t(){return c()(this,t),r.apply(this,arguments)}return a()(t,[{key:"render",value:function(){var e=this,r=this.props,t=r.attributes,p=(r.setAttributes,t.display_if_logged_in),s=t.show_menu,i=t.show_logout_link;t.location;return Object(o.createElement)(Me,null,Object(o.createElement)(Ce,null,Object(o.createElement)(Fe,{label:_e("Display 'Welcome' content when logged in.","paid-memberships-pro"),checked:p,onChange:function(r){e.props.setAttributes({display_if_logged_in:r})}}),Object(o.createElement)(Fe,{label:_e("Display the 'Log In Widget' menu.","paid-memberships-pro"),help:_e("Assign the menu under Appearance > Menus.","paid-memberships-pro"),checked:s,onChange:function(r){e.props.setAttributes({show_menu:r})}}),Object(o.createElement)(Fe,{label:_e("Display a 'Log Out' link.","paid-memberships-pro"),checked:i,onChange:function(r){e.props.setAttributes({show_logout_link:r})}})))}}]),t}(Ee),Be=wp.i18n.__,Ne=wp.blocks.registerBlockType,Ae=wp.element.Fragment;Ne("pmpro/login-form",{title:Be("Login Form","paid-memberships-pro"),description:Be("Dynamic form that allows users to log in or recover a loast password. Logged in users can see a welcome message with the selected custom menu.","paid-memberships-pro"),category:"pmpro",icon:{background:"#FFFFFF",foreground:"#658B24",src:"unlock"},keywords:[Be("log in","paid-memberships-pro"),Be("lost password","paid-memberships-pro"),Be("paid memberships pro","paid-memberships-pro"),Be("password reset","paid-memberships-pro"),Be("pmpro","paid-memberships-pro")],supports:{},edit:function(e){return[Object(o.createElement)(Ae,null,Object(o.createElement)(xe,e),Object(o.createElement)("div",{className:"pmpro-block-element"},Object(o.createElement)("span",{className:"pmpro-block-title"},Be("Paid Memberships Pro","paid-memberships-pro")),Object(o.createElement)("span",{className:"pmpro-block-subtitle"},Be("Log in Form","paid-memberships-pro"))))]},save:function(){return null}});we=Object(o.createElement)("svg",{version:"1.1",id:"Layer_1",x:"0px",y:"0px",viewBox:"0 0 18 18"},Object(o.createElement)("path",{d:"M17.99,4.53c-0.35,0.12-0.7,0.26-1.06,0.4c-0.35,0.14-0.7,0.3-1.05,0.46c-0.35,0.16-0.69,0.33-1.03,0.51 c-0.34,0.18-0.68,0.37-1.02,0.56c-0.15,0.09-0.31,0.18-0.46,0.27c-0.15,0.09-0.3,0.19-0.45,0.28c-0.15,0.1-0.3,0.19-0.45,0.29 c-0.15,0.1-0.3,0.2-0.44,0.3c-0.08,0.05-0.16,0.11-0.23,0.16c-0.08,0.05-0.16,0.11-0.23,0.17c-0.08,0.06-0.15,0.11-0.23,0.17 c-0.08,0.06-0.15,0.11-0.23,0.17c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15c-0.07,0.05-0.13,0.1-0.2,0.15 c-0.07,0.05-0.13,0.1-0.2,0.16c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1C10,9.13,9.95,9.17,9.91,9.2 C9.87,9.24,9.83,9.27,9.79,9.31C9.77,9.32,9.75,9.33,9.74,9.35C9.72,9.36,9.71,9.37,9.69,9.39C9.67,9.4,9.66,9.42,9.64,9.43 C9.63,9.44,9.61,9.46,9.59,9.47C9.54,9.52,9.49,9.56,9.43,9.61C9.38,9.65,9.33,9.7,9.27,9.74C9.22,9.79,9.17,9.84,9.11,9.88 c-0.05,0.05-0.11,0.09-0.16,0.14c-0.27,0.24-0.54,0.49-0.81,0.75c-0.26,0.25-0.53,0.51-0.78,0.78c-0.26,0.26-0.51,0.53-0.76,0.81 c-0.25,0.27-0.49,0.55-0.73,0.84c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12 c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.07,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12c-0.03,0.04-0.06,0.08-0.1,0.12 c-0.03,0.04-0.06,0.08-0.1,0.12c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02c0,0.01-0.01,0.01-0.01,0.02 c0,0.01-0.01,0.01-0.01,0.02c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.1c-0.03,0.03-0.05,0.07-0.08,0.11 c-0.03,0.03-0.05,0.07-0.08,0.11c-0.03,0.04-0.06,0.08-0.09,0.12c-0.03,0.04-0.06,0.08-0.09,0.12C4.5,14.96,4.47,15,4.44,15.05 c-0.03,0.04-0.06,0.08-0.09,0.13c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01c0,0-0.01,0.01-0.01,0.01 c-0.15,0.22-0.31,0.44-0.46,0.67c-0.15,0.22-0.3,0.45-0.44,0.68c-0.14,0.23-0.29,0.46-0.43,0.7C2.85,17.52,2.71,17.76,2.58,18 c-0.08-0.19-0.16-0.38-0.23-0.56c-0.07-0.18-0.14-0.35-0.21-0.51c-0.07-0.16-0.13-0.32-0.19-0.47c-0.06-0.15-0.12-0.3-0.18-0.45 l-0.01,0.01l0.01-0.03c-0.01-0.03-0.02-0.05-0.03-0.08c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02c0-0.01-0.01-0.02-0.01-0.02 c0-0.01-0.01-0.02-0.01-0.02c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.02-0.01-0.04-0.02-0.05 c-0.01-0.02-0.01-0.04-0.02-0.05c-0.01-0.03-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07c-0.01-0.02-0.02-0.05-0.03-0.07 c-0.01-0.02-0.02-0.05-0.03-0.07c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.1-0.06-0.16c-0.02-0.05-0.04-0.11-0.06-0.16 c-0.02-0.05-0.04-0.11-0.06-0.16c-0.08-0.23-0.16-0.47-0.25-0.72c-0.08-0.25-0.17-0.5-0.26-0.77c-0.09-0.27-0.18-0.55-0.27-0.84 c-0.09-0.29-0.19-0.6-0.29-0.93c0.05,0.07,0.1,0.15,0.15,0.22c0.05,0.07,0.1,0.14,0.14,0.2c0.05,0.07,0.09,0.13,0.14,0.19 c0.04,0.06,0.09,0.12,0.13,0.18c0.09,0.13,0.18,0.24,0.27,0.35c0.09,0.11,0.17,0.21,0.24,0.3c0.08,0.09,0.15,0.18,0.23,0.27 c0.07,0.09,0.15,0.17,0.22,0.25c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06c0.02,0.02,0.03,0.04,0.05,0.06 c0.02,0.02,0.03,0.04,0.05,0.06c0.07,0.07,0.13,0.14,0.2,0.22c0.07,0.08,0.14,0.16,0.22,0.24c0.08,0.08,0.16,0.17,0.24,0.27 c0.09,0.1,0.18,0.2,0.27,0.31c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.03c0.01,0.01,0.02,0.02,0.03,0.04 c0.01,0.01,0.02,0.02,0.03,0.04c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07c0.02-0.02,0.04-0.05,0.06-0.07 C2.96,14.03,2.98,14,3,13.98c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09c0.03-0.03,0.05-0.06,0.08-0.09 c0.03-0.03,0.05-0.06,0.08-0.09c0.28-0.33,0.58-0.65,0.88-0.97c0.31-0.32,0.63-0.62,0.95-0.92c0.33-0.3,0.67-0.6,1.02-0.88 c0.35-0.29,0.72-0.57,1.09-0.84c0.06-0.04,0.11-0.08,0.17-0.12C7.49,9.83,7.55,9.79,7.6,9.75c0.06-0.04,0.11-0.08,0.17-0.12 c0.06-0.04,0.12-0.08,0.17-0.12C7.97,9.5,7.98,9.49,8,9.48c0.02-0.01,0.03-0.02,0.05-0.03C8.06,9.43,8.08,9.42,8.1,9.41 C8.11,9.4,8.13,9.38,8.14,9.37c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1c0.05-0.03,0.1-0.06,0.14-0.1 c0.05-0.03,0.1-0.06,0.15-0.09C8.79,8.94,8.87,8.9,8.94,8.85C9.01,8.8,9.09,8.76,9.16,8.71c0.07-0.05,0.15-0.09,0.22-0.14 c0.07-0.05,0.15-0.09,0.22-0.14c0.09-0.05,0.17-0.11,0.26-0.16c0.09-0.05,0.17-0.1,0.26-0.16c0.09-0.05,0.18-0.1,0.27-0.15 c0.09-0.05,0.18-0.1,0.27-0.15c0.25-0.14,0.51-0.28,0.76-0.42c0.26-0.14,0.52-0.27,0.78-0.41c0.26-0.13,0.53-0.27,0.79-0.4 c0.27-0.13,0.54-0.26,0.81-0.38c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01c0.01,0,0.02-0.01,0.03-0.01 c0.01,0,0.02-0.01,0.03-0.01c0.33-0.15,0.67-0.3,1-0.44c0.34-0.15,0.68-0.29,1.02-0.42c0.34-0.14,0.69-0.27,1.03-0.4 C17.31,4.77,17.65,4.64,17.99,4.53z M15.73,9.59l0.65,4.56l-10.4-0.05c-0.02,0.02-0.04,0.04-0.05,0.07 c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.04,0.04-0.05,0.07c-0.02,0.02-0.03,0.04-0.05,0.06 c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06c-0.02,0.02-0.03,0.04-0.05,0.06l11.23,0.2l-0.78-5.24L15.73,9.59z M6.75,13.2c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.08,0.09-0.11,0.13c-0.04,0.04-0.07,0.09-0.11,0.13l9.22-0.07L15.04,9.1 l-0.07-0.53l-0.39,0.04l0.55,4.3l-8.27,0.17C6.83,13.12,6.79,13.16,6.75,13.2z M13.78,7.66l-0.59,0.08 c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12c-0.06,0.04-0.12,0.08-0.18,0.12 c-0.08,0.05-0.16,0.11-0.24,0.16c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17c-0.08,0.06-0.16,0.11-0.24,0.17 c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.21,0.15c-0.07,0.05-0.14,0.1-0.2,0.16c-0.07,0.05-0.14,0.11-0.2,0.16 c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.03-0.09,0.07-0.13,0.1c-0.04,0.04-0.09,0.07-0.13,0.11c-0.04,0.04-0.09,0.07-0.13,0.11 c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04c-0.02,0.01-0.03,0.03-0.05,0.04 c-0.06,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14c-0.05,0.05-0.11,0.09-0.16,0.14 c-0.17,0.15-0.34,0.3-0.51,0.46c-0.17,0.16-0.33,0.31-0.5,0.47c-0.16,0.16-0.33,0.32-0.49,0.48c-0.16,0.16-0.32,0.33-0.48,0.49 l6.98-0.23l-0.48-4.16L13.78,7.66z M13.32,5.73c-0.06,0.03-0.11,0.05-0.17,0.08c-0.06,0.03-0.12,0.06-0.17,0.09 c-0.03,0.01-0.06,0.03-0.08,0.04c0,0,0,0,0,0c-0.02-0.01-0.04-0.03-0.06-0.04c-0.06-0.04-0.13-0.07-0.21-0.09 c-0.07-0.02-0.15-0.04-0.23-0.04c-0.08,0-0.16,0-0.24,0.01l-0.14,0.02c0.07-0.04,0.13-0.08,0.18-0.14c0.05-0.05,0.1-0.11,0.14-0.18 c0.04-0.06,0.06-0.13,0.08-0.2c0.02-0.07,0.02-0.15,0.01-0.22c-0.01-0.1-0.04-0.18-0.08-0.26c-0.05-0.08-0.11-0.14-0.18-0.19 c-0.07-0.05-0.16-0.08-0.25-0.1c-0.09-0.02-0.19-0.02-0.29,0c-0.1,0.02-0.19,0.06-0.27,0.11c-0.08,0.05-0.15,0.11-0.21,0.19 C11.08,4.9,11.03,4.98,11,5.07c-0.03,0.09-0.04,0.18-0.03,0.27c0.01,0.07,0.02,0.14,0.05,0.2c0.03,0.06,0.06,0.12,0.11,0.17 c0.05,0.05,0.1,0.09,0.16,0.12c0.06,0.03,0.13,0.06,0.2,0.07l-0.17,0.03C11.18,5.96,11.06,6,10.94,6.07 c-0.11,0.07-0.21,0.15-0.29,0.25c-0.08,0.1-0.14,0.21-0.19,0.33c-0.04,0.12-0.06,0.25-0.05,0.38l0.02,0.33 c-0.09,0.05-0.17,0.1-0.26,0.16c-0.02,0-0.05,0-0.07,0c0.02-0.01,0.04-0.02,0.06-0.03c-0.06-0.06-0.13-0.11-0.21-0.16 c-0.07-0.04-0.15-0.08-0.24-0.1C9.63,7.2,9.54,7.18,9.45,7.18c-0.09-0.01-0.18,0-0.27,0.01L9.01,7.21c0.08-0.05,0.16-0.1,0.23-0.17 C9.3,6.97,9.36,6.9,9.41,6.81C9.46,6.73,9.5,6.64,9.52,6.55c0.02-0.09,0.03-0.19,0.03-0.29C9.54,6.13,9.51,6.02,9.46,5.92 c-0.05-0.1-0.12-0.18-0.21-0.25C9.17,5.6,9.07,5.56,8.96,5.53c-0.11-0.02-0.22-0.03-0.34,0C8.5,5.55,8.39,5.6,8.29,5.66 C8.19,5.72,8.1,5.81,8.02,5.9C7.95,5.99,7.89,6.1,7.85,6.21C7.81,6.32,7.79,6.44,7.79,6.56c0,0.09,0.02,0.18,0.05,0.26 c0.03,0.08,0.07,0.16,0.12,0.22c0.05,0.07,0.11,0.12,0.18,0.17c0.07,0.04,0.15,0.08,0.23,0.1l-0.2,0.03 C8.01,7.37,7.85,7.42,7.72,7.51C7.58,7.59,7.46,7.7,7.35,7.82C7.25,7.95,7.17,8.1,7.11,8.25c-0.06,0.16-0.09,0.33-0.08,0.5 l0.01,0.74C6.98,9.53,6.93,9.58,6.88,9.62C6.81,9.49,6.74,9.38,6.65,9.28c-0.1-0.11-0.21-0.2-0.33-0.27 C6.2,8.94,6.07,8.89,5.93,8.87C5.8,8.84,5.66,8.83,5.51,8.85L5.3,8.88c0.1-0.06,0.2-0.13,0.29-0.22c0.09-0.09,0.16-0.19,0.23-0.3 c0.06-0.11,0.12-0.23,0.15-0.35C6,7.88,6.02,7.75,6.02,7.62c0-0.17-0.03-0.32-0.08-0.46C5.88,7.03,5.8,6.91,5.71,6.82 C5.61,6.73,5.5,6.67,5.37,6.63c-0.12-0.04-0.26-0.04-0.4-0.02c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0 c-0.14,0.03-0.28,0.08-0.4,0.16c-0.12,0.08-0.23,0.18-0.33,0.3C4.14,7.2,4.07,7.33,4.01,7.48c-0.06,0.15-0.09,0.3-0.1,0.46 c0,0.12,0.01,0.24,0.03,0.35c0.03,0.11,0.07,0.21,0.12,0.3c0.05,0.09,0.12,0.17,0.2,0.23c0.08,0.06,0.17,0.11,0.27,0.14L4.3,9 C4.1,9.03,3.92,9.09,3.75,9.2C3.58,9.3,3.43,9.44,3.3,9.6c-0.13,0.16-0.24,0.35-0.32,0.56c-0.08,0.21-0.13,0.43-0.14,0.67 l-0.12,2.26l-0.53-0.6l0.49-6.3C2.68,6.09,2.71,6,2.74,5.91c0.04-0.09,0.08-0.17,0.14-0.24c0.06-0.07,0.12-0.14,0.2-0.19 C3.15,5.44,3.23,5.4,3.32,5.38l0.71-0.17l0-0.02l0.18-0.04l0.06-1.19C4.3,3.56,4.39,3.15,4.55,2.77c0.16-0.38,0.37-0.75,0.64-1.08 C5.45,1.35,5.76,1.05,6.11,0.8c0.35-0.26,0.74-0.47,1.16-0.61C7.7,0.05,8.12-0.01,8.51,0c0.4,0.02,0.77,0.12,1.1,0.29 c0.33,0.18,0.62,0.43,0.83,0.75c0.21,0.33,0.35,0.73,0.38,1.19l0.1,1.36l0.3-0.07l0,0.02l0.89-0.21c0.13-0.03,0.25-0.03,0.36-0.02 c0.12,0.02,0.22,0.05,0.32,0.11c0.09,0.05,0.17,0.13,0.23,0.21c0.06,0.09,0.1,0.19,0.11,0.31L13.32,5.73z M9.46,3.96L9.4,2.61 C9.39,2.33,9.31,2.09,9.19,1.88C9.07,1.68,8.91,1.51,8.71,1.4C8.52,1.28,8.29,1.21,8.05,1.19C7.81,1.17,7.55,1.2,7.28,1.28 C7.01,1.37,6.76,1.49,6.53,1.65c-0.22,0.16-0.43,0.35-0.6,0.57C5.77,2.43,5.63,2.67,5.53,2.91c-0.1,0.25-0.16,0.5-0.17,0.76 L5.33,4.91L9.46,3.96z"})),wp.blocks.updateCategory("pmpro",{icon:we}),wp.blocks.updateCategory("pmpro-pages",{icon:we})}]); \ No newline at end of file From 95087f0cc799d0750687f786459a2617a6a7f041 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 4 Apr 2022 14:01:13 -0400 Subject: [PATCH 090/145] Finalizing improvements to single order edit screen --- adminpages/orders.php | 58 +++++++++++++++++++++---------------------- css/admin.css | 56 ++++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 55 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 34c529d04..62f8fc925 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -384,16 +384,15 @@ ?> +
    id ) ) { ?> -

    #id ); ?>

    -
    - - - - -
    +

    ID: id ); ?>

    + + + +

    @@ -415,20 +414,6 @@
    - - - - -*/ ?>
    - id ) ) { - echo esc_html( $order->id ); - } else { - echo '

    ' . __( 'This will be generated when you save.', 'paid-memberships-pro' ) . '

    '; - } - ?> -
    @@ -522,8 +507,13 @@

    -

    - +

    + + billing_street) ) { ?> + + +

    +
    billing_street) ) { ?> style="display: none;"> -
    @@ -615,7 +605,16 @@
    + +

    @@ -802,7 +801,7 @@ 0 ) { echo $order->subscription_transaction_id; - } else { - ?> - + } else { ?> + + is_renewal() ) { ?> + +

    diff --git a/css/admin.css b/css/admin.css index dec257122..cf07bc807 100644 --- a/css/admin.css +++ b/css/admin.css @@ -6,7 +6,7 @@ border-bottom-width: 1px; } -/* icon */ +/* icons */ #wp-admin-bar-paid-memberships-pro .ab-item .ab-icon:before { font-family: "dashicons"; content: "\f307"; @@ -14,12 +14,27 @@ .pmpro_admin tr td .dashicons { padding-top: 5px; } +.pmpro_admin .pmpro-has-icon:before { + font: normal 16px/1 dashicons; + margin-right: 8px; + speak: never; + vertical-align: middle; + position: relative; + top: -2px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.pmpro_admin .pmpro-has-icon-printer:before { + content: "\f193"; +} +.pmpro_admin .pmpro-has-icon-email:before { + content: "\f465"; +} +.pmpro_admin .pmpro-has-icon-admin-users:before { + content: "\f110"; +} /* header/etc */ -.pmpro-page #wpcontent, -.pmpro-page #wpbody-content{ - padding: 0; -} .pmpro_admin { background-image: url(../images/Paid-Memberships-Pro_watermark.png); background-position: bottom right; @@ -94,6 +109,10 @@ max-width: 200px; height: auto; } +.pmpro_admin h2, +.pmpro_admin h3 { + font-size: 18px; +} /* Scollable Boxes */ .pmpro_scrollable { @@ -154,26 +173,6 @@ margin-top: 0; } -/* Page Actions Row */ -.pmpro-page-actions { - align-items: center; - background-color: #FFF; - border: 1px solid #C3C4C7; - border-radius: 5px; - box-shadow: 0 1px 1px rgb(0 0 0 / 4%); - display: flex; - font-size: 14px; - margin: 1em 0; - padding: 1em; -} -.pmpro-page-actions > * { - margin: 0 1.5em 0 0; -} -.pmpro-page-actions a { - font-weight: 500; - text-decoration: none; -} - /* Consent Log */ .pmpro_consent_log.pmpro_scrollable { max-width: 800px; @@ -435,7 +434,7 @@ border-color: #ffeeba; color: #6C5101; } -.pmpro_order-renewal { +.wp-list-table .pmpro_order-renewal { display: block; margin-top: 8px; text-align: center; @@ -450,6 +449,11 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } +.memberships_page_pmpro-orders #show_billing_action { + font-size: 14px; + font-weight: normal; + margin-left: 10px; +} /* members list */ .wp-list-table.members .column-ID { From 67459719ae7813028d408451f01a8fc47009d616 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 4 Apr 2022 14:04:46 -0400 Subject: [PATCH 091/145] adjusting the toggle link to show fields to match heading label --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 62f8fc925..cb688ac03 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -510,7 +510,7 @@

    billing_street) ) { ?> - +

    billing_street) ) { ?> style="display: none;"> From 9a176e801fdc4b6f4b39eb83aed83128edb6de48 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 4 Apr 2022 14:45:58 -0400 Subject: [PATCH 092/145] Adjusting email templates variables reference and other ui on email templates admin page --- adminpages/emailtemplates.php | 154 ++++++++++++++++------------------ css/admin.css | 8 +- 2 files changed, 75 insertions(+), 87 deletions(-) diff --git a/adminpages/emailtemplates.php b/adminpages/emailtemplates.php index e69f324e1..2cf03b8cc 100644 --- a/adminpages/emailtemplates.php +++ b/adminpages/emailtemplates.php @@ -17,9 +17,10 @@ -


    +

    +

    @@ -111,90 +112,79 @@
    -

    +

    -
    + +

    +
    + + __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ), + '!!user_login!!' => __( 'Username', 'paid-memberships-pro' ), + '!!sitename!!' => __( 'Site Title', 'paid-memberships-pro' ), + '!!siteemail!!' => __( 'Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)', 'paid-memberships-pro' ), + '!!membership_id!!' => __( 'Membership Level ID', 'paid-memberships-pro' ), + '!!membership_level_name!!' => __( 'Membership Level Name', 'paid-memberships-pro' ), + '!!membership_change!!' => __( 'Membership Level Change', 'paid-memberships-pro' ), + '!!membership_expiration!!' => __( 'Membership Level Expiration', 'paid-memberships-pro' ), + '!!startdate!!' => __( 'Membership Start Date', 'paid-memberships-pro' ), + '!!enddate!!' => __( 'Membership End Date', 'paid-memberships-pro' ), + '!!display_name!!' => __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ), + '!!user_email!!' => __( 'User Email', 'paid-memberships-pro' ), + '!!login_url!!' => __( 'Login URL', 'paid-memberships-pro' ), + '!!levels_url!!' => __( 'Membership Levels Page URL', 'paid-memberships-pro' ), + ]; + + foreach ( $email_variables as $email_variable => $description ) { + ?> + + + + + + +
    + +

    + - - - - - - - - + __( 'Billing Info Complete Address', 'paid-memberships-pro' ), + '!!billing_name!!' => __( 'Billing Info Name', 'paid-memberships-pro' ), + '!!billing_street!!' => __( 'Billing Info Street Address', 'paid-memberships-pro' ), + '!!billing_city!!' => __( 'Billing Info City', 'paid-memberships-pro' ), + '!!billing_state!!' => __( 'Billing Info State', 'paid-memberships-pro' ), + '!!billing_zip!!' => __( 'Billing Info ZIP Code', 'paid-memberships-pro' ), + '!!billing_country!!' => __( 'Billing Info Country', 'paid-memberships-pro' ), + '!!billing_phone!!' => __( 'Billing Info Phone #', 'paid-memberships-pro' ), + '!!cardtype!!' => __( 'Credit Card Type', 'paid-memberships-pro' ), + '!!accountnumber!!' => __( 'Credit Card Number (last 4 digits)', 'paid-memberships-pro' ), + '!!expirationmonth!!' => __( 'Credit Card Expiration Month (mm format)', 'paid-memberships-pro' ), + '!!expirationyear!!' => __( 'Credit Card Expiration Year (yyyy format)', 'paid-memberships-pro' ), + '!!membership_cost!!' => __( 'Membership Level Cost Text', 'paid-memberships-pro' ), + '!!instructions!!' => __( 'Payment Instructions (used in Checkout - Email Template)', 'paid-memberships-pro' ), + '!!invoice_id!!' => __( 'Invoice ID', 'paid-memberships-pro' ), + '!!invoice_total!!' => __( 'Invoice Total', 'paid-memberships-pro' ), + '!!invoice_date!!' => __( 'Invoice Date', 'paid-memberships-pro' ), + '!!invoice_url!!' => __( 'Invoice Page URL', 'paid-memberships-pro' ), + '!!discount_code!!' => __( 'Discount Code Applied', 'paid-memberships-pro' ), + '!!membership_level_confirmation_message!!' => __( 'Custom Level Confirmation Message', 'paid-memberships-pro' ), + ]; + + foreach ( $email_variables as $email_variable => $description ) { + ?> + + + + +
    - - - __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ), - '!!user_login!!' => __( 'Username', 'paid-memberships-pro' ), - '!!sitename!!' => __( 'Site Title', 'paid-memberships-pro' ), - '!!siteemail!!' => __( 'Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)', 'paid-memberships-pro' ), - '!!membership_id!!' => __( 'Membership Level ID', 'paid-memberships-pro' ), - '!!membership_level_name!!' => __( 'Membership Level Name', 'paid-memberships-pro' ), - '!!membership_change!!' => __( 'Membership Level Change', 'paid-memberships-pro' ), - '!!membership_expiration!!' => __( 'Membership Level Expiration', 'paid-memberships-pro' ), - '!!startdate!!' => __( 'Membership Start Date', 'paid-memberships-pro' ), - '!!enddate!!' => __( 'Membership End Date', 'paid-memberships-pro' ), - '!!display_name!!' => __( 'Display Name (Profile/Edit User > Display name publicly as)', 'paid-memberships-pro' ), - '!!user_email!!' => __( 'User Email', 'paid-memberships-pro' ), - '!!login_url!!' => __( 'Login URL', 'paid-memberships-pro' ), - '!!levels_url!!' => __( 'Membership Levels Page URL', 'paid-memberships-pro' ), - ]; - - foreach ( $email_variables as $email_variable => $description ) { - ?> - - - - - - -
    -
    - - - __( 'Billing Info Complete Address', 'paid-memberships-pro' ), - '!!billing_name!!' => __( 'Billing Info Name', 'paid-memberships-pro' ), - '!!billing_street!!' => __( 'Billing Info Street Address', 'paid-memberships-pro' ), - '!!billing_city!!' => __( 'Billing Info City', 'paid-memberships-pro' ), - '!!billing_state!!' => __( 'Billing Info State', 'paid-memberships-pro' ), - '!!billing_zip!!' => __( 'Billing Info ZIP Code', 'paid-memberships-pro' ), - '!!billing_country!!' => __( 'Billing Info Country', 'paid-memberships-pro' ), - '!!billing_phone!!' => __( 'Billing Info Phone #', 'paid-memberships-pro' ), - '!!cardtype!!' => __( 'Credit Card Type', 'paid-memberships-pro' ), - '!!accountnumber!!' => __( 'Credit Card Number (last 4 digits)', 'paid-memberships-pro' ), - '!!expirationmonth!!' => __( 'Credit Card Expiration Month (mm format)', 'paid-memberships-pro' ), - '!!expirationyear!!' => __( 'Credit Card Expiration Year (yyyy format)', 'paid-memberships-pro' ), - '!!membership_cost!!' => __( 'Membership Level Cost Text', 'paid-memberships-pro' ), - '!!instructions!!' => __( 'Payment Instructions (used in Checkout - Email Template)', 'paid-memberships-pro' ), - '!!invoice_id!!' => __( 'Invoice ID', 'paid-memberships-pro' ), - '!!invoice_total!!' => __( 'Invoice Total', 'paid-memberships-pro' ), - '!!invoice_date!!' => __( 'Invoice Date', 'paid-memberships-pro' ), - '!!invoice_url!!' => __( 'Invoice Page URL', 'paid-memberships-pro' ), - '!!discount_code!!' => __( 'Discount Code Applied', 'paid-memberships-pro' ), - '!!membership_level_confirmation_message!!' => __( 'Custom Level Confirmation Message', 'paid-memberships-pro' ), - - ]; - - foreach ( $email_variables as $email_variable => $description ) { - ?> - - - - - - -
    -
    diff --git a/css/admin.css b/css/admin.css index b3319a1fe..8b9866c05 100644 --- a/css/admin.css +++ b/css/admin.css @@ -385,11 +385,9 @@ tr.pmpro_settings_divider td { } /* admin pages */ -.pmpro_admin_section-email-templates-content .pmpro-email-templates-variable-reference .form-table td { - padding: 5px; -} -.pmpro_admin_section-email-templates-content .pmpro-email-templates-variable-reference .form-table .widefat { - margin-bottom: 20px; +.pmpro_admin_section-email-templates-content .pmpro-email-templates-variable-reference table { + margin-bottom: 3em; + max-width: 900px; } /* messages */ From 4ba0275cbbf0c08a6fc6cdaf6d7b6c91293f6317 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 4 Apr 2022 15:15:51 -0400 Subject: [PATCH 093/145] Renewal label now linked to a search for that subscription ID --- adminpages/orders.php | 4 ++-- css/admin.css | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index cb688ac03..dbe81e46e 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -879,7 +879,7 @@ } else { ?> is_renewal() ) { ?> - +

    @@ -1620,7 +1620,7 @@ function pmpro_ShowMonthOrYear() { } ?> is_renewal() ) { ?> - + diff --git a/css/admin.css b/css/admin.css index cf07bc807..7820f2739 100644 --- a/css/admin.css +++ b/css/admin.css @@ -439,6 +439,10 @@ margin-top: 8px; text-align: center; } +a.pmpro_order-renewal { + color: initial; + text-decoration: none; +} .pmpro_order-renewal:before { content: "\f113"; font: normal 12px/1 dashicons; From 2b723bb83ad87e015ea0961e32b5fde07b749a8e Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 4 Apr 2022 15:16:39 -0400 Subject: [PATCH 094/145] Hyperlink same color as text --- css/admin.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/admin.css b/css/admin.css index 7820f2739..57f5d0052 100644 --- a/css/admin.css +++ b/css/admin.css @@ -440,7 +440,7 @@ text-align: center; } a.pmpro_order-renewal { - color: initial; + color: inherit; text-decoration: none; } .pmpro_order-renewal:before { From 09f52226ec28a1013e8b718f3acc2e9a17a0c9c0 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 4 Apr 2022 20:37:20 -0400 Subject: [PATCH 095/145] Various UI improvements to the admin area --- adminpages/advancedsettings.php | 3 +- adminpages/discountcodes.php | 66 +++++---- adminpages/emailsettings.php | 3 +- adminpages/emailtemplates.php | 4 +- adminpages/license.php | 1 + adminpages/membershiplevels.php | 9 +- adminpages/memberslist.php | 3 +- adminpages/orders.php | 213 +++++++++++++++-------------- adminpages/pagesettings.php | 3 +- adminpages/paymentsettings.php | 4 +- adminpages/reports.php | 7 +- adminpages/reports/login.php | 174 +++++++++++------------ adminpages/reports/memberships.php | 111 ++++++++------- adminpages/reports/sales.php | 1 + css/admin.css | 52 +++---- includes/functions.php | 4 +- 16 files changed, 333 insertions(+), 325 deletions(-) diff --git a/adminpages/advancedsettings.php b/adminpages/advancedsettings.php index 451c53626..c9c1a291a 100644 --- a/adminpages/advancedsettings.php +++ b/adminpages/advancedsettings.php @@ -130,9 +130,8 @@ - -


    +

    diff --git a/adminpages/discountcodes.php b/adminpages/discountcodes.php index 7c304cd8a..bc5dcabbe 100644 --- a/adminpages/discountcodes.php +++ b/adminpages/discountcodes.php @@ -732,11 +732,9 @@ - +

    -
    - pmpro_discount_codes "; if( ! empty( $s ) ) { @@ -764,10 +762,6 @@
    ">

    - -

    - - -
    +
    + +
    + +
    + +
    +
    -
    +
    - - - - - - + + + + + - @@ -804,9 +804,8 @@ $uses = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->pmpro_discount_codes_uses WHERE code_id = %d", $code->id ) ); ?> id ) ) { ?> class="pmpro_error"> - - - - - -
    +
    id?> - code?> + + code?>
    sprintf( + // translators: %s is the Order ID. + __( 'ID: %s', 'paid-memberships-pro' ), + esc_attr( $code->id ), + ), 'edit' => sprintf( '%3$s', esc_attr__( 'Edit', 'paid-memberships-pro' ), @@ -911,13 +915,13 @@ ?>
    + starts)?> + expires)?> + uses > 0) echo "" . (int)$uses . "/" . $code->uses; @@ -925,7 +929,7 @@ echo "" . (int)$uses . "/unlimited"; ?> + prepare(" SELECT l.id, l.name @@ -960,11 +964,17 @@ ?>
    - - +
    +
    + + + + +
    +
    diff --git a/adminpages/emailsettings.php b/adminpages/emailsettings.php index 9b4e57577..0f7d17dda 100644 --- a/adminpages/emailsettings.php +++ b/adminpages/emailsettings.php @@ -81,9 +81,8 @@
    - -


    +

    wordpress@yourdomain.com. You can update this from address using the fields below.', 'paid-memberships-pro' ) );?>

    diff --git a/adminpages/emailtemplates.php b/adminpages/emailtemplates.php index e69f324e1..349aeeec1 100644 --- a/adminpages/emailtemplates.php +++ b/adminpages/emailtemplates.php @@ -16,10 +16,8 @@ ?> - -


    - +

    diff --git a/adminpages/license.php b/adminpages/license.php index da1c19e74..4c905a785 100644 --- a/adminpages/license.php +++ b/adminpages/license.php @@ -29,6 +29,7 @@ if ( defined( 'PMPRO_DIR' ) ) { require_once( PMPRO_DIR . '/adminpages/admin_header.php' ); } ?> +

    diff --git a/adminpages/membershiplevels.php b/adminpages/membershiplevels.php index 716a26955..b0326d506 100644 --- a/adminpages/membershiplevels.php +++ b/adminpages/membershiplevels.php @@ -259,7 +259,7 @@ - +

    0) @@ -268,8 +268,6 @@ echo __("Add New Membership Level", 'paid-memberships-pro' ); ?>

    -
    -
    - +

    @@ -780,7 +778,6 @@ function update_level_order(event, ui) {
    -

    -
    - 1) { ?>

    diff --git a/adminpages/memberslist.php b/adminpages/memberslist.php index 44bce4dc5..b33d37a6f 100644 --- a/adminpages/memberslist.php +++ b/adminpages/memberslist.php @@ -17,10 +17,9 @@ // Render the List Table. ?> +

    -
    -
    diff --git a/adminpages/orders.php b/adminpages/orders.php index 0a26a3fff..6d7001cf2 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -1006,114 +1006,117 @@ ">

    + -
      -
    • - - +
      + + - + - + - - + + - + - + - - + + - + - - - - - + + + + - + - - + + + - + - pmpro_discount_codes "; - $sqlQuery .= "ORDER BY id DESC "; - $codes = $wpdb->get_results($sqlQuery, OBJECT); - if ( ! empty( $codes ) ) { ?> - + pmpro_discount_codes "; + $sqlQuery .= "ORDER BY id DESC "; + $codes = $wpdb->get_results($sqlQuery, OBJECT); + if ( ! empty( $codes ) ) { ?> + + - - + + - -
    • -
    + - - pmpro_membership_orders o LEFT JOIN $wpdb->users u ON o.user_id = u.ID LEFT JOIN $wpdb->pmpro_membership_levels l ON o.membership_id = l.id "; @@ -1321,10 +1317,15 @@ function pmpro_ShowMonthOrYear() { if ( $order_ids ) { ?> -

    +
    + +
    +
    +
    + @@ -1573,12 +1574,18 @@ class="alternate">
    - - +
    +
    + + + + +
    +
    " method="post" enctype="multipart/form-data"> - -


    +

    - +

    &

    -
    -

    ' . esc_html__( 'Payment Gateway Settings', 'paid-memberships-pro' ) . ''; $ssl_settings_link = '' . esc_html__( 'SSL', 'paid-memberships-pro' ) . ''; diff --git a/adminpages/reports.php b/adminpages/reports.php index 523034c51..165b0b9c7 100644 --- a/adminpages/reports.php +++ b/adminpages/reports.php @@ -8,14 +8,17 @@ /** * Load the Paid Memberships Pro dashboard-area header */ -require_once( dirname( __FILE__ ) . '/admin_header.php' ); +require_once( dirname( __FILE__ ) . '/admin_header.php' ); ?> +


    + + - +

    -

    -
      -
    • - -
    • -
    + - + + +
    + users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%') "; - - if($l == "all") - $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id > 0 "; - elseif($l) - $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' "; + if(isset($_REQUEST['limit'])) + $limit = intval($_REQUEST['limit']); + else + $limit = 15; + + $end = $pn * $limit; + $start = $end - $limit; + + if($s) + { + $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%') "; + + if($l == "all") + $sqlQuery .= " AND mu.status = 'active' AND mu.membership_id > 0 "; + elseif($l) + $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' "; + + $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit"; + } + else + { + $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id"; + $sqlQuery .= " WHERE 1=1 "; + + if($l == "all") + $sqlQuery .= " AND mu.membership_id > 0 AND mu.status = 'active' "; + elseif($l) + $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' "; + $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit"; + } + + $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery); - $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit"; - } - else - { - $sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(CONVERT_TZ(u.user_registered, '+00:00', @@global.time_zone)) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(CONVERT_TZ(mu.startdate, '+00:00', @@global.time_zone)) as startdate, UNIX_TIMESTAMP(CONVERT_TZ(mu.enddate, '+00:00', @@global.time_zone)) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id AND mu.status = 'active' LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id"; - $sqlQuery .= " WHERE 1=1 "; - - if($l == "all") - $sqlQuery .= " AND mu.membership_id > 0 AND mu.status = 'active' "; - elseif($l) - $sqlQuery .= " AND mu.membership_id = '" . esc_sql($l) . "' "; - $sqlQuery .= "GROUP BY u.ID ORDER BY user_registered DESC LIMIT $start, $limit"; - } + $theusers = $wpdb->get_results($sqlQuery); + $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows"); - $sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery); - - $theusers = $wpdb->get_results($sqlQuery); - $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows"); - - if($theusers) - { - ?> -

    found. - + if($theusers) + { + ?> + found. + +

    +
    +
    @@ -196,22 +196,22 @@ function pmpro_report_login_page() - + - - + ID); + //get meta + $theuser = get_userdata($auser->ID); $visits = pmpro_reports_get_values_for_user("visits", $auser->ID); $views = pmpro_reports_get_values_for_user("views", $auser->ID); $logins = pmpro_reports_get_values_for_user("logins", $auser->ID); - + if(empty($logins)) $logins = array("last"=>"N/A", "week"=>"N/A", "month"=>"N/A", "ytd"=>"N/A", "alltime"=>"N/A"); ?> @@ -224,17 +224,17 @@ function pmpro_report_login_page() $userlink = '' . $theuser->user_login . ''; $userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser); echo $userlink; - ?> + ?> - + - + @@ -267,7 +267,7 @@ function pmpro_report_login_page() + ?>
    display_name;?> membership?>membership?> user_registered ), current_time( 'timestamp' ) ) ); ?> - enddate) echo date_i18n(get_option('date_format'), $auser->enddate); else @@ -258,7 +258,7 @@ function pmpro_report_login_page()
    @@ -382,7 +382,7 @@ function pmpro_reports_get_all_values($type) { $allvalues['thismonth'] = $thismonth; $update = true; } - + if(!isset($allvalues['thisyear']) || $thisyear != $allvalues['thisyear']) { $allvalues['ytd'] = 0; @@ -451,7 +451,7 @@ function pmpro_report_track_values($type, $user_id = NULL) { $values['week'] = 1; $values['thisweek'] = $thisweek; } - + if($thismonth == $values['thismonth']) $values['month'] = $values['month'] + 1; else @@ -459,15 +459,15 @@ function pmpro_report_track_values($type, $user_id = NULL) { $values['month'] = 1; $values['thismonth'] = $thismonth; } - + if($thisyear == $values['thisyear']) $values['ytd'] = $values['ytd'] + 1; else { $values['ytd'] = 1; $values['thisyear'] = $thisyear; - } - + } + //update user data update_user_meta($user_id, "pmpro_" . $type, $values); } diff --git a/adminpages/reports/memberships.php b/adminpages/reports/memberships.php index f86e43e9a..f1fba6153 100644 --- a/adminpages/reports/memberships.php +++ b/adminpages/reports/memberships.php @@ -326,65 +326,64 @@ function pmpro_report_memberships_page()

    -
      -
    • - - - - - - - - + + + + + + + + + + - pmpro_discount_codes "; - $sqlQuery .= "ORDER BY id DESC "; - $codes = $wpdb->get_results($sqlQuery, OBJECT); - if ( ! empty( $codes ) ) { ?> - + + pmpro_discount_codes "; + $sqlQuery .= "ORDER BY id DESC "; + $codes = $wpdb->get_results($sqlQuery, OBJECT); + if ( ! empty( $codes ) ) { ?> + - - -
    • -
    + + + + + +
    +
    diff --git a/adminpages/reports/sales.php b/adminpages/reports/sales.php index 02134aa8a..11cc8af7a 100644 --- a/adminpages/reports/sales.php +++ b/adminpages/reports/sales.php @@ -358,6 +358,7 @@ function pmpro_report_sales_page() +
    diff --git a/css/admin.css b/css/admin.css index b3319a1fe..03cd4f195 100644 --- a/css/admin.css +++ b/css/admin.css @@ -487,37 +487,37 @@ tr.pmpro_alert { } /* pagination */ -div.pmpro_pagination { - padding: 3px; - margin: 5px 0px 5px 0px; - font-size: 10px; - float: right; -} -div.pmpro_pagination a { - padding: 2px 5px 2px 5px; - margin: 1px; - border: 1px solid #666; +.pmpro_pagination a, +.pmpro_pagination span.current, +.pmpro_pagination span.disabled { + display: inline-block; + vertical-align: baseline; + margin: 0 2px; + padding: 0 8px; + font-size: 14px; + line-height: 1.625; + text-align: center; + color: #2271b1; + border: 1px solid #2271b1; + background: #f6f7f7; text-decoration: none; - /* no underline */ color: #666; - background: #EEE; + border-radius: 3px; } -div.pmpro_pagination a:hover, div.pmpro_pagination a:active { - background: #FFF; +.pmpro_pagination a:hover, +.pmpro_pagination a:active { + background: #f0f0f1; + border-color: #0a4b78; + color: #0a4b78; } -div.pmpro_pagination span.current { - border: 1px solid #FFF; +.pmpro_pagination span.current { + background: #0a4b78; + border-color: #0a4b78; color: #FFF; - background: #666; - padding: 2px 5px 2px 5px; - margin: 1px; - font-weight: bold; } -div.pmpro_pagination span.disabled { - padding: 2px 5px 2px 5px; - margin: 2px; - border: 1px solid #BBB; - color: #BBB; - background: #EFEFEF; +.pmpro_pagination span.disabled { + background: #f6f7f7; + border-color: #dcdcde; + color: #a7aaad; } p.pmpro_meta_notice { diff --git a/includes/functions.php b/includes/functions.php index c7ab7c0fa..f5109da0d 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -1510,7 +1510,7 @@ function pmpro_getPaginationString( $page = 1, $totalitems = 0, $limit = 15, $ad */ $pagination = ''; if ( $lastpage > 1 ) { - $pagination .= '
    Date: Mon, 4 Apr 2022 20:48:18 -0400 Subject: [PATCH 096/145] Adjusting the RTL styles --- css/admin-rtl.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/css/admin-rtl.css b/css/admin-rtl.css index 6a8c2c893..4f3847a95 100644 --- a/css/admin-rtl.css +++ b/css/admin-rtl.css @@ -1,5 +1,5 @@ .pmpro_admin { - background: url(../images/Paid-Memberships-Pro_watermark.png) bottom left no-repeat !important; + background-position: bottom left; } .pmpro_admin .pmpro_banner h2 { @@ -29,7 +29,7 @@ /* discount levels */ /* pagination */ -div.pmpro_pagination { +.pmpro_pagination { float: left; } From 0095b524dc058fb8ac09d75aa912933a97e8abbe Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Tue, 5 Apr 2022 13:46:45 -0400 Subject: [PATCH 097/145] Adding a please rate us note on the footer; adjusting CSS to remove duplicate logo in footer --- adminpages/admin_footer.php | 19 +++++++++++++++++++ css/admin-rtl.css | 4 ---- css/admin.css | 4 ---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/adminpages/admin_footer.php b/adminpages/admin_footer.php index 841d6e63d..e5663ded2 100644 --- a/adminpages/admin_footer.php +++ b/adminpages/admin_footer.php @@ -1,2 +1,21 @@
    +Please rate us ★★★★★ on WordPress.org to help others find %2$s. Thank you from the %3$s team!

    ', 'paid-memberships-pro' ), + [ + 'a' => [ + 'href' => [], + 'target' => [], + 'rel' => [], + ], + 'p' => [], + ] + ), + 'https://wordpress.org/support/plugin/paid-memberships-pro/reviews/?filter=5#new-post', + 'Paid Memberships Pro', + 'PMPro', + ); +?>
    diff --git a/css/admin-rtl.css b/css/admin-rtl.css index 4f3847a95..b6912615e 100644 --- a/css/admin-rtl.css +++ b/css/admin-rtl.css @@ -1,7 +1,3 @@ -.pmpro_admin { - background-position: bottom left; -} - .pmpro_admin .pmpro_banner h2 { float: right; } diff --git a/css/admin.css b/css/admin.css index 03cd4f195..57d0ee4bc 100644 --- a/css/admin.css +++ b/css/admin.css @@ -17,10 +17,6 @@ /* header/etc */ .pmpro_admin { - background-image: url(../images/Paid-Memberships-Pro_watermark.png); - background-position: bottom right; - background-repeat: no-repeat; - background-size: 290px 40px; padding: 1em 0 70px 0; } .pmpro_admin .pmpro_banner { From 23be6ba80516ba55c315ebf019fa79529ae98545 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Fri, 8 Apr 2022 04:28:55 +1000 Subject: [PATCH 098/145] Deactivate deactivation form. --- classes/class-pmpro-wisdom-integration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index 83404b61a..8ba3cb334 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -112,7 +112,7 @@ public function setup_wisdom() { $this->plugin_option, ], true, - true, + false, 1 ); From 134c9aa1da55215ffe9976dc3b234d82f8637c79 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Fri, 8 Apr 2022 05:02:06 +1000 Subject: [PATCH 099/145] Avoiding warning when plugin files aren't present. --- classes/class-pmpro-wisdom-integration.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index 8ba3cb334..82f13747e 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -442,13 +442,14 @@ public function get_addons_info() { $addons_update_available = []; // Build array of Visible, Hidden, Active, Inactive, Installed, and Not Installed Add Ons. - foreach ( $addons as $addon ) { + foreach ( $addons as $addon ) { $plugin_file = $addon['Slug'] . '/' . $addon['Slug'] . '.php'; $plugin_file_abs = WP_PLUGIN_DIR . '/' . $plugin_file; - $plugin_data = get_plugin_data( $plugin_file_abs ); - - // Plugin is not on the site. - if ( empty( $plugin_data['Version'] ) ) { + + if ( file_exists( $plugin_file_abs ) ) { + $plugin_data = get_plugin_data( $plugin_file_abs ); + } else { + // Plugin is not on the site. continue; } From 7e95e00b609c9c3b8896ad4ce5ef84d9ec9a504a Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Fri, 8 Apr 2022 05:17:44 +1000 Subject: [PATCH 100/145] Activation hook needs to be outside of other hooks. --- includes/init.php | 17 ----------------- paid-memberships-pro.php | 5 +++++ 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/includes/init.php b/includes/init.php index 83b6e04ce..f3f9b77fd 100644 --- a/includes/init.php +++ b/includes/init.php @@ -219,20 +219,3 @@ function pmpro_sortable_column_query( $query ) { add_filter('manage_users_custom_column', 'pmpro_manage_users_custom_column', 10, 3); add_filter( 'manage_users_sortable_columns', 'pmpro_sortable_column' ); add_action('pre_user_query','pmpro_sortable_column_query'); - -/** - * Set up the Wisdom tracking. - * - * @since TBD - */ -function pmpro_wisdom_tracking() { - require_once PMPRO_DIR . '/classes/class-pmpro-wisdom-integration.php'; - - // Set up the instance. - $wisdom_integration = PMPro_Wisdom_Integration::instance(); - - // Set up Wisdom tracking. - $wisdom_integration->setup_wisdom(); -} - -add_action( 'plugins_loaded', 'pmpro_wisdom_tracking' ); diff --git a/paid-memberships-pro.php b/paid-memberships-pro.php index 8477452ef..7a115cf61 100644 --- a/paid-memberships-pro.php +++ b/paid-memberships-pro.php @@ -116,6 +116,11 @@ require_once( PMPRO_DIR . '/includes/lib/stripe-apple-pay/stripe-apple-pay.php' ); // rewrite rules to set up Apple Pay. } +// Set up Wisdom tracking. +require_once PMPRO_DIR . '/classes/class-pmpro-wisdom-integration.php'; +$wisdom_integration = PMPro_Wisdom_Integration::instance(); +$wisdom_integration->setup_wisdom(); + /* Setup the DB and check for upgrades */ From a70c49ba53e7f8e1b249fbfb913d90027a8d8a34 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Fri, 8 Apr 2022 23:33:31 +1000 Subject: [PATCH 101/145] Using a single setting for the pmpro_wisdom_opt_out setting. Making sure to set up cron when setting changed from advanced page. --- adminpages/advancedsettings.php | 37 +++++++--------------- classes/class-pmpro-wisdom-integration.php | 23 ++++---------- includes/updates/upgrade_1.php | 3 ++ includes/upgradecheck.php | 9 ++++++ 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/adminpages/advancedsettings.php b/adminpages/advancedsettings.php index 616605dfa..a76332001 100644 --- a/adminpages/advancedsettings.php +++ b/adminpages/advancedsettings.php @@ -12,21 +12,7 @@ $msg = -1; $msgt = __("Are you sure you want to do that? Try again.", 'paid-memberships-pro' ); unset($_REQUEST['savesettings']); - } - - // Handle full settings option. - $full_settings = pmpro_getOption( 'settings' ); - - $full_settings_defaults = [ - // Default to no tracking (this key is what Wisdom uses). - 'wisdom_opt_out' => 1, - ]; - - if ( ! $full_settings ) { - $full_settings = []; - } - - $full_settings = array_merge( $full_settings_defaults, $full_settings ); + } //get/set settings if(!empty($_REQUEST['savesettings'])) @@ -64,16 +50,16 @@ // Other settings. pmpro_setOption("hideads"); + pmpro_setOption("wisdom_opt_out"); pmpro_setOption("hideadslevels"); pmpro_setOption("redirecttosubscription"); - pmpro_setOption("uninstall"); - - // Handle updating Wisdom tracking setting. - if ( isset( $_POST['wisdom_opt_out'] ) ) { - $full_settings['wisdom_opt_out'] = (int) $_POST['wisdom_opt_out']; - } + pmpro_setOption("uninstall"); - update_option( 'pmpro_settings', $full_settings ); + // Set up Wisdom tracking cron if needed. + if ( (int)pmpro_getOption("wisdom_opt_out") === 0 ) { + $wisdom_integration = PMPro_Wisdom_Integration::instance(); + $wisdom_integration->wisdom_tracker->schedule_tracking(); + } /** * Filter to add custom settings to the advanced settings page. @@ -117,6 +103,7 @@ // Other settings. $hideads = pmpro_getOption("hideads"); + $wisdom_opt_out = (int)pmpro_getOption("wisdom_opt_out"); $hideadslevels = pmpro_getOption("hideadslevels"); if( is_multisite() ) { $redirecttosubscription = pmpro_getOption("redirecttosubscription"); @@ -514,14 +501,14 @@ class="large-text">

    -

    diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index 82f13747e..9002c20d6 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -34,7 +34,7 @@ class PMPro_Wisdom_Integration { * * @var string */ - public $plugin_option = 'pmpro_settings'; + public $plugin_option = 'pmpro_wisdom_opt_out'; /** * The plugin settings pages to include Wisdom notices on. @@ -129,17 +129,8 @@ public function setup_wisdom() { * @param array $value The new value of the option. */ public function sync_wisdom_setting_to_plugin( $old_value, $value ) { - $opt_out = ! empty( $value[ $this->plugin_slug ] ) ? 0 : 1; - - $settings = get_option( $this->plugin_option ); - - if ( empty( $settings ) ){ - $settings = []; - } - - $settings['wisdom_opt_out'] = $opt_out; - - update_option( $this->plugin_option, $settings ); + $opt_out = ! empty( $value[ $this->plugin_slug ] ) ? 0 : 1; + pmpro_setOption( $this->plugin_option, $opt_out ); } /** @@ -152,16 +143,16 @@ public function sync_wisdom_setting_to_plugin( $old_value, $value ) { */ public function sync_plugin_setting_to_wisdom( $old_value, $value ) { // Only handle opt in when needed. - if ( ! is_array( $value ) || ! isset( $value['wisdom_opt_out'] ) ) { + if ( ! isset( $value ) ) { return; } // Only update when changing the value. - if ( is_array( $old_value ) && isset( $old_value['wisdom_opt_out'] ) && (int) $old_value['wisdom_opt_out'] === (int) $value['wisdom_opt_out'] ) { + if ( isset( $old_value ) && (int) $old_value === (int) $value ) { return; } - $opt_out = filter_var( $value['wisdom_opt_out'], FILTER_VALIDATE_BOOLEAN ); + $opt_out = filter_var( $value, FILTER_VALIDATE_BOOLEAN ); // Update opt-in. $this->wisdom_tracker->set_is_tracking_allowed( ! $opt_out, $this->plugin_slug ); @@ -224,7 +215,7 @@ public function bypass_local_tracking( $is_local = false ) { * @return string */ public function override_notice() { - return __( 'Thank you for installing our plugin. We\'d like your permission to track its usage on your site. We won\'t record any sensitive data, only information regarding the WordPress environment and plugin settings. We will only use this information help us make improvements to the plugin and provide better support when you reach out. Tracking is completely optional.', 'paid-memberships-pro' ); + return __( 'Thank you for installing our plugin. We would like your permission to track its usage on your site. We will not record any sensitive data, only information regarding the WordPress environment and plugin settings. We will only use this information help us make improvements to the plugin and provide better support when you reach out. Tracking is completely optional.', 'paid-memberships-pro' ); } /** diff --git a/includes/updates/upgrade_1.php b/includes/updates/upgrade_1.php index 0338ac598..880631fff 100644 --- a/includes/updates/upgrade_1.php +++ b/includes/updates/upgrade_1.php @@ -50,6 +50,9 @@ function pmpro_upgrade_1() //let's pause the nag for the first week of use $pmpro_nag_paused = current_time('timestamp')+(3600*24*7); update_option('pmpro_nag_paused', $pmpro_nag_paused, 'no'); + + //wisdom tracking turned off by default + pmpro_setOption('wisdom_opt_out', 1); //db update pmpro_db_delta(); diff --git a/includes/upgradecheck.php b/includes/upgradecheck.php index 744fb0b10..063c9795f 100644 --- a/includes/upgradecheck.php +++ b/includes/upgradecheck.php @@ -277,6 +277,15 @@ function pmpro_checkForUpgrades() pmpro_db_delta(); pmpro_setOption( 'db_version', '2.71' ); } + + /** + * Version 2.8 + * Default option for Wisdom tracking. + */ + if ( $pmpro_db_version < 2.8 ) { + pmpro_setOption('wisdom_opt_out', 1); + pmpro_setOption( 'db_version', '2.8' ); + } } function pmpro_db_delta() From b4fc3471942ac7edb4994c8dc844cea6576f0b69 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Mon, 11 Apr 2022 13:01:48 -0400 Subject: [PATCH 102/145] Now tracking library conflicts and displaying in site health --- classes/class-pmpro-site-health.php | 38 ++++++++++++++++++- .../gateways/class.pmprogateway_braintree.php | 9 ++++- .../gateways/class.pmprogateway_stripe.php | 6 +++ .../class.pmprogateway_twocheckout.php | 11 +++++- includes/compatibility.php | 33 +++++++++++++++- 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/classes/class-pmpro-site-health.php b/classes/class-pmpro-site-health.php index fcf6cbe7c..c627e89ad 100644 --- a/classes/class-pmpro-site-health.php +++ b/classes/class-pmpro-site-health.php @@ -100,7 +100,11 @@ public function debug_information( $info ) { 'pmpro-pages' => [ 'label' => __( 'Membership Pages', 'paid-memberships-pro' ), 'value' => self::get_pmpro_pages(), - ] + ], + 'pmpro-library-conflicts' => [ + 'label' => __( 'Library Conflicts', 'paid-memberships-pro' ), + 'value' => self::get_library_conflicts(), + ], ], ]; @@ -472,6 +476,37 @@ public function get_htaccess_cache_usage() { return __( 'Off', 'paid-memberships-pro' ); } + /** + * Get library conflicts. + * + * @since TBD + * + * @return string|string[] The member page information + */ + function get_library_conflicts() { + // Get the current list of library conflicts. + $library_conflicts = get_option( 'pmpro_library_conflicts' ); + + // If there are no library conflicts, return a message. + if ( empty( $library_conflicts ) ) { + return __( 'No library conflicts detected.', 'paid-memberships-pro' ); + } + + // Format data to be displayed in site health. + $return_arr = array(); + + // Loop through all libraries that have conflicts. + foreach ( $library_conflicts as $library_name => $conflicting_plugins ) { + $conflict_strings = array(); + // Loop through all plugins that have conflicts with this library. + foreach ( $conflicting_plugins as $conflicting_plugin_path => $conflicting_plugin_data ) { + $conflict_strings[] = 'v' . $conflicting_plugin_data['version'] . ' (' . $conflicting_plugin_data['timestamp'] . ')' . ' - ' . $conflicting_plugin_path; + } + $return_arr[ $library_name ] = implode( ' | ', $conflict_strings ); + } + return $return_arr; + } + /** * Get the constants site health information. * @@ -544,5 +579,4 @@ public function get_constants() { return $constants_formatted; } - } diff --git a/classes/gateways/class.pmprogateway_braintree.php b/classes/gateways/class.pmprogateway_braintree.php index 3724e3049..cffd0bbd4 100644 --- a/classes/gateways/class.pmprogateway_braintree.php +++ b/classes/gateways/class.pmprogateway_braintree.php @@ -109,8 +109,15 @@ public static function dependencies() function loadBraintreeLibrary() { //load Braintree library if it hasn't been loaded already (usually by another plugin using Braintree) - if(!class_exists("\Braintree")) + if ( ! class_exists( "\Braintree" ) ) { require_once( PMPRO_DIR . "/includes/lib/Braintree/lib/Braintree.php"); + } else { + // Another plugin may have loaded the Braintree library already. + // Let's log the current Braintree Library info so that we know + // where to look if we need to troubleshoot library conflicts. + $previously_loaded_class = new \ReflectionClass( '\Braintree' ); + pmpro_track_library_conflict( 'braintree', $previously_loaded_class->getFileName(), Braintree\Version::get() ); + } } /** diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 6c3f7d554..9ff2f9a2f 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -78,6 +78,12 @@ public static function loadStripeLibrary() { //load Stripe library if it hasn't been loaded already (usually by another plugin using Stripe) if ( ! class_exists( "Stripe\Stripe" ) ) { require_once( PMPRO_DIR . "/includes/lib/Stripe/init.php" ); + } else { + // Another plugin may have loaded the Stripe library already. + // Let's log the current Stripe Library info so that we know + // where to look if we need to troubleshoot library conflicts. + $previously_loaded_class = new \ReflectionClass( 'Stripe\Stripe' ); + pmpro_track_library_conflict( 'stripe', $previously_loaded_class->getFileName(), Stripe\Stripe::VERSION ); } } diff --git a/classes/gateways/class.pmprogateway_twocheckout.php b/classes/gateways/class.pmprogateway_twocheckout.php index 10dfac579..99ddc3907 100644 --- a/classes/gateways/class.pmprogateway_twocheckout.php +++ b/classes/gateways/class.pmprogateway_twocheckout.php @@ -9,8 +9,15 @@ class PMProGateway_Twocheckout extends PMProGateway { function __construct($gateway = NULL) { - if(!class_exists("Twocheckout")) - require_once(dirname(__FILE__) . "/../../includes/lib/Twocheckout/Twocheckout.php"); + if ( ! class_exists( "Twocheckout" ) ) { + require_once( dirname(__FILE__) . "/../../includes/lib/Twocheckout/Twocheckout.php" ); + } else { + // Another plugin may have loaded the 2Checkout library already. + // Let's log the current 2Checkout Library info so that we know + // where to look if we need to troubleshoot library conflicts. + $previously_loaded_class = new \ReflectionClass( 'Twocheckout' ); + pmpro_track_library_conflict( 'twocheckout', $previously_loaded_class->getFileName(), Twocheckout::VERSION ); + } //set API connection vars Twocheckout::sellerId(pmpro_getOption('twocheckout_accountnumber')); diff --git a/includes/compatibility.php b/includes/compatibility.php index ba040a2ef..5da41bdbd 100644 --- a/includes/compatibility.php +++ b/includes/compatibility.php @@ -113,4 +113,35 @@ function pmpro_compatibility_checker_themes(){ } -add_action( 'after_setup_theme', 'pmpro_compatibility_checker_themes' ); \ No newline at end of file +add_action( 'after_setup_theme', 'pmpro_compatibility_checker_themes' ); + +/** + * Keep track of plugins that load libraries before PMPro loads its version. + * + * @param string $name The name of the library. + * @param string $path The path of the loaded library. + * @param string $version The version of the loaded library. + * + * @since TBD + */ +function pmpro_track_library_conflict( $name, $path, $version ) { + // Get the current list of library conflicts. + $library_conflicts = get_option( 'pmpro_library_conflicts', array() ); + + // Make sure we have an entry for this library. + if ( ! isset( $library_conflicts[ $name ] ) ) { + $library_conflicts[ $name ] = array(); + } + + // Make sure we have an entry for this path. + if ( ! isset( $library_conflicts[ $name ][ $path ] ) ) { + $library_conflicts[ $name ][ $path ] = array(); + } + + // Update the library conflict information. + $library_conflicts[ $name ][ $path ]['version'] = $version; + $library_conflicts[ $name ][ $path ]['timestamp'] = current_time( 'Y-m-d H:i:s' ); + + // Save changes. + update_option( 'pmpro_library_conflicts', $library_conflicts ); +} From c7c5167787f625dd8cd359a3b8f95c67e4487e61 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 12 Apr 2022 03:44:34 +1000 Subject: [PATCH 103/145] have expiration label link to the expirationmonth field --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index dbe81e46e..2a664cce4 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -778,7 +778,7 @@ - + / From 17d016157af661ad232398838dd63e6a3c36aa8c Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 12 Apr 2022 03:48:10 +1000 Subject: [PATCH 104/145] let's localize this string --- adminpages/orders.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 2a664cce4..eb2f4c5ea 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -784,7 +784,7 @@ value="expirationmonth ); ?>"/> / - MM/YYYY + From 00d36bfe869c0ba81bd4b234a09a4181b1a3708e Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 12 Apr 2022 04:04:20 +1000 Subject: [PATCH 105/145] Adding has_billing_address() method to use for the billing address toggle. --- adminpages/orders.php | 4 ++-- classes/class.memberorder.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index eb2f4c5ea..6c0ca1ed1 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -509,11 +509,11 @@

    - billing_street) ) { ?> + has_billing_address() ) { ?>

    - billing_street) ) { ?> style="display: none;"> +
    has_billing_address() ) { ?> style="display: none;"> diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index 9002c20d6..e62010fa4 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -215,7 +215,7 @@ public function bypass_local_tracking( $is_local = false ) { * @return string */ public function override_notice() { - return __( 'Thank you for installing our plugin. We would like your permission to track its usage on your site. We will not record any sensitive data, only information regarding the WordPress environment and plugin settings. We will only use this information help us make improvements to the plugin and provide better support when you reach out. Tracking is completely optional.', 'paid-memberships-pro' ); + return __( 'Share your usage data to help us improve Paid Memberships Pro. We use this data to analyze how our plugin is meeting your needs and identify new opportunities to help you create a thriving membership business. You can always visit the Advanced Settings and change this preference. Read more about what data we collect.' ); } /** diff --git a/classes/class-pmpro-wisdom-tracker.php b/classes/class-pmpro-wisdom-tracker.php index 85590c9fb..5443abae0 100644 --- a/classes/class-pmpro-wisdom-tracker.php +++ b/classes/class-pmpro-wisdom-tracker.php @@ -846,11 +846,11 @@ public function optin_notice() { $notice_text = apply_filters( 'wisdom_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?>
    -

    ' . esc_html( $plugin_name ) . ''; ?>

    -

    +

    '; ?>

    +

    - - + +

    Date: Tue, 19 Apr 2022 10:49:07 -0400 Subject: [PATCH 115/145] Fixing the incorrect border color for our in-admin messages; removing the footer watermark because we now doing the review message. --- css/admin.css | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/css/admin.css b/css/admin.css index 945b61a27..19436e82a 100644 --- a/css/admin.css +++ b/css/admin.css @@ -36,11 +36,7 @@ /* header/etc */ .pmpro_admin { - background-image: url(../images/Paid-Memberships-Pro_watermark.png); - background-position: bottom right; - background-repeat: no-repeat; - background-size: 290px 40px; - padding: 1em 0 70px 0; + padding: 1em 0 0 0; } .pmpro_banner { display: flex; @@ -488,16 +484,16 @@ tr.pmpro_settings_divider td { } .pmpro_admin .pmpro_success { background-color: #d4edda; - border-left-color: #0F441C; + border-left-color: #c3e6cb; } .pmpro_admin .pmpro_error, .pmpro_admin tr.pmpro_error td { background-color: #f8d7da; - border-left-color: #721c24; + border-left-color: #f5c6cb; } .pmpro_admin .pmpro_alert { background-color: #FFF8E0; - border-left-color: #6C5101; + border-left-color: #ffeeba; } .pmpro_admin .pmpro_success a { color: #0F441C; From 416360b1c884ea94d721066e606fa55153f59a2c Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Thu, 21 Apr 2022 12:13:50 -0400 Subject: [PATCH 116/145] Fixing table padding on the report widgets; Removing margin on the report details button --- css/admin.css | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/css/admin.css b/css/admin.css index 19436e82a..8940ea2ab 100644 --- a/css/admin.css +++ b/css/admin.css @@ -727,13 +727,9 @@ h2.nav-tab-wrapper { .memberships_page_pmpro-reports .pmpro_admin .nav-tab-wrapper { margin-bottom: 10px; } -.pmpro_reports-holder { } -.pmpro_reports-holder .postbox h2 { - border-bottom: 1px solid #eee; - font-size: 14px; - padding: 8px 12px; - margin: 0; - line-height: 1.4; +.pmpro_report-holder table.wp-list-table thead th, +.pmpro_report-holder table.wp-list-table tbody td { + padding: 8px 10px; } .pmpro_clickable { cursor: pointer; @@ -800,6 +796,7 @@ button.pmpro_report_th_closed:before { background-color: #f6f7f7; } .pmpro_report-holder .pmpro_report-button { + margin-bottom: 0; text-align: center; } .pmpro_chart_area { From b1d9dc4be6c4b3d190b8852bbb9cb9a3a07ee1c2 Mon Sep 17 00:00:00 2001 From: Jarryd Long Date: Mon, 25 Apr 2022 13:32:27 +0200 Subject: [PATCH 117/145] Duplicate Refund Processes --- .../gateways/class.pmprogateway_paypalexpress.php | 6 +++--- classes/gateways/class.pmprogateway_stripe.php | 13 +++++++------ services/ipnhandler.php | 9 +++++++-- services/stripe-webhook.php | 10 ++++++++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/classes/gateways/class.pmprogateway_paypalexpress.php b/classes/gateways/class.pmprogateway_paypalexpress.php index d8e7bc3f6..71946d66e 100644 --- a/classes/gateways/class.pmprogateway_paypalexpress.php +++ b/classes/gateways/class.pmprogateway_paypalexpress.php @@ -1125,7 +1125,7 @@ public static function process_refund( $success, $morder ){ global $current_user; // translators: %1$s is the Transaction ID. %2$s is the user display name that initiated the refund. - $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); + $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Admin: Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); $user = get_user_by( 'id', $morder->user_id ); //send an email to the member @@ -1134,13 +1134,13 @@ public static function process_refund( $success, $morder ){ //send an email to the admin $myemail = new PMProEmail(); - $myemail->sendRefundedAdminEmail( $current_user, $morder->membership_id ); + $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); } else { //The refund failed, so lets return the gateway message // translators: %1$s is the Transaction ID. %1$s is the Gateway Error - $morder->notes = trim( $morder->notes .' '. sprintf( __( 'There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s.', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ) ); + $morder->notes = trim( $morder->notes .' '. sprintf( __( 'Admin: There was a problem processing a refund for transaction ID %1$s. Gateway Error: %2$s.', 'paid-memberships-pro' ), $transaction_id, $httpParsedResponseAr['L_LONGMESSAGE0'] ) ); } $morder->SaveOrder(); diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index 213ce9b7f..241e3a6b5 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -3231,7 +3231,7 @@ public static function webhook_events() { 'invoice.payment_action_required', 'customer.subscription.deleted', 'charge.failed', - 'charge.refunded', + 'charge.refunded', ); if ( self::using_stripe_checkout() ) { @@ -4771,7 +4771,7 @@ public static function process_refund( $success, $order ) { global $current_user; - $order->notes = trim( $order->notes.' '.sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); + $order->notes = trim( $order->notes.' '.sprintf( __('Admin: Order successfully refunded on %1$s for transaction ID %2$s by %3$s.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $transaction_id, $current_user->display_name ) ); $user = get_user_by( 'id', $order->user_id ); //send an email to the member @@ -4780,16 +4780,17 @@ public static function process_refund( $success, $order ) { //send an email to the admin $myemail = new PMProEmail(); - $myemail->sendRefundedAdminEmail( $current_user, $order->membership_id ); + $myemail->sendRefundedAdminEmail( $user, $order->membership_id ); + } else { - $order->notes = trim( $order->notes . ' ' . __('An error occured while attempting to process this refund.', 'paid-memberships-pro' ) ); + $order->notes = trim( $order->notes . ' ' . __('Admin: An error occured while attempting to process this refund.', 'paid-memberships-pro' ) ); } } catch ( \Throwable $e ) { - $order->notes = trim( $order->notes . ' ' . __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() ); + $order->notes = trim( $order->notes . ' ' . __( 'Admin: There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() ); } catch ( \Exception $e ) { - $order->notes = trim( $order->notes . ' ' . __( 'There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() ); + $order->notes = trim( $order->notes . ' ' . __( 'Admin: There was a problem processing the refund', 'paid-memberships-pro' ) . ' ' . $e->getMessage() ); } $order->saveOrder(); diff --git a/services/ipnhandler.php b/services/ipnhandler.php index a2a86185b..cab66f529 100644 --- a/services/ipnhandler.php +++ b/services/ipnhandler.php @@ -419,12 +419,17 @@ $success = true; + if( $morder->status == 'refunded' ) { + //Refunded already, don't do this again + return true; + } + $morder->status = 'refunded'; // translators: %1$s is the date. %2$s is the transaction ID. - $morder->notes = trim( $morder->notes .' '. sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); + $morder->notes = trim( $morder->notes .' '. sprintf( __('IPN: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); - ipnlog( printf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); + ipnlog( printf( __('IPN: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); $user = get_user_by( 'email', $morder->Email ); diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index c76f371af..edb5e70eb 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -431,16 +431,21 @@ //We've got the right order if( !empty( $morder->id ) ) { + + if( $morder->status == 'refunded' ) { + //Refunded already, don't do this again + pmpro_stripeWebhookExit(); + } $morder->status = 'refunded'; // translators: %1$s is the date of the refund. %2$s is the transaction ID. - $logstr .= sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); + $logstr .= sprintf( __('Webhook: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); //Add to order notes. // translators: %1$s is the date of the refund. %2$s is the transaction ID. - $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); + $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Webhook: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); $morder->SaveOrder(); @@ -455,6 +460,7 @@ $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); pmpro_stripeWebhookExit(); + } } else { From 7e4eba22a40021a8ae83a260520c0924c04959ec Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 25 Apr 2022 09:39:41 -0400 Subject: [PATCH 118/145] Adding rotate icon to refund button; adding icons to other buttons on all order view --- adminpages/orders.php | 6 +++--- css/admin.css | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 6ad9b5dc6..2aeb5b786 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -441,7 +441,7 @@ %3$s', + '%3$s', esc_attr__( 'Refund', 'paid-memberships-pro' ), esc_js( 'javascript:pmpro_askfirst(' . wp_json_encode( $refund_text ) . ', ' . wp_json_encode( $refund_nonce_url ) . '); void(0);' ), esc_html__( 'Refund', 'paid-memberships-pro' ) @@ -1051,7 +1051,7 @@

    - + - +
    diff --git a/css/admin.css b/css/admin.css index 8940ea2ab..e6984ae9b 100644 --- a/css/admin.css +++ b/css/admin.css @@ -33,6 +33,17 @@ .pmpro_admin .pmpro-has-icon-admin-users:before { content: "\f110"; } +.pmpro_admin .pmpro-has-icon-image-rotate:before { + content: "\f531"; +} +.pmpro_admin .pmpro-has-icon-download:before { + content: "\f316"; + top: 0; +} +.pmpro_admin .pmpro-has-icon-plus:before { + content: "\f132"; + top: 0; +} /* header/etc */ .pmpro_admin { From 83692024c4609abb4678e6cba9b5a4cb3bdc9379 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 25 Apr 2022 09:45:20 -0400 Subject: [PATCH 119/145] Helping admin orders screen appearance (column for transaction IDs now allows word breaks) --- css/admin.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/css/admin.css b/css/admin.css index e6984ae9b..a9b782c8a 100644 --- a/css/admin.css +++ b/css/admin.css @@ -411,7 +411,8 @@ margin-bottom: 10px; } .pmpro_admin .wp-list-table .column-username, -.pmpro_admin .wp-list-table .column-billing { +.pmpro_admin .wp-list-table .column-billing, +.pmpro_admin .wp-list-table .column-transaction-ids { word-break: break-word; } .pmpro_order-status { From b93def080f5490530017f9c4efe40867c179fe82 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Mon, 25 Apr 2022 11:27:51 -0400 Subject: [PATCH 120/145] Updating the refund askfirst message --- adminpages/orders.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adminpages/orders.php b/adminpages/orders.php index 2aeb5b786..7403fb63f 100644 --- a/adminpages/orders.php +++ b/adminpages/orders.php @@ -415,7 +415,7 @@ $refund_text = esc_html( sprintf( // translators: %s is the Order Code. - __( 'Refunding an order is permanent and can affect active users. Are you sure you want to refund order %s?', 'paid-memberships-pro' ), + __( 'Refund order %s at the payment gateway. This action is permanent. The user and admin will receive an email confirmation after the refund is processed. Are you sure you want to refund this order?', 'paid-memberships-pro' ), str_replace( "'", '', $order->code ) ) ); @@ -1474,7 +1474,7 @@ function pmpro_ShowMonthOrYear() { $refund_text = esc_html( sprintf( // translators: %s is the Order Code. - __( 'Refunding orders is permanent and can affect active users. Are you sure you want to refund order %s?', 'paid-memberships-pro' ), + __( 'Refund order %s at the payment gateway. This action is permanent. The user and admin will receive an email confirmation after the refund is processed. Are you sure you want to refund this order?', 'paid-memberships-pro' ), str_replace( "'", '', $order->code ) ) ); From e2372943d4a5adec2de0c797ad1264e8cd47dc24 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 26 Apr 2022 02:02:59 +1000 Subject: [PATCH 121/145] some tabbing --- services/stripe-webhook.php | 41 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index edb5e70eb..690dd87d6 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -231,26 +231,26 @@ if( ! empty( $old_order ) && ! empty( $old_order->id ) ) { $user_id = $old_order->user_id; $user = get_userdata($user_id); - $invoice = $pmpro_stripe_event->data->object; + $invoice = $pmpro_stripe_event->data->object; // Prep order for emails. $morder = new MemberOrder(); $morder->user_id = $user_id; // Update payment method and billing address on order. - $payment_intent_args = array( - 'id' => $invoice->payment_intent, - 'expand' => array( - 'payment_method', - ), - ); - $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); - $payment_method = $payment_intent->charges->data[0]->payment_method_details; - if ( empty( $payment_method ) ) { - $logstr .= "Could not find payment method for invoice " . $invoice->id; - pmpro_stripeWebhookExit(); - } - pmpro_stripe_webhook_populate_order_from_payment( $morder, $payment_method ); + $payment_intent_args = array( + 'id' => $invoice->payment_intent, + 'expand' => array( + 'payment_method', + ), + ); + $payment_intent = \Stripe\PaymentIntent::retrieve( $payment_intent_args ); + $payment_method = $payment_intent->charges->data[0]->payment_method_details; + if ( empty( $payment_method ) ) { + $logstr .= "Could not find payment method for invoice " . $invoice->id; + pmpro_stripeWebhookExit(); + } + pmpro_stripe_webhook_populate_order_from_payment( $morder, $payment_method ); // Add invoice link to the order. $morder->invoice_url = $pmpro_stripe_event->data->object->hosted_invoice_url; @@ -421,13 +421,13 @@ $morder = new MemberOrder(); - $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); - // Initial payment orders are stored using the invoice ID, so check that value too. - if ( empty( $morder->id ) && ! empty( $pmpro_stripe_event->data->object->invoice ) ) { - $payment_transaction_id = $pmpro_stripe_event->data->object->invoice; - $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); - } + // Initial payment orders are stored using the invoice ID, so check that value too. + if ( empty( $morder->id ) && ! empty( $pmpro_stripe_event->data->object->invoice ) ) { + $payment_transaction_id = $pmpro_stripe_event->data->object->invoice; + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + } //We've got the right order if( !empty( $morder->id ) ) { @@ -471,7 +471,6 @@ pmpro_stripeWebhookExit(); } - } elseif($pmpro_stripe_event->type == "checkout.session.completed") { From b48ed034b46d30696c0573605a14d5e960d5e0c5 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 26 Apr 2022 02:49:15 +1000 Subject: [PATCH 122/145] we're not translating webhook language yet. fixing tabs and curly braces. --- services/ipnhandler.php | 4 ++-- services/stripe-webhook.php | 37 +++++++++---------------------------- 2 files changed, 11 insertions(+), 30 deletions(-) diff --git a/services/ipnhandler.php b/services/ipnhandler.php index cab66f529..ada916692 100644 --- a/services/ipnhandler.php +++ b/services/ipnhandler.php @@ -427,9 +427,9 @@ $morder->status = 'refunded'; // translators: %1$s is the date. %2$s is the transaction ID. - $morder->notes = trim( $morder->notes .' '. sprintf( __('IPN: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); + $morder->notes = trim( $morder->notes .' '. sprintf( 'IPN: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); - ipnlog( printf( __('IPN: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); + ipnlog( sprintf( 'IPN: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); $user = get_user_by( 'email', $morder->Email ); diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 690dd87d6..1045d4091 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -404,23 +404,9 @@ } } elseif( $pmpro_stripe_event->type == "charge.refunded" ) - { - /** - * Stripe's charge.refunded takes a while to come through. - * - * When requesting a refund, you'll have a payment_intent.succeeded first, - * and then the charge.refunded will come through later. - */ - - /** - * ch_ prefixed. Using this in case someone tries to resend a webhook, then we get this ID - * instead of an event ID - */ + { $payment_transaction_id = $pmpro_stripe_event->data->object->id; - $morder = new MemberOrder(); - - $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); // Initial payment orders are stored using the invoice ID, so check that value too. @@ -430,22 +416,22 @@ } //We've got the right order - if( !empty( $morder->id ) ) { + if( !empty( $morder->id ) ) { if( $morder->status == 'refunded' ) { //Refunded already, don't do this again + $logstr .= sprintf( 'Webhook: Order ID %1$s with transaction ID %2$s was already in refund status.', $morder->id, $payment_transaction_id ); pmpro_stripeWebhookExit(); } $morder->status = 'refunded'; - // translators: %1$s is the date of the refund. %2$s is the transaction ID. - - $logstr .= sprintf( __('Webhook: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); + // translators: %1$s is the date of the refund. %2$s is the transaction ID. + $logstr .= sprintf( 'Webhook: Order ID %1$s successfully refunded on %2$s for transaction ID %3$s at the gateway.', $morder->id, date_i18n('Y-m-d H:i:s'), $payment_transaction_id ); //Add to order notes. // translators: %1$s is the date of the refund. %2$s is the transaction ID. - $morder->notes = trim( $morder->notes . ' ' . sprintf( __('Webhook: Order successfully refunded on %1$s for transaction ID %2$s at the gateway.', 'paid-memberships-pro' ), date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); + $morder->notes = trim( $morder->notes . ' ' . sprintf( 'Webhook: Order ID %1$s successfully refunded on %2$s for transaction ID %3$s at the gateway.', $morder->id, date_i18n('Y-m-d H:i:s'), $payment_transaction_id ) ); $morder->SaveOrder(); @@ -460,16 +446,11 @@ $myemail->sendRefundedAdminEmail( $user, $morder->membership_id ); pmpro_stripeWebhookExit(); - } - } else { + //We can't find that order + $logstr .= sprintf( 'Webhook: Transaction ID %1$s was refunded at the gateway on %2$s, but we could not find a matching order.', $payment_transaction_id, date_i18n('Y-m-d H:i:s') ); - //We can't find that order - - $logstr .= sprintf( __('%1$s - Failed to update transaction ID %2$s after it was refunded at the gateway.', 'paid-memberships-pro' ), $payment_transaction_id, date_i18n('Y-m-d H:i:s') ); - - pmpro_stripeWebhookExit(); - + pmpro_stripeWebhookExit(); } } elseif($pmpro_stripe_event->type == "checkout.session.completed") From 14e410e462454d311a6e5115d3f382ddf1854f1e Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 26 Apr 2022 05:23:29 +1000 Subject: [PATCH 123/145] just save the slug and versions of plugins that need updates --- classes/class-pmpro-wisdom-integration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index e62010fa4..c5ed86c96 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -453,7 +453,7 @@ public function get_addons_info() { // Build array of Add Ons that have an update available. if ( isset( $plugin_info->response[ $plugin_file ] ) ) { - $addons_update_available[] = $addon; + $addons_update_available[ $addon['Slug'] ] = $plugin_data['Version']; } } From 9ce71e3c2815ba6365442736fc45efb1ffee5951 Mon Sep 17 00:00:00 2001 From: dparker1005 Date: Tue, 26 Apr 2022 10:10:39 -0400 Subject: [PATCH 124/145] Now combining intial and recurring payments for Stripe Checkout --- .../gateways/class.pmprogateway_stripe.php | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index ff8085478..556de0da0 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -1646,9 +1646,23 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) 'price' => $recurring_payment_price->id, 'quantity' => 1, ); - $subscription_data = array( - 'trial_period_days' => $stripe->calculate_trial_period_days( $morder ), - ); + $subscription_data = array(); + + // Check if we can combine initial and recurring payments. + $filtered_trial_period_days = $stripe->calculate_trial_period_days( $morder ); + if ( + empty( $order->TrialBillingCycles ) && // Check if there is a trial period. + $filtered_trial_period_days === $stripe->calculate_trial_period_days( $morder, false ) && // Check if the trial period is the same as the filtered trial period. + ( ! empty( $initial_payment_amount ) && $initial_payment_amount === $recurring_payment_amount ) // Check if the initial payment and recurring payment prices are the same. + ) { + // We can combine the initial payment and the recurring payment. + array_shift( $line_items ); + $payment_intent_data = null; + } else { + // We need to set the trial period days and send initial and recurring payments as separate line items. + $subscription_data['trial_period_days'] = $filtered_trial_period_days; + } + // Add application fee for Stripe Connect. $application_fee_percentage = self::get_application_fee_percentage(); if ( ! empty( $application_fee_percentage ) ) { @@ -1673,7 +1687,7 @@ static function pmpro_checkout_before_change_membership_level($user_id, $morder) $checkout_session_params = array( 'customer' => $customer->id, 'line_items' => $line_items, - 'mode' => empty( $subscription_data ) ? 'payment' : 'subscription', + 'mode' => isset( $subscription_data ) ? 'subscription' : 'payment', 'automatic_tax' => $automatic_tax, 'tax_id_collection' => $tax_id_collection, 'billing_address_collection' => $billing_address_collection, @@ -2794,9 +2808,10 @@ private function get_price_for_product( $product_id, $amount, $cycle_period = nu * @since 2.7.0. * * @param MemberOrder $order to calculate trial period days for. + * @param bool $filtered whether to filter the result. * @return int trial period days. */ - private function calculate_trial_period_days( $order ) { + private function calculate_trial_period_days( $order, $filtered = true ) { // Use a trial period to set the first recurring payment date. if ( $order->BillingPeriod == "Year" ) { $trial_period_days = $order->BillingFrequency * 365; //annual @@ -2817,7 +2832,9 @@ private function calculate_trial_period_days( $order ) { $order->ProfileStartDate = date_i18n( "Y-m-d\TH:i:s", strtotime( "+ " . $trial_period_days . " Day", current_time( "timestamp" ) ) ); //filter the start date - $order->ProfileStartDate = apply_filters( "pmpro_profile_start_date", $order->ProfileStartDate, $order ); + if ( $filtered ) { + $order->ProfileStartDate = apply_filters( "pmpro_profile_start_date", $order->ProfileStartDate, $order ); + } //convert back to days $trial_period_days = ceil( abs( strtotime( date_i18n( "Y-m-d\TH:i:s" ), current_time( "timestamp" ) ) - strtotime( $order->ProfileStartDate, current_time( "timestamp" ) ) ) / 86400 ); From f6fa7b492a9e7689ed63dc5de621ef17c286960c Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Tue, 3 May 2022 16:56:31 -0400 Subject: [PATCH 125/145] Setting font color on admin messages for accessibility --- css/admin.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/css/admin.css b/css/admin.css index a9b782c8a..497dfb80b 100644 --- a/css/admin.css +++ b/css/admin.css @@ -491,6 +491,7 @@ tr.pmpro_settings_divider td { .pmpro_admin .pmpro_message { background: #FFF; border-left: 4px solid #FFF; + color: #3c434a; margin-right: 15px; padding: 15px; } @@ -711,6 +712,9 @@ p.pmpro_meta_notice { .memberships_page_pmpro-license .pmpro_icon { margin-top: 20px; } +.memberships_page_pmpro-license .about-wrap .about-text { + color: #3c434a; +} /* misc */ .pmpro_lite { From 9a46291e2b8b9fc2493c953824343ae75cb87433 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Wed, 4 May 2022 07:50:58 +1000 Subject: [PATCH 126/145] fixed i18n and added nofollow and noopener rels to link. --- classes/class-pmpro-wisdom-integration.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/class-pmpro-wisdom-integration.php b/classes/class-pmpro-wisdom-integration.php index c5ed86c96..d4ce97309 100644 --- a/classes/class-pmpro-wisdom-integration.php +++ b/classes/class-pmpro-wisdom-integration.php @@ -215,7 +215,9 @@ public function bypass_local_tracking( $is_local = false ) { * @return string */ public function override_notice() { - return __( 'Share your usage data to help us improve Paid Memberships Pro. We use this data to analyze how our plugin is meeting your needs and identify new opportunities to help you create a thriving membership business. You can always visit the Advanced Settings and change this preference. Read more about what data we collect.' ); + $message = esc_html__( 'Share your usage data to help us improve Paid Memberships Pro. We use this data to analyze how our plugin is meeting your needs and identify new opportunities to help you create a thriving membership business. You can always visit the Advanced Settings and change this preference.', 'paid-memberships-pro' ); + $link = '' . esc_html__( 'Read more about what data we collect.', 'paid-memberships-pro' ) . ''; + return $message . ' ' . $link; } /** From b37b0331355d26514b27cc483b4fb11b61c84427 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Wed, 4 May 2022 08:10:08 +1000 Subject: [PATCH 127/145] Adding nofollow and noopener to some links --- adminpages/advancedsettings.php | 4 ++-- adminpages/discountcodes.php | 7 ++++--- adminpages/emailsettings.php | 5 +++-- adminpages/membershiplevels.php | 13 ++++++++----- adminpages/paymentsettings.php | 8 ++++---- 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/adminpages/advancedsettings.php b/adminpages/advancedsettings.php index a6c238251..4bfc619d6 100644 --- a/adminpages/advancedsettings.php +++ b/adminpages/advancedsettings.php @@ -268,7 +268,7 @@ -

    .

    +

    .

    @@ -513,7 +513,7 @@ class="large-text">

    - . + .

    diff --git a/adminpages/discountcodes.php b/adminpages/discountcodes.php index bc5dcabbe..3070ebf3d 100644 --- a/adminpages/discountcodes.php +++ b/adminpages/discountcodes.php @@ -357,7 +357,7 @@ } if( ! empty( $pmpro_msg ) && ! empty( $expiration_warning_flag ) ) { - $pmpro_msg .= ' ' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, see our post here.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-discountcodes&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . ''; + $pmpro_msg .= ' ' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, see our post here.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-discountcodes&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . ''; if( $pmpro_msgt == 'success' ) { $pmpro_msgt = 'warning'; @@ -640,9 +640,10 @@ 'href' => array(), 'target' => array(), 'title' => array(), + 'rel' => array(), ), ); - echo '
    ' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the Stripe Billing Limits Add On.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . ''; + echo '
    ' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the Stripe Billing Limits Add On.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . ''; } ?>

    @@ -754,7 +755,7 @@

    - + diff --git a/adminpages/emailsettings.php b/adminpages/emailsettings.php index 0f7d17dda..ddce1a919 100644 --- a/adminpages/emailsettings.php +++ b/adminpages/emailsettings.php @@ -126,10 +126,11 @@ 'href' => array(), 'target' => array(), 'title' => array(), + 'rel' => array(), ), 'em' => array(), ); - echo sprintf( wp_kses( __( 'If you are having issues with email delivery from your server, please read our email troubleshooting guide. As an alternative, Paid Memberships Pro offers built-in integration for SendWP. Optional: SendWP is a third-party service for transactional email in WordPress. Click here to learn more about SendWP and Paid Memberships Pro.', 'paid-memberships-pro' ), $allowed_email_troubleshooting_html ), 'https://www.paidmembershipspro.com/troubleshooting-email-issues-sending-sent-spam-delivery-delays/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=blog&utm_content=email-troubleshooting', 'https://www.paidmembershipspro.com/documentation/member-communications/email-delivery-sendwp/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=documentation&utm_content=sendwp' ); + echo sprintf( wp_kses( __( 'If you are having issues with email delivery from your server, please read our email troubleshooting guide. As an alternative, Paid Memberships Pro offers built-in integration for SendWP. Optional: SendWP is a third-party service for transactional email in WordPress. Click here to learn more about SendWP and Paid Memberships Pro.', 'paid-memberships-pro' ), $allowed_email_troubleshooting_html ), 'https://www.paidmembershipspro.com/troubleshooting-email-issues-sending-sent-spam-delivery-delays/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=blog&utm_content=email-troubleshooting', 'https://www.paidmembershipspro.com/documentation/member-communications/email-delivery-sendwp/?utm_source=plugin&utm_medium=pmpro-emailsettings&utm_campaign=documentation&utm_content=sendwp' ); ?>

    " . __( 'View Your SendWP Account', 'paid-memberships-pro' ) . ""; + $connected = __( 'Your site is connected to SendWP.', 'paid-memberships-pro' ) . " " . __( 'View Your SendWP Account', 'paid-memberships-pro' ) . ""; $disconnected = ' ' . sprintf( __( 'Please enable email sending inside %s.', 'paid-memberships-pro' ), 'SendWP Settings' ); ?>

    diff --git a/adminpages/membershiplevels.php b/adminpages/membershiplevels.php index b0326d506..035632a6e 100644 --- a/adminpages/membershiplevels.php +++ b/adminpages/membershiplevels.php @@ -166,7 +166,7 @@ } if( ! empty( $msgt ) && $ml_recurring && $ml_expiration ) { - $msgt .= ' ' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, see our post here.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . ''; + $msgt .= ' ' . sprintf( __( 'WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, see our post here.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=blog&utm_content=important-notes-on-recurring-billing-and-expiration-dates-for-membership-levels' ) . ''; // turn success to errors if( $msg > 0 ) { @@ -473,9 +473,10 @@ 'href' => array(), 'target' => array(), 'title' => array(), + 'rel' => array(), ), ); - echo '
    ' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the Stripe Billing Limits Add On.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . ''; + echo '
    ' . sprintf( wp_kses( __( 'Optional: Allow billing limits with Stripe using the Stripe Billing Limits Add On.', 'paid-memberships-pro' ), $allowed_sbl_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-stripe-billing-limits/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=stripe-billing-limits' ) . ''; } ?>

    @@ -499,9 +500,10 @@ 'href' => array(), 'target' => array(), 'title' => array(), + 'rel' => array(), ), ); - echo ''; + echo ''; } ?> > @@ -564,9 +566,10 @@ 'href' => array(), 'target' => array(), 'title' => array(), + 'rel' => array(), ), ); - echo ''; + echo ''; } ?> style="display: none;"> @@ -584,7 +587,7 @@

    diff --git a/classes/class.memberorder.php b/classes/class.memberorder.php index fb4901c03..3ae807b81 100644 --- a/classes/class.memberorder.php +++ b/classes/class.memberorder.php @@ -1184,4 +1184,35 @@ function get_test_order() { return apply_filters( 'pmpro_test_order_data', $this ); } + + /** + * Does this order have any billing address fields set? + * @since 2.8 + * @return bool True if ANY billing address field is non-empty. + * False if ALL billing address fields are empty. + */ + function has_billing_address() { + // This is sometimes set. + if ( ! empty( $this->Address1 ) ) { + return true; + } + + // Avoid a warning if no billing object at all. + if ( empty( $this->billing ) ) { + return false; + } + + // Check billing fields. + if ( ! empty( $this->billing->name ) + || ! empty( $this->billing->street ) + || ! empty( $this->billing->city ) + || ! empty( $this->billing->state ) + || ! empty( $this->billing->country ) + || ! empty( $this->billing->zip ) + || ! empty( $this->billing->phone ) ) { + return true; + } + + return false; + } } // End of Class \ No newline at end of file From 08490d7bd424d6c052c4f9e4c996a12b906d86ad Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Thu, 14 Apr 2022 00:39:12 +1000 Subject: [PATCH 106/145] Now also checking for an order by invoice id when processing a refund. Also removed that debug code again. --- services/stripe-webhook.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/stripe-webhook.php b/services/stripe-webhook.php index 14144fba4..da280b5ba 100644 --- a/services/stripe-webhook.php +++ b/services/stripe-webhook.php @@ -82,8 +82,6 @@ } global $wpdb; - error_log( print_r( $pmpro_stripe_event, true ) ); - error_log($pmpro_stripe_event->type); //real event? if(!empty($pmpro_stripe_event->id)) { @@ -440,7 +438,13 @@ $morder = new MemberOrder(); - $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + + // Initial payment orders are stored using the invoice ID, so check that value too. + if ( empty( $morder->id ) && ! empty( $pmpro_stripe_event->data->object->invoice ) ) { + $payment_transaction_id = $pmpro_stripe_event->data->object->invoice; + $morder->getMemberOrderByPaymentTransactionID( $payment_transaction_id ); + } //We've got the right order if( !empty( $morder->id ) ) { From 6749c608dce7bcf9c8b804fb72d30480b62b70dd Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Thu, 14 Apr 2022 01:02:08 +1000 Subject: [PATCH 107/145] let's not rename this function --- .../gateways/class.pmprogateway_stripe.php | 2 +- includes/crons.php | 4 ++-- includes/functions.php | 20 ------------------- includes/license.php | 2 +- includes/updates/upgrade_1_8_7.php | 6 +++--- includes/updates/upgrade_2_6.php | 2 +- includes/upgradecheck.php | 4 ++-- paid-memberships-pro.php | 8 ++++---- 8 files changed, 14 insertions(+), 34 deletions(-) diff --git a/classes/gateways/class.pmprogateway_stripe.php b/classes/gateways/class.pmprogateway_stripe.php index e94299cff..1c977f87e 100644 --- a/classes/gateways/class.pmprogateway_stripe.php +++ b/classes/gateways/class.pmprogateway_stripe.php @@ -943,7 +943,7 @@ static function user_profile_fields_save( $user_id ) { * @since 1.8 */ public static function pmpro_activation() { - pmpro_maybe_schedule_cron( time(), 'daily', 'pmpro_cron_stripe_subscription_updates' ); + pmpro_maybe_schedule_event( time(), 'daily', 'pmpro_cron_stripe_subscription_updates' ); } /** diff --git a/includes/crons.php b/includes/crons.php index a9fa73e04..aabbf8105 100644 --- a/includes/crons.php +++ b/includes/crons.php @@ -71,7 +71,7 @@ function pmpro_maybe_schedule_crons() { $crons = pmpro_get_crons(); foreach ( $crons as $hook => $cron ) { - pmpro_maybe_schedule_cron( $cron['timestamp'], $cron['recurrence'], $hook, $cron['args'] ); + pmpro_maybe_schedule_event( $cron['timestamp'], $cron['recurrence'], $hook, $cron['args'] ); } } @@ -113,7 +113,7 @@ function pmpro_handle_schedule_crons_on_cron_ready_check( $pre ) { * * @return bool|WP_Error True when an event is scheduled, WP_Error on failure, and false if the event was already scheduled. */ -function pmpro_maybe_schedule_cron( $timestamp, $recurrence, $hook, $args = [] ) { +function pmpro_maybe_schedule_event( $timestamp, $recurrence, $hook, $args = [] ) { $next = wp_next_scheduled( $hook, $args ); if ( empty( $next ) ) { diff --git a/includes/functions.php b/includes/functions.php index a97fd0392..2b63aa92b 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3437,26 +3437,6 @@ function pmpro_generatePages( $pages ) { return $pages_created; } -/** - * Schedule a periodic event unless one with the same hook is already scheduled. - * - * @param int $timestamp Timestamp for when to run the event. - * @param string $recurrence How often the event should recur. - * @param string $hook Action hook to execute when cron is run. - * @param array $args Optional. Arguments to pass to the hook's callback function. - * @return false|void False when an event is not scheduled. - * @since 1.8.7.3 - * - * @deprecated TBD Use pmpro_maybe_schedule_cron() going forward. - */ -function pmpro_maybe_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) { - $next = wp_next_scheduled( $hook, $args ); - if ( empty( $next ) ) { - return wp_schedule_event( $timestamp, $recurrence, $hook, $args ); - } else { - return false; - } -} /** * Get an array of orders for a specific checkout ID * diff --git a/includes/license.php b/includes/license.php index 497dd4139..23e3f97d0 100644 --- a/includes/license.php +++ b/includes/license.php @@ -87,7 +87,7 @@ function pmpro_license_isValid($key = NULL, $type = NULL, $force = false) { */ //activation function pmpro_license_activation() { - pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'monthly', 'pmpro_license_check_key' ); + pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'monthly', 'pmpro_license_check_key' ); } add_action( 'activate_paid-memberships-pro', 'pmpro_license_activation' ); diff --git a/includes/updates/upgrade_1_8_7.php b/includes/updates/upgrade_1_8_7.php index 6fbc4ce64..993e71eda 100644 --- a/includes/updates/upgrade_1_8_7.php +++ b/includes/updates/upgrade_1_8_7.php @@ -25,9 +25,9 @@ function pmpro_upgrade_1_8_7() { _set_cron_array($jobs); //add the three we want back - pmpro_maybe_schedule_cron(current_time('timestamp'), 'daily', 'pmpro_cron_expire_memberships'); - pmpro_maybe_schedule_cron(current_time('timestamp')+1, 'daily', 'pmpro_cron_expiration_warnings'); - pmpro_maybe_schedule_cron(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); + pmpro_maybe_schedule_event(current_time('timestamp'), 'daily', 'pmpro_cron_expire_memberships'); + pmpro_maybe_schedule_event(current_time('timestamp')+1, 'daily', 'pmpro_cron_expiration_warnings'); + pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); pmpro_setOption("db_version", "1.87"); diff --git a/includes/updates/upgrade_2_6.php b/includes/updates/upgrade_2_6.php index eed86a3f4..2bf77727d 100644 --- a/includes/updates/upgrade_2_6.php +++ b/includes/updates/upgrade_2_6.php @@ -42,5 +42,5 @@ function pmpro_upgrade_2_6() { if ( ! empty( $next ) ) { wp_unschedule_event( $next, 'pmpro_cron_expire_memberships' ); } - pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); + pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); } \ No newline at end of file diff --git a/includes/upgradecheck.php b/includes/upgradecheck.php index 8235905db..063c9795f 100644 --- a/includes/upgradecheck.php +++ b/includes/upgradecheck.php @@ -105,7 +105,7 @@ function pmpro_checkForUpgrades() if($pmpro_db_version < 1.72) { //schedule the credit card expiring cron - pmpro_maybe_schedule_cron(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); + pmpro_maybe_schedule_event(current_time('timestamp'), 'monthly', 'pmpro_cron_credit_card_expiring_warnings'); pmpro_setOption("db_version", "1.72"); $pmpro_db_version = 1.72; @@ -234,7 +234,7 @@ function pmpro_checkForUpgrades() } if ( $pmpro_db_version < 2.3 ) { - pmpro_maybe_schedule_cron( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); + pmpro_maybe_schedule_event( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); pmpro_setOption( 'db_version', '2.3' ); } diff --git a/paid-memberships-pro.php b/paid-memberships-pro.php index e158fdad3..36336a8ba 100644 --- a/paid-memberships-pro.php +++ b/paid-memberships-pro.php @@ -207,10 +207,10 @@ function pmpro_cron_schedules_monthly( $schedules ) { // activation function pmpro_activation() { // schedule crons - pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); - pmpro_maybe_schedule_cron( current_time( 'timestamp' ) + 1, 'hourly', 'pmpro_cron_expiration_warnings' ); - pmpro_maybe_schedule_cron( current_time( 'timestamp' ), 'monthly', 'pmpro_cron_credit_card_expiring_warnings' ); - pmpro_maybe_schedule_cron( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); + pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); + pmpro_maybe_schedule_event( current_time( 'timestamp' ) + 1, 'hourly', 'pmpro_cron_expiration_warnings' ); + pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'monthly', 'pmpro_cron_credit_card_expiring_warnings' ); + pmpro_maybe_schedule_event( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); pmpro_set_capabilities_for_role( 'administrator', 'enable' ); From 55594cb936603741a50ed2da4efebd3c698c73bf Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Thu, 14 Apr 2022 01:44:43 +1000 Subject: [PATCH 108/145] using new cron functions on activation and deactivation --- paid-memberships-pro.php | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/paid-memberships-pro.php b/paid-memberships-pro.php index 36336a8ba..ec48365c6 100644 --- a/paid-memberships-pro.php +++ b/paid-memberships-pro.php @@ -206,25 +206,18 @@ function pmpro_cron_schedules_monthly( $schedules ) { // activation function pmpro_activation() { - // schedule crons - pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'hourly', 'pmpro_cron_expire_memberships' ); - pmpro_maybe_schedule_event( current_time( 'timestamp' ) + 1, 'hourly', 'pmpro_cron_expiration_warnings' ); - pmpro_maybe_schedule_event( current_time( 'timestamp' ), 'monthly', 'pmpro_cron_credit_card_expiring_warnings' ); - pmpro_maybe_schedule_event( strtotime( '10:30:00' ) - ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ), 'daily', 'pmpro_cron_admin_activity_email' ); - + pmpro_maybe_schedule_crons(); pmpro_set_capabilities_for_role( 'administrator', 'enable' ); - do_action( 'pmpro_activation' ); } // deactivation -function pmpro_deactivation() { +function pmpro_deactivation() { // remove crons - wp_clear_scheduled_hook( 'pmpro_cron_expiration_warnings' ); - wp_clear_scheduled_hook( 'pmpro_cron_trial_ending_warnings' ); - wp_clear_scheduled_hook( 'pmpro_cron_expire_memberships' ); - wp_clear_scheduled_hook( 'pmpro_cron_credit_card_expiring_warnings' ); - wp_clear_scheduled_hook( 'pmpro_cron_admin_activity_email' ); + $crons = array_keys( pmpro_get_crons() ); + foreach( $crons as $cron ) { + wp_clear_scheduled_hook( $cron ); + } // remove caps from admin role pmpro_set_capabilities_for_role( 'administrator', 'disable' ); From 9941b37ece96eef5002be3400b800f075bb5efbf Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Mon, 18 Apr 2022 23:53:07 +1000 Subject: [PATCH 109/145] WP options defauolt to autoload. Let's not autoload this one since it's not needed on EVERY page load. --- includes/compatibility.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/compatibility.php b/includes/compatibility.php index 5da41bdbd..4895ea975 100644 --- a/includes/compatibility.php +++ b/includes/compatibility.php @@ -143,5 +143,5 @@ function pmpro_track_library_conflict( $name, $path, $version ) { $library_conflicts[ $name ][ $path ]['timestamp'] = current_time( 'Y-m-d H:i:s' ); // Save changes. - update_option( 'pmpro_library_conflicts', $library_conflicts ); + update_option( 'pmpro_library_conflicts', $library_conflicts, false ); } From 137e876513e738c0dec7645fcd26cc05b5a72043 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 19 Apr 2022 07:10:33 +1000 Subject: [PATCH 110/145] Ignore PMPro conflicts. Avoid saving option too often. --- includes/compatibility.php | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/includes/compatibility.php b/includes/compatibility.php index 4895ea975..a13b565b9 100644 --- a/includes/compatibility.php +++ b/includes/compatibility.php @@ -124,7 +124,18 @@ function pmpro_compatibility_checker_themes(){ * * @since TBD */ -function pmpro_track_library_conflict( $name, $path, $version ) { +function pmpro_track_library_conflict( $name, $path, $version ) { + // Ignore when PMPro is trying to load. + if ( strpos( $path, '/plugins/paid-memberships-pro/' ) !== false ) { + return; + } + + // Use a static var for timestamp so we can avoid multiple updates per pageload. + static $now = null; + if ( empty( $now ) ) { + $now = current_time( 'Y-m-d H:i:s' ); + } + // Get the current list of library conflicts. $library_conflicts = get_option( 'pmpro_library_conflicts', array() ); @@ -137,11 +148,14 @@ function pmpro_track_library_conflict( $name, $path, $version ) { if ( ! isset( $library_conflicts[ $name ][ $path ] ) ) { $library_conflicts[ $name ][ $path ] = array(); } + + // Don't save conflict if no time has passed. + if ( ! empty( $library_conflicts[ $name ][ $path ]['timestamp'] ) && $library_conflicts[ $name ][ $path ]['timestamp'] === $now ) { + return; + } // Update the library conflict information. $library_conflicts[ $name ][ $path ]['version'] = $version; - $library_conflicts[ $name ][ $path ]['timestamp'] = current_time( 'Y-m-d H:i:s' ); - - // Save changes. + $library_conflicts[ $name ][ $path ]['timestamp'] = $now; update_option( 'pmpro_library_conflicts', $library_conflicts, false ); -} +} \ No newline at end of file From 9bc3e6bc8bc6d1c826eb2beb100ef1e8b20e834b Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 19 Apr 2022 08:47:57 +1000 Subject: [PATCH 111/145] updating changelog --- CHANGELOG.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 5339134e5..f2f9f1809 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,15 @@ == Changelog == += 2.8 - 2022-04-?? = +* FEATURE: Added refunds buttons for Stripe and Paypal Express orders. #1948 (@JarrydLong) +* FEATURE: Released Beta version of Stripe Checkout. Add `define('PMPRO_STRIPE_CHECKOUT_BETA_ENABLED', true);` to your wp-config.php to enable this gateway during the beta. #1923 (@dlparker1005) +* ENHANCEMENT: Introduced a new set of functions that handle cron-related tasks including: `pmpro_get_crons()` to get the list of PMPro registered crons. #1999 (@sc0ttkclark) +* ENHANCEMENT: New filter `pmpro_registered_crons` which you can register new crons to be handled by PMPro. They show up in the PMPro Site Health info and are automatically scheduled when they need to be. #1999 (@sc0ttkclark) +* ENHANCEMENT: Added an opt-in stats collection so we can get better insight on how people use Paid Memberships Pro. (@sc0ttkclark, @ideadude) +* BUG FIX/ENHANCEMENT: Fixed escaping and localization for many strings across the codebase. #1976 (@mircobabini) +* BUG FIX/ENHANCEMENT: Resolve admin area conflicts with other plugins using similar class names. #1991 (@sc0ttkclark) +* BUG FIX: Crons are now automatically rescheduled if they disappear form the cron schedule. #1999 (@sc0ttkclark, @mircobabini) +* BUG FIX: Resolved problems with PHP float precision and prevent passing along faulty floats to the gateway APIs. #1929 (@sc0ttkclark) + = 2.7.5 - 2022-03-01 = * ENHANCEMENT: Now sending "name" separate from the "description" when creating customers for Stripe checkouts. (@ideadude) * ENHANCEMENT: You can now search the members list on specific user table columns or user meta fields by using a colon in your search term. These queries are faster than the default queries. The format is meta_key:meta_value (no backticks). You can also use login, nicename, email, url, or display_name as the meta_key and the users table will be searched against the related column. (@ideadude) From b0541a63c3eb5ca0e813cb04d66af727b4d4fd73 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 19 Apr 2022 08:48:12 +1000 Subject: [PATCH 112/145] Formal German translation files. Fixes #1926 --- .../paid-memberships-pro-de_DE_formal.mo | Bin 0 -> 232484 bytes .../paid-memberships-pro-de_DE_formal.po | 13027 ++++++++++++++++ 2 files changed, 13027 insertions(+) create mode 100644 languages/paid-memberships-pro-de_DE_formal.mo create mode 100644 languages/paid-memberships-pro-de_DE_formal.po diff --git a/languages/paid-memberships-pro-de_DE_formal.mo b/languages/paid-memberships-pro-de_DE_formal.mo new file mode 100644 index 0000000000000000000000000000000000000000..a73f618380919cc1d4c9d57d9218b2ee03f57e6a GIT binary patch literal 232484 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

    aMroM~Nx+P9lf<2a3~ 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

    Imt61A?IQ0sC8wNEaio<|Q*pSypd<|la@GmgA? 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\n" +"Language-Team: Paid Memberships Pro \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2021-10-11T14:00:14+00:00\n" +"PO-Revision-Date: 2021-11-28 17:39+0100\n" +"X-Generator: Poedit 3.0\n" +"X-Domain: paid-memberships-pro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de_DE@formal\n" + +#: adminpages/addons.php:5 adminpages/advancedsettings.php:5 +#: adminpages/discountcodes.php:5 adminpages/emailsettings.php:5 +#: adminpages/membershiplevels.php:5 adminpages/memberslist-csv.php:5 +#: adminpages/memberslist.php:5 adminpages/orders-csv.php:4 +#: adminpages/orders-print.php:12 adminpages/orders.php:4 +#: adminpages/pagesettings.php:4 adminpages/paymentsettings.php:5 +#: adminpages/updates.php:5 includes/license.php:36 adminpages/addons.php:21 +#: adminpages/orders-csv.php:5 adminpages/orders.php:5 +#: adminpages/pagesettings.php:5 adminpages/emailtemplates.php:5 +#: adminpages/license.php:4 includes/services.php:91 includes/services.php:104 +#: includes/email.php:175 includes/email.php:211 includes/email.php:230 +#: includes/email.php:255 includes/email.php:273 includes/email.php:178 +#: includes/email.php:214 includes/email.php:237 includes/email.php:262 +#: includes/email.php:280 +msgid "You do not have permissions to perform this action." +msgstr "Sie haben keine Berechtigung für diesen Vorgang." + +#: adminpages/addons.php:67 adminpages/admin_header.php:204 +#: includes/adminpages.php:53 includes/adminpages.php:151 +#: adminpages/addons.php:64 adminpages/addons.php:80 +#: adminpages/admin_header.php:133 adminpages/admin_header.php:154 +#: adminpages/admin_header.php:170 adminpages/admin_header.php:179 +#: adminpages/admin_header.php:191 includes/adminpages.php:14 +#: includes/adminpages.php:52 includes/adminpages.php:69 +#: includes/adminpages.php:135 includes/adminpages.php:142 +#: includes/adminpages.php:146 adminpages/addons.php:81 +#: adminpages/admin_header.php:242 includes/adminpages.php:56 +#: includes/adminpages.php:206 +msgid "Add Ons" +msgstr "Add-Ons" + +#: adminpages/addons.php:74 adminpages/addons.php:71 adminpages/addons.php:87 +#: adminpages/addons.php:89 +#, php-format +msgid "Last checked on %s at %s." +msgstr "Zuletzt überprüft am %s um a%s." + +#: adminpages/addons.php:75 adminpages/addons.php:72 adminpages/addons.php:88 +#: adminpages/addons.php:90 +msgid "Check Again" +msgstr "Nochmal überprüfen" + +#: adminpages/addons.php:79 adminpages/orders.php:983 adminpages/addons.php:76 +#: adminpages/addons.php:92 adminpages/orders.php:605 adminpages/orders.php:712 +#: adminpages/orders.php:741 adminpages/orders.php:850 +#: adminpages/orders.php:881 adminpages/orders.php:892 adminpages/addons.php:94 +#: adminpages/orders.php:1016 adminpages/orders.php:1022 +msgid "All" +msgstr "Alle" + +#: adminpages/addons.php:80 adminpages/addons.php:77 adminpages/addons.php:93 +#: adminpages/addons.php:95 +msgid "Active" +msgstr "Aktiv" + +#: adminpages/addons.php:81 adminpages/addons.php:78 adminpages/addons.php:94 +#: adminpages/addons.php:96 +msgid "Inactive" +msgstr "Inaktiv" + +#: adminpages/addons.php:82 adminpages/addons.php:79 adminpages/addons.php:95 +#: adminpages/addons.php:97 +msgid "Update Available" +msgstr "Update verfügbar" + +#: adminpages/addons.php:83 adminpages/addons.php:80 adminpages/addons.php:96 +#: adminpages/addons.php:98 +msgid "Not Installed" +msgstr "Nicht installiert" + +#: adminpages/addons.php:96 adminpages/addons.php:93 adminpages/addons.php:109 +msgid "Add On Name" +msgstr "Add-On Name" + +#: adminpages/addons.php:97 adminpages/addons.php:94 adminpages/addons.php:110 +msgid "Type" +msgstr "Typ" + +#: adminpages/addons.php:98 adminpages/membershiplevels.php:334 +#: adminpages/addons.php:95 adminpages/addons.php:111 +#: adminpages/membershiplevels.php:296 adminpages/membershiplevels.php:298 +#: adminpages/membershiplevels.php:300 adminpages/membershiplevels.php:324 +#: adminpages/membershiplevels.php:359 +msgid "Description" +msgstr "Beschreibung" + +#: adminpages/addons.php:121 adminpages/addons.php:118 +#: adminpages/addons.php:134 adminpages/addons.php:135 +msgid "No Add Ons found." +msgstr "Keine Add-Ons gefunden." + +#: adminpages/addons.php:182 adminpages/addons.php:187 +#: adminpages/addons.php:199 adminpages/addons.php:179 +#: adminpages/addons.php:184 adminpages/addons.php:195 +#: adminpages/addons.php:196 adminpages/addons.php:200 +#: adminpages/addons.php:212 adminpages/addons.php:201 +#: adminpages/addons.php:213 +msgid "Install Now" +msgstr "Jetzt installieren" + +#: adminpages/addons.php:188 adminpages/addons.php:194 +#: adminpages/addons.php:200 adminpages/addons.php:206 +#: adminpages/addons.php:185 adminpages/addons.php:191 +#: adminpages/addons.php:197 adminpages/addons.php:201 +#: adminpages/addons.php:203 adminpages/addons.php:207 +#: adminpages/addons.php:213 adminpages/addons.php:219 +#: adminpages/addons.php:202 adminpages/addons.php:208 +#: adminpages/addons.php:214 adminpages/addons.php:220 +msgid "Download" +msgstr "Herunterladen" + +#: adminpages/addons.php:193 adminpages/addons.php:205 +#: adminpages/addons.php:190 adminpages/addons.php:202 +#: adminpages/addons.php:206 adminpages/addons.php:218 +#: adminpages/addons.php:207 adminpages/addons.php:219 +msgid "Update License" +msgstr "Update-Lizenz" + +#: adminpages/addons.php:211 adminpages/addons.php:208 +#: adminpages/addons.php:224 +msgid "Deactivate" +msgstr "Deaktivieren" + +#: adminpages/addons.php:211 adminpages/addons.php:208 +#: adminpages/addons.php:224 +#, php-format +msgid "Deactivate %s" +msgstr "Deaktivieren %s" + +#: adminpages/addons.php:215 adminpages/addons.php:212 +#: adminpages/addons.php:228 +msgid "Activate" +msgstr "Aktivieren" + +#: adminpages/addons.php:215 adminpages/addons.php:212 +#: adminpages/addons.php:228 +#, php-format +msgid "Activate %s" +msgstr "Aktivieren %s" + +#: adminpages/addons.php:216 adminpages/addons.php:213 +#: adminpages/addons.php:229 adminpages/discountcodes.php:816 +#: adminpages/membershiplevels.php:835 adminpages/orders.php:1374 +#: adminpages/discountcodes.php:862 adminpages/discountcodes.php:864 +#: adminpages/membershiplevels.php:887 adminpages/membershiplevels.php:889 +#: adminpages/orders.php:1425 adminpages/orders.php:1427 +#: adminpages/discountcodes.php:866 +msgid "Delete" +msgstr "Löschen" + +#: adminpages/addons.php:216 adminpages/addons.php:213 +#: adminpages/addons.php:229 +#, php-format +msgid "Delete %s" +msgstr "Lösche %s" + +#: adminpages/addons.php:226 adminpages/addons.php:223 +#: adminpages/addons.php:239 adminpages/addons.php:240 +msgid "PMPro Free" +msgstr "PMPro Free" + +#: adminpages/addons.php:228 adminpages/addons.php:225 +#: adminpages/addons.php:241 adminpages/addons.php:242 +msgid "PMPro Core" +msgstr "PMPro Core" + +#: adminpages/addons.php:230 adminpages/addons.php:227 +#: adminpages/addons.php:243 adminpages/addons.php:244 +msgid "PMPro Plus" +msgstr "PMPro Plus" + +#: adminpages/addons.php:232 adminpages/addons.php:229 +#: adminpages/addons.php:245 adminpages/addons.php:246 +msgid "WordPress.org" +msgstr "WordPress.org" + +#: adminpages/addons.php:234 adminpages/orders.php:855 +#: adminpages/orders.php:1340 adminpages/orders.php:1350 +#: includes/profile.php:186 shortcodes/pmpro_account.php:148 +#: adminpages/addons.php:231 adminpages/addons.php:247 +#: shortcodes/pmpro_account.php:145 shortcodes/pmpro_account.php:146 +#: adminpages/addons.php:248 adminpages/orders.php:581 +#: adminpages/orders.php:1467 adminpages/orders.php:1477 +#: includes/profile.php:173 includes/profile.php:456 includes/profile.php:457 +#: includes/profile.php:514 includes/profile.php:515 includes/profile.php:516 +#: shortcodes/pmpro_account.php:254 adminpages/orders.php:587 +#: adminpages/orders.php:1544 adminpages/orders.php:1554 +#: adminpages/orders.php:1553 includes/profile.php:520 includes/profile.php:521 +#: includes/profile.php:522 +msgid "N/A" +msgstr "Nicht verfügbar" + +#: adminpages/addons.php:243 adminpages/addons.php:240 +#: adminpages/addons.php:256 +#, php-format +msgid "Version %s" +msgstr "Version %s" + +#: adminpages/addons.php:248 adminpages/addons.php:245 +#: adminpages/addons.php:261 +#, php-format +msgid "By %s" +msgstr "Von %s" + +#: adminpages/addons.php:255 adminpages/addons.php:252 +#: adminpages/addons.php:268 +#, php-format +msgid "More information about %s" +msgstr "Weitere Informationen über %s" + +#: adminpages/addons.php:257 adminpages/addons.php:254 +#: adminpages/addons.php:270 +msgid "View details" +msgstr "Zeige Details" + +#: adminpages/addons.php:262 adminpages/addons.php:259 +#: adminpages/addons.php:275 +msgid "Visit plugin site" +msgstr "Gehe zur Plugin-Seite" + +#: adminpages/admin_header.php:25 +msgid "Add a membership level to get started." +msgstr "Fügen Sie ein Paket hinzu, um zu beginnen." + +#: adminpages/admin_header.php:27 +msgid "Set up the membership pages" +msgstr "Mitglieds-Seiten erstellen" + +#: adminpages/admin_header.php:29 +msgid "Set up your SSL certificate and payment gateway" +msgstr "SSL-Zertifikat und Zahlungsdienstleister einstellen" + +#: adminpages/admin_header.php:39 adminpages/admin_header.php:38 +msgid "The billing details for some of your membership levels is not supported by Stripe." +msgstr "Die Zahlungs-Einstellungen für einige Ihrer Pakete werden von Stripe nicht unterstützt." + +#: adminpages/admin_header.php:47 adminpages/admin_header.php:46 +msgid "The billing details for this level are not supported by Stripe. Please review the notes in the Billing Details section below." +msgstr "Die Zahlungs-Einstellungen für dieses Paket werden von Stripe nicht unterstützt. Bitte überprüfen Sie die Angaben unter Zahlungs-Einstellungen." + +#: adminpages/admin_header.php:51 adminpages/admin_header.php:71 +#: adminpages/admin_header.php:98 adminpages/admin_header.php:122 +#: adminpages/admin_header.php:50 adminpages/admin_header.php:70 +#: adminpages/admin_header.php:90 adminpages/admin_header.php:91 +#: adminpages/admin_header.php:111 adminpages/admin_header.php:112 +msgid "The levels with issues are highlighted below." +msgstr "Die Pakete mit Fehlern sind unten hervorgehoben." + +#: adminpages/admin_header.php:53 adminpages/admin_header.php:73 +#: adminpages/admin_header.php:101 adminpages/admin_header.php:124 +#: adminpages/admin_header.php:52 adminpages/admin_header.php:72 +#: adminpages/admin_header.php:92 adminpages/admin_header.php:93 +#: adminpages/admin_header.php:113 adminpages/admin_header.php:114 +msgid "Please edit your levels" +msgstr "Ändern Sie bitte Ihre Pakete" + +#: adminpages/admin_header.php:59 adminpages/admin_header.php:58 +msgid "The billing details for some of your membership levels is not supported by Payflow." +msgstr "Die Zahlungs-Einstellungen für einige Ihrer Pakete werden von Payflow nicht unterstützt." + +#: adminpages/admin_header.php:67 adminpages/admin_header.php:66 +msgid "The billing details for this level are not supported by Payflow. Please review the notes in the Billing Details section below." +msgstr "Die Zahlungs-Einstellungen für dieses Paket werden von Payflow nicht unterstützt. Bitte überprüfen Sie die Angaben unter Zahlungs-Einstellungen." + +#: adminpages/admin_header.php:82 adminpages/admin_header.php:78 +#: adminpages/admin_header.php:79 +msgid "The billing details for some of your membership levels is not supported by Braintree." +msgstr "Die Zahlungs-Einstellungen für einige Ihrer Pakete werden von Braintree nicht unterstützt." + +#: adminpages/admin_header.php:93 adminpages/admin_header.php:86 +#: adminpages/admin_header.php:87 +msgid "The billing details for this level are not supported by Braintree. Please review the notes in the Billing Details section below." +msgstr "Die Zahlungs-Einstellungen für dieses Paket werden von Braintree nicht unterstützt. Bitte überprüfen Sie die Angaben unter Zahlungs-Einstellungen." + +#: adminpages/admin_header.php:109 adminpages/admin_header.php:98 +#: adminpages/admin_header.php:99 +msgid "The billing details for some of your membership levels is not supported by TwoCheckout." +msgstr "Die Zahlungs-Einstellungen für einige Ihrer Pakete werden von TwoCheckout nicht unterstützt." + +#: adminpages/admin_header.php:118 adminpages/admin_header.php:107 +#: adminpages/admin_header.php:108 +msgid "The billing details for this level are not supported by 2Checkout. Please review the notes in the Billing Details section below." +msgstr "Die Zahlungs-Einstellungen für dieses Paket werden von 2Checkout nicht unterstützt. Bitte überprüfen Sie die Angaben unter Zahlungs-Einstellungen." + +#: adminpages/admin_header.php:135 +#: classes/gateways/class.pmprogateway_stripe.php:66 +#: adminpages/admin_header.php:125 adminpages/admin_header.php:152 +#: classes/gateways/class.pmprogateway_stripe.php:76 +#: classes/gateways/class.pmprogateway_stripe.php:82 +#, php-format +msgid "The Stripe Gateway requires PHP 5.3.29 or greater. We recommend upgrading to PHP %s or greater. Ask your host to upgrade." +msgstr "Das Stripe Gateway erfordert PHP 5.3.29 oder höher. Wir empfehlen ein Upgrade auf PHP %s oder höher. Bitten Sie Ihren Hoster um ein Upgrade." + +#: adminpages/admin_header.php:138 +#: classes/gateways/class.pmprogateway_braintree.php:70 +#: adminpages/admin_header.php:128 +#: classes/gateways/class.pmprogateway_braintree.php:50 +#: adminpages/admin_header.php:155 +#: classes/gateways/class.pmprogateway_braintree.php:73 +#, php-format +msgid "The Braintree Gateway requires PHP 5.4.45 or greater. We recommend upgrading to PHP %s or greater. Ask your host to upgrade." +msgstr "Das Braintree-Gateway erfordert PHP 5.4.45 oder höher. Wir empfehlen ein Upgrade auf PHP %s oder höher. Bitten Sie Ihren Hoster um ein Upgrade." + +#: adminpages/admin_header.php:144 adminpages/admin_header.php:134 +#: adminpages/admin_header.php:161 +#, php-format +msgid "We recommend upgrading to PHP %s or greater. Ask your host to upgrade." +msgstr "Wir empfehlen ein Upgrade auf PHP %s oder höher. Bitten Sie Ihren Hoster um ein Upgrade." + +#: adminpages/admin_header.php:160 adminpages/admin_header.php:173 +msgid "Documentation" +msgstr "Dokumentation" + +#: adminpages/admin_header.php:161 adminpages/admin_header.php:174 +#: classes/class-pmpro-admin-activity-email.php:356 +msgid "Get Support" +msgstr "Support bekommen" + +#: adminpages/admin_header.php:184 adminpages/membershiplevels.php:641 +#: adminpages/pagesettings.php:85 includes/adminpages.php:69 +#: includes/adminpages.php:70 includes/adminpages.php:116 +#: includes/metaboxes.php:132 adminpages/admin_header.php:128 +#: adminpages/admin_header.php:149 adminpages/admin_header.php:150 +#: adminpages/admin_header.php:159 adminpages/admin_header.php:171 +#: adminpages/membershiplevels.php:490 adminpages/membershiplevels.php:496 +#: adminpages/membershiplevels.php:498 adminpages/membershiplevels.php:525 +#: adminpages/membershiplevels.php:526 adminpages/membershiplevels.php:569 +#: adminpages/membershiplevels.php:607 adminpages/membershiplevels.php:609 +#: adminpages/membershiplevels.php:618 adminpages/membershiplevels.php:619 +#: adminpages/membershiplevels.php:631 adminpages/pagesettings.php:69 +#: adminpages/pagesettings.php:70 adminpages/pagesettings.php:71 +#: includes/adminpages.php:44 includes/adminpages.php:64 +#: includes/adminpages.php:65 includes/adminpages.php:100 +#: includes/adminpages.php:107 includes/adminpages.php:111 +#: includes/metaboxes.php:126 includes/metaboxes.php:131 +#: adminpages/admin_header.php:253 adminpages/membershiplevels.php:792 +#: adminpages/pagesettings.php:98 includes/compatibility/beaver-builder.php:134 +msgid "Membership Levels" +msgstr "Pakete" + +#: adminpages/admin_header.php:188 adminpages/pagesettings.php:108 +#: adminpages/admin_header.php:129 adminpages/admin_header.php:150 +#: adminpages/admin_header.php:154 adminpages/admin_header.php:163 +#: adminpages/admin_header.php:175 adminpages/pagesettings.php:92 +#: adminpages/pagesettings.php:93 adminpages/pagesettings.php:120 +#: adminpages/admin_header.php:261 +msgid "Pages" +msgstr "Seiten" + +#: adminpages/admin_header.php:192 adminpages/admin_header.php:130 +#: adminpages/admin_header.php:151 adminpages/admin_header.php:158 +#: adminpages/admin_header.php:167 adminpages/admin_header.php:179 +#: adminpages/admin_header.php:265 +msgid "Payment Gateway & SSL" +msgstr "Zahlungsdienstleister & SSL" + +#: adminpages/admin_header.php:196 adminpages/memberslist.php:168 +#: shortcodes/pmpro_account.php:111 adminpages/admin_header.php:131 +#: adminpages/admin_header.php:152 adminpages/admin_header.php:162 +#: adminpages/admin_header.php:171 adminpages/admin_header.php:183 +#: adminpages/memberslist.php:115 adminpages/memberslist.php:148 +#: adminpages/memberslist.php:158 pages/account.php:52 pages/account.php:56 +#: pages/account.php:77 shortcodes/pmpro_account.php:106 +#: shortcodes/pmpro_account.php:108 shortcodes/pmpro_account.php:109 +#: adminpages/orders.php:385 adminpages/orders.php:1381 +#: includes/profile.php:451 includes/profile.php:750 +#: shortcodes/pmpro_account.php:174 adminpages/orders.php:391 +#: adminpages/orders.php:1445 adminpages/orders.php:1448 +#: includes/profile.php:762 +msgid "Email" +msgstr "E-Mail" + +#: adminpages/admin_header.php:200 adminpages/admin_header.php:132 +#: adminpages/admin_header.php:153 adminpages/admin_header.php:166 +#: adminpages/admin_header.php:175 adminpages/admin_header.php:187 +#: adminpages/admin_header.php:277 +msgid "Advanced" +msgstr "Erweitert" + +#: adminpages/advancedsettings.php:13 adminpages/discountcodes.php:58 +#: adminpages/discountcodes.php:304 adminpages/emailsettings.php:16 +#: adminpages/membershiplevels.php:43 adminpages/pagesettings.php:29 +#: adminpages/pagesettings.php:68 adminpages/paymentsettings.php:19 +#: adminpages/discountcodes.php:63 adminpages/discountcodes.php:311 +#: adminpages/emailsettings.php:18 adminpages/pagesettings.php:72 +#: adminpages/discountcodes.php:65 adminpages/discountcodes.php:313 +msgid "Are you sure you want to do that? Try again." +msgstr "Sind Sie sicher, dass Sie das tun wollen? Versuchen Sie es noch einmal." + +#: adminpages/advancedsettings.php:60 adminpages/advancedsettings.php:35 +#: adminpages/advancedsettings.php:42 adminpages/advancedsettings.php:43 +#: adminpages/advancedsettings.php:46 adminpages/advancedsettings.php:68 +msgid "Your advanced settings have been updated." +msgstr "Ihre erweiterten Einstellungen wurden gespeichert." + +#: adminpages/advancedsettings.php:85 adminpages/advancedsettings.php:66 +#: adminpages/advancedsettings.php:68 adminpages/advancedsettings.php:71 +#, php-format +msgid "This content is for !!levels!! members only. Register here." +msgstr "Dieser Inhalt ist nur für !!levels!! Mitglieder. Hier registrieren." + +#: adminpages/advancedsettings.php:90 adminpages/advancedsettings.php:71 +#: adminpages/advancedsettings.php:73 adminpages/advancedsettings.php:76 +#, php-format +msgid "Please login to view this content. (Register here.)" +msgstr "Loggen Sie sich bitte ein um diesen Inhalt zu sehen. (Wenn Sie noch kein Konto haben, können Sie sich Hier registrieren.)" + +#: adminpages/advancedsettings.php:95 adminpages/advancedsettings.php:76 +#: adminpages/advancedsettings.php:78 adminpages/advancedsettings.php:81 +#: adminpages/advancedsettings.php:116 includes/updates/upgrade_1.php:13 +msgid "This content is for members only. Visit the site and log in/register to read." +msgstr "Diese Inhalte sind nur für angemeldete Benutzer sichtbar. Bitte melden Sie sich an oder registrieren Sie sich, um die Inhalte zu sehen." + +#: adminpages/advancedsettings.php:107 includes/adminpages.php:52 +#: includes/adminpages.php:144 adminpages/advancedsettings.php:79 +#: adminpages/advancedsettings.php:86 adminpages/advancedsettings.php:88 +#: adminpages/advancedsettings.php:91 includes/adminpages.php:13 +#: includes/adminpages.php:51 includes/adminpages.php:64 +#: includes/adminpages.php:128 includes/adminpages.php:135 +#: includes/adminpages.php:139 adminpages/admin_header.php:277 +#: adminpages/advancedsettings.php:132 includes/adminpages.php:73 +msgid "Advanced Settings" +msgstr "Erweiterte Einstellungen" + +#: adminpages/advancedsettings.php:113 adminpages/advancedsettings.php:85 +#: adminpages/advancedsettings.php:92 adminpages/advancedsettings.php:94 +#: adminpages/advancedsettings.php:97 adminpages/advancedsettings.php:164 +msgid "Message for Logged-in Non-members" +msgstr "Nachricht für eingeloggte Nicht-Mitglieder" + +#: adminpages/advancedsettings.php:117 adminpages/advancedsettings.php:89 +#: adminpages/advancedsettings.php:96 adminpages/advancedsettings.php:98 +#: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:168 +msgid "This message replaces the post content for non-members. Available variables" +msgstr "Diese Nachricht ersetzt den Artikel-Inhalt für Nicht-Mitglieder. Verfügbare Variablen" + +#: adminpages/advancedsettings.php:122 adminpages/advancedsettings.php:94 +#: adminpages/advancedsettings.php:101 adminpages/advancedsettings.php:103 +#: adminpages/advancedsettings.php:106 adminpages/advancedsettings.php:173 +msgid "Message for Logged-out Users" +msgstr "Nachricht für ausgeloggte Benutzer" + +#: adminpages/advancedsettings.php:126 adminpages/advancedsettings.php:98 +#: adminpages/advancedsettings.php:105 adminpages/advancedsettings.php:107 +#: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:177 +msgid "This message replaces the post content for logged-out visitors." +msgstr "Diese Nachricht ersetzt den Artikel-Inhalt für ausgeloggte Besucher." + +#: adminpages/advancedsettings.php:131 adminpages/advancedsettings.php:103 +#: adminpages/advancedsettings.php:110 adminpages/advancedsettings.php:112 +#: adminpages/advancedsettings.php:115 adminpages/advancedsettings.php:182 +msgid "Message for RSS Feed" +msgstr "Nachricht für RSS Feed" + +#: adminpages/advancedsettings.php:135 adminpages/advancedsettings.php:107 +#: adminpages/advancedsettings.php:114 adminpages/advancedsettings.php:116 +#: adminpages/advancedsettings.php:119 adminpages/advancedsettings.php:186 +msgid "This message replaces the post content in RSS feeds." +msgstr "Diese Nachricht ersetzt den Artikel-Inhalt in RSS-feeds." + +#: adminpages/advancedsettings.php:141 adminpages/advancedsettings.php:122 +#: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:199 +msgid "Filter searches and archives?" +msgstr "Suchen und Archive filtern?" + +#: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:126 +#: adminpages/advancedsettings.php:129 adminpages/advancedsettings.php:203 +msgid "No - Non-members will see restricted posts/pages in searches and archives." +msgstr "Nein - Nicht-Mitglieder werden eingeschränkte Beiträge/Seiten in Suchen und Archiven sehen." + +#: adminpages/advancedsettings.php:146 adminpages/advancedsettings.php:127 +#: adminpages/advancedsettings.php:130 adminpages/advancedsettings.php:204 +msgid "Yes - Only members will see restricted posts/pages in searches and archives." +msgstr "Ja - Nur Mitglieder werden eingeschränkte Beiträge/Seiten in Suchen und Archiven sehen." + +#: adminpages/advancedsettings.php:152 adminpages/advancedsettings.php:113 +#: adminpages/advancedsettings.php:120 adminpages/advancedsettings.php:133 +#: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:210 +msgid "Show Excerpts to Non-Members?" +msgstr "Soll Nicht-Mitgliedern ein Ausschnitt gezeigt werden?" + +#: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:117 +#: adminpages/advancedsettings.php:124 adminpages/advancedsettings.php:137 +#: adminpages/advancedsettings.php:140 adminpages/advancedsettings.php:214 +msgid "No - Hide excerpts." +msgstr "Nein - Ausschnitt verbergen." + +#: adminpages/advancedsettings.php:157 adminpages/advancedsettings.php:118 +#: adminpages/advancedsettings.php:125 adminpages/advancedsettings.php:138 +#: adminpages/advancedsettings.php:141 adminpages/advancedsettings.php:215 +msgid "Yes - Show excerpts." +msgstr "Ja - Ausschnitt anzeigen." + +#: adminpages/advancedsettings.php:163 adminpages/advancedsettings.php:144 +#: adminpages/advancedsettings.php:147 adminpages/advancedsettings.php:333 +msgid "Hide Ads From Members?" +msgstr "Werbung vor Mitgliedern verstecken?" + +#: adminpages/advancedsettings.php:167 adminpages/advancedsettings.php:226 +#: adminpages/advancedsettings.php:238 adminpages/membershiplevels.php:694 +#: adminpages/paymentsettings.php:236 +#: classes/gateways/class.pmprogateway_stripe.php:289 includes/profile.php:125 +#: adminpages/advancedsettings.php:128 adminpages/advancedsettings.php:135 +#: adminpages/advancedsettings.php:148 adminpages/advancedsettings.php:151 +#: adminpages/advancedsettings.php:187 adminpages/advancedsettings.php:194 +#: adminpages/advancedsettings.php:199 adminpages/advancedsettings.php:206 +#: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:210 +#: adminpages/advancedsettings.php:219 adminpages/advancedsettings.php:222 +#: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569 +#: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:578 +#: adminpages/membershiplevels.php:598 adminpages/membershiplevels.php:658 +#: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662 +#: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:668 +#: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:684 +#: adminpages/paymentsettings.php:210 adminpages/paymentsettings.php:219 +#: adminpages/paymentsettings.php:414 adminpages/paymentsettings.php:429 +#: adminpages/paymentsettings.php:434 adminpages/paymentsettings.php:436 +#: adminpages/paymentsettings.php:454 adminpages/paymentsettings.php:459 +#: adminpages/paymentsettings.php:461 +#: classes/gateways/class.pmprogateway_stripe.php:173 +#: classes/gateways/class.pmprogateway_stripe.php:174 +#: classes/gateways/class.pmprogateway_stripe.php:184 +#: classes/gateways/class.pmprogateway_stripe.php:206 +#: classes/gateways/class.pmprogateway_stripe.php:208 +#: classes/gateways/class.pmprogateway_stripe.php:209 +#: classes/gateways/class.pmprogateway_stripe.php:220 +#: classes/gateways/class.pmprogateway_stripe.php:222 +#: classes/gateways/class.pmprogateway_stripe.php:249 +#: classes/gateways/class.pmprogateway_stripe.php:281 +#: classes/gateways/class.pmprogateway_stripe.php:297 +#: classes/gateways/class.pmprogateway_stripe.php:298 includes/profile.php:101 +#: includes/profile.php:105 includes/profile.php:110 includes/profile.php:117 +#: includes/profile.php:121 includes/profile.php:123 +#: adminpages/advancedsettings.php:245 adminpages/advancedsettings.php:337 +#: adminpages/advancedsettings.php:394 adminpages/advancedsettings.php:477 +#: adminpages/membershiplevels.php:860 adminpages/paymentsettings.php:266 +#: classes/gateways/class.pmprogateway_stripe.php:603 +#: classes/gateways/class.pmprogateway_stripe.php:617 +#: includes/compatibility/beaver-builder.php:45 +#: includes/compatibility/beaver-builder.php:141 includes/profile.php:92 +#: adminpages/membershiplevels.php:941 +#: classes/gateways/class.pmprogateway_stripe.php:615 +#: classes/gateways/class.pmprogateway_stripe.php:629 +#: adminpages/advancedsettings.php:396 adminpages/advancedsettings.php:479 +#: classes/gateways/class.pmprogateway_stripe.php:634 +#: classes/gateways/class.pmprogateway_stripe.php:648 +#: classes/gateways/class.pmprogateway_stripe.php:640 +#: classes/gateways/class.pmprogateway_stripe.php:654 +msgid "No" +msgstr "Nein" + +#: adminpages/advancedsettings.php:168 adminpages/advancedsettings.php:129 +#: adminpages/advancedsettings.php:136 adminpages/advancedsettings.php:149 +#: adminpages/advancedsettings.php:152 adminpages/advancedsettings.php:338 +msgid "Hide Ads From All Members" +msgstr "Werbung für alle Mitglieder ausblenden" + +#: adminpages/advancedsettings.php:169 adminpages/advancedsettings.php:130 +#: adminpages/advancedsettings.php:137 adminpages/advancedsettings.php:150 +#: adminpages/advancedsettings.php:153 adminpages/advancedsettings.php:339 +msgid "Hide Ads From Certain Members" +msgstr "Werbung für bestimmte Mitglieder ausblenden" + +#: adminpages/advancedsettings.php:176 adminpages/advancedsettings.php:137 +#: adminpages/advancedsettings.php:144 adminpages/advancedsettings.php:157 +#: adminpages/advancedsettings.php:160 +msgid "Ads from the following plugins will be automatically turned off" +msgstr "Werbung von den folgenden Plugins wird automatisch deaktiviert" + +#: adminpages/advancedsettings.php:177 adminpages/advancedsettings.php:138 +#: adminpages/advancedsettings.php:145 adminpages/advancedsettings.php:158 +#: adminpages/advancedsettings.php:161 adminpages/advancedsettings.php:346 +msgid "To hide ads in your template code, use code like the following" +msgstr "Um Werbung in Ihrem Template Code zu verbergen, verwenden Sie den folgenden Code" + +#: adminpages/advancedsettings.php:188 adminpages/advancedsettings.php:149 +#: adminpages/advancedsettings.php:156 adminpages/advancedsettings.php:169 +#: adminpages/advancedsettings.php:172 adminpages/advancedsettings.php:355 +msgid "Choose Levels to Hide Ads From" +msgstr "Pakete auswählen, für die Werbung ausgeblendet werden soll" + +#: adminpages/advancedsettings.php:222 adminpages/advancedsettings.php:183 +#: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203 +#: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:390 +#: adminpages/advancedsettings.php:392 +msgid "Redirect all traffic from registration page to /susbcription/?" +msgstr "Alle Besucher der Registrierungs-Seite zu /susbcription/ weiterleiten?" + +#: adminpages/advancedsettings.php:222 adminpages/advancedsettings.php:183 +#: adminpages/advancedsettings.php:190 adminpages/advancedsettings.php:203 +#: adminpages/advancedsettings.php:206 adminpages/advancedsettings.php:390 +#: adminpages/advancedsettings.php:392 +msgid "multisite only" +msgstr "nur Multisite" + +#: adminpages/advancedsettings.php:227 adminpages/membershiplevels.php:694 +#: adminpages/paymentsettings.php:237 +#: classes/gateways/class.pmprogateway_stripe.php:290 includes/profile.php:126 +#: adminpages/advancedsettings.php:188 adminpages/advancedsettings.php:195 +#: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:211 +#: adminpages/membershiplevels.php:563 adminpages/membershiplevels.php:569 +#: adminpages/membershiplevels.php:571 adminpages/membershiplevels.php:578 +#: adminpages/membershiplevels.php:598 adminpages/membershiplevels.php:658 +#: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662 +#: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:668 +#: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:684 +#: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:220 +#: adminpages/paymentsettings.php:415 adminpages/paymentsettings.php:424 +#: adminpages/paymentsettings.php:430 adminpages/paymentsettings.php:435 +#: adminpages/paymentsettings.php:437 adminpages/paymentsettings.php:455 +#: adminpages/paymentsettings.php:460 adminpages/paymentsettings.php:462 +#: classes/gateways/class.pmprogateway_stripe.php:174 +#: classes/gateways/class.pmprogateway_stripe.php:175 +#: classes/gateways/class.pmprogateway_stripe.php:185 +#: classes/gateways/class.pmprogateway_stripe.php:207 +#: classes/gateways/class.pmprogateway_stripe.php:209 +#: classes/gateways/class.pmprogateway_stripe.php:210 +#: classes/gateways/class.pmprogateway_stripe.php:221 +#: classes/gateways/class.pmprogateway_stripe.php:223 +#: classes/gateways/class.pmprogateway_stripe.php:250 +#: classes/gateways/class.pmprogateway_stripe.php:282 +#: classes/gateways/class.pmprogateway_stripe.php:298 +#: classes/gateways/class.pmprogateway_stripe.php:299 includes/profile.php:102 +#: includes/profile.php:106 includes/profile.php:111 includes/profile.php:118 +#: includes/profile.php:122 includes/profile.php:124 +#: adminpages/advancedsettings.php:395 adminpages/membershiplevels.php:855 +#: adminpages/membershiplevels.php:857 adminpages/paymentsettings.php:267 +#: classes/gateways/class.pmprogateway_stripe.php:605 +#: classes/gateways/class.pmprogateway_stripe.php:619 +#: includes/compatibility/beaver-builder.php:44 +#: includes/compatibility/beaver-builder.php:140 includes/profile.php:93 +#: adminpages/membershiplevels.php:936 adminpages/membershiplevels.php:938 +#: classes/gateways/class.pmprogateway_stripe.php:617 +#: classes/gateways/class.pmprogateway_stripe.php:631 +#: adminpages/advancedsettings.php:397 +#: classes/gateways/class.pmprogateway_stripe.php:636 +#: classes/gateways/class.pmprogateway_stripe.php:650 +#: classes/gateways/class.pmprogateway_stripe.php:642 +#: classes/gateways/class.pmprogateway_stripe.php:656 +msgid "Yes" +msgstr "Ja" + +#: adminpages/advancedsettings.php:234 adminpages/advancedsettings.php:195 +#: adminpages/advancedsettings.php:202 adminpages/advancedsettings.php:215 +#: adminpages/advancedsettings.php:218 adminpages/advancedsettings.php:241 +msgid "Use reCAPTCHA?" +msgstr "reCAPTCHA verwenden?" + +#: adminpages/advancedsettings.php:239 adminpages/advancedsettings.php:200 +#: adminpages/advancedsettings.php:207 adminpages/advancedsettings.php:220 +#: adminpages/advancedsettings.php:223 adminpages/advancedsettings.php:246 +msgid "Yes - Free memberships only." +msgstr "Ja - nur Gratis-Mitgliedschaft." + +#: adminpages/advancedsettings.php:240 adminpages/advancedsettings.php:201 +#: adminpages/advancedsettings.php:208 adminpages/advancedsettings.php:221 +#: adminpages/advancedsettings.php:224 adminpages/advancedsettings.php:247 +msgid "Yes - All memberships." +msgstr "Ja - jede Mitgliedschaft." + +#: adminpages/advancedsettings.php:242 adminpages/advancedsettings.php:203 +#: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223 +#: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:249 +msgid "A free reCAPTCHA key is required." +msgstr "Ein kostenloser reCAPTCHA key ist erforderlich." + +#: adminpages/advancedsettings.php:242 adminpages/advancedsettings.php:203 +#: adminpages/advancedsettings.php:210 adminpages/advancedsettings.php:223 +#: adminpages/advancedsettings.php:226 adminpages/advancedsettings.php:249 +msgid "Click here to signup for reCAPTCHA" +msgstr "Klicken Sie hier um sich bei reCAPTCHA anzumelden" + +#: adminpages/advancedsettings.php:248 adminpages/advancedsettings.php:267 +msgid "reCAPTCHA Site Key" +msgstr "reCAPTCHA Site Key" + +#: adminpages/advancedsettings.php:251 adminpages/advancedsettings.php:273 +msgid "reCAPTCHA Secret Key" +msgstr "reCAPTCHA Secret Key" + +#: adminpages/advancedsettings.php:257 adminpages/advancedsettings.php:218 +#: adminpages/advancedsettings.php:225 adminpages/advancedsettings.php:238 +#: adminpages/advancedsettings.php:241 adminpages/advancedsettings.php:229 +msgid "Require Terms of Service on signups?" +msgstr "Geschäftsbedingungen bei Registrierung bestätigen?" + +#: adminpages/advancedsettings.php:264 adminpages/advancedsettings.php:225 +#: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:245 +#: adminpages/advancedsettings.php:248 adminpages/advancedsettings.php:236 +msgid "If yes, create a WordPress page containing your TOS agreement and assign it using the dropdown above." +msgstr "Falls Ja, erstellen Sie eine WordPress Seite mit Ihren AGB und wählen Sie diese in obigem Dropdown-Menü aus." + +#: adminpages/advancedsettings.php:375 adminpages/pagesettings.php:310 +#: adminpages/paymentsettings.php:267 adminpages/advancedsettings.php:284 +#: adminpages/advancedsettings.php:355 adminpages/advancedsettings.php:359 +#: adminpages/advancedsettings.php:368 adminpages/pagesettings.php:209 +#: adminpages/pagesettings.php:223 adminpages/pagesettings.php:251 +#: adminpages/pagesettings.php:254 adminpages/pagesettings.php:294 +#: adminpages/pagesettings.php:295 adminpages/paymentsettings.php:238 +#: adminpages/paymentsettings.php:250 adminpages/paymentsettings.php:485 +#: adminpages/paymentsettings.php:526 adminpages/paymentsettings.php:532 +#: adminpages/paymentsettings.php:534 adminpages/advancedsettings.php:525 +#: adminpages/pagesettings.php:439 adminpages/paymentsettings.php:297 +#: adminpages/advancedsettings.php:527 +msgid "Save Settings" +msgstr "Einstellungen speichern" + +#: adminpages/discountcodes.php:102 adminpages/discountcodes.php:64 +#: adminpages/discountcodes.php:65 adminpages/discountcodes.php:70 +#: adminpages/discountcodes.php:71 adminpages/discountcodes.php:107 +#: adminpages/discountcodes.php:109 +msgid "Discount code added successfully." +msgstr "Gutscheincode erfolgreich hinzugefügt." + +#: adminpages/discountcodes.php:108 adminpages/discountcodes.php:48 +#: adminpages/discountcodes.php:49 adminpages/discountcodes.php:54 +#: adminpages/discountcodes.php:77 adminpages/discountcodes.php:113 +#: adminpages/discountcodes.php:115 +msgid "Discount code updated successfully." +msgstr "Gutscheincode erfolgreich bearbeitet." + +#: adminpages/discountcodes.php:116 adminpages/discountcodes.php:71 +#: adminpages/discountcodes.php:72 adminpages/discountcodes.php:73 +#: adminpages/discountcodes.php:78 adminpages/discountcodes.php:85 +#: adminpages/discountcodes.php:121 adminpages/discountcodes.php:123 +msgid "Error adding discount code. That code may already be in use." +msgstr "Fehler beim Hinzufügen des Gutscheincodes. Dieser Code wird möglicherweise bereits verwendet." + +#: adminpages/discountcodes.php:120 adminpages/discountcodes.php:55 +#: adminpages/discountcodes.php:56 adminpages/discountcodes.php:61 +#: adminpages/discountcodes.php:89 adminpages/discountcodes.php:125 +#: adminpages/discountcodes.php:127 +msgid "Error updating discount code. That code may already be in use." +msgstr "Fehler beim Bearbeiten des Gutscheincodes. Der Code wird möglicherweise bereits verwendet." + +#: adminpages/discountcodes.php:280 adminpages/discountcodes.php:196 +#: adminpages/discountcodes.php:197 adminpages/discountcodes.php:198 +#: adminpages/discountcodes.php:203 adminpages/discountcodes.php:247 +#: adminpages/discountcodes.php:287 adminpages/discountcodes.php:289 +#, php-format +msgid "Error saving values for the %s level." +msgstr "Fehler beim Speichern der Einstellungen für das %s Paket." + +#: adminpages/discountcodes.php:288 adminpages/discountcodes.php:204 +#: adminpages/discountcodes.php:205 adminpages/discountcodes.php:206 +#: adminpages/discountcodes.php:211 adminpages/discountcodes.php:255 +#: adminpages/discountcodes.php:295 adminpages/discountcodes.php:297 +msgid "There were errors updating the level values: " +msgstr "Es gab Fehler beim aktualisieren der Paket-Einstellungen:" + +#: adminpages/discountcodes.php:328 adminpages/discountcodes.php:234 +#: adminpages/discountcodes.php:237 adminpages/discountcodes.php:238 +#: adminpages/discountcodes.php:239 adminpages/discountcodes.php:244 +#: adminpages/discountcodes.php:288 adminpages/discountcodes.php:335 +#: adminpages/discountcodes.php:337 +#, php-format +msgid "Code %s deleted successfully." +msgstr "Code %s erfolgreich gelöscht." + +#: adminpages/discountcodes.php:333 adminpages/discountcodes.php:239 +#: adminpages/discountcodes.php:242 adminpages/discountcodes.php:243 +#: adminpages/discountcodes.php:244 adminpages/discountcodes.php:249 +#: adminpages/discountcodes.php:293 adminpages/discountcodes.php:340 +#: adminpages/discountcodes.php:342 +msgid "Error deleting discount code. The code was only partially deleted. Please try again." +msgstr "Fehler beim Löschen des Gutscheincodes. Der Code wurde nur teilweise gelöscht. Bitte versuchen Sie es erneut." + +#: adminpages/discountcodes.php:339 adminpages/discountcodes.php:245 +#: adminpages/discountcodes.php:248 adminpages/discountcodes.php:249 +#: adminpages/discountcodes.php:250 adminpages/discountcodes.php:255 +#: adminpages/discountcodes.php:299 adminpages/discountcodes.php:346 +#: adminpages/discountcodes.php:348 +msgid "Error deleting code. Please try again." +msgstr "Fehler beim Löschen des Codes. Bitte versuchen Sie es erneut." + +#: adminpages/discountcodes.php:345 adminpages/discountcodes.php:251 +#: adminpages/discountcodes.php:254 adminpages/discountcodes.php:255 +#: adminpages/discountcodes.php:256 adminpages/discountcodes.php:261 +#: adminpages/discountcodes.php:305 adminpages/discountcodes.php:352 +#: adminpages/discountcodes.php:796 adminpages/discountcodes.php:354 +#: adminpages/discountcodes.php:798 +msgid "Code not found." +msgstr "Code nicht gefunden." + +#: adminpages/discountcodes.php:358 adminpages/discountcodes.php:264 +#: adminpages/discountcodes.php:267 adminpages/discountcodes.php:268 +#: adminpages/discountcodes.php:269 adminpages/discountcodes.php:274 +#: adminpages/discountcodes.php:318 adminpages/discountcodes.php:373 +#: adminpages/discountcodes.php:375 +msgid "Edit Discount Code" +msgstr "Gutscheincode bearbeiten" + +#: adminpages/discountcodes.php:360 adminpages/discountcodes.php:678 +#: adminpages/discountcodes.php:266 adminpages/discountcodes.php:269 +#: adminpages/discountcodes.php:270 adminpages/discountcodes.php:271 +#: adminpages/discountcodes.php:276 adminpages/discountcodes.php:320 +#: adminpages/discountcodes.php:526 adminpages/discountcodes.php:529 +#: adminpages/discountcodes.php:557 adminpages/discountcodes.php:558 +#: adminpages/discountcodes.php:559 adminpages/discountcodes.php:564 +#: adminpages/discountcodes.php:637 adminpages/discountcodes.php:375 +#: adminpages/discountcodes.php:735 adminpages/discountcodes.php:377 +#: adminpages/discountcodes.php:737 +msgid "Add New Discount Code" +msgstr "Neuen Gutscheincode hinzufügen" + +#: adminpages/discountcodes.php:422 adminpages/discountcodes.php:719 +#: adminpages/membershiplevels.php:322 adminpages/membershiplevels.php:663 +#: adminpages/memberslist.php:164 adminpages/orders.php:1231 +#: adminpages/reports/login.php:162 adminpages/templates/orders-email.php:46 +#: adminpages/templates/orders-print.php:75 adminpages/discountcodes.php:306 +#: adminpages/discountcodes.php:309 adminpages/discountcodes.php:310 +#: adminpages/discountcodes.php:311 adminpages/discountcodes.php:316 +#: adminpages/discountcodes.php:381 adminpages/discountcodes.php:547 +#: adminpages/discountcodes.php:557 adminpages/discountcodes.php:585 +#: adminpages/discountcodes.php:586 adminpages/discountcodes.php:587 +#: adminpages/discountcodes.php:592 adminpages/discountcodes.php:665 +#: adminpages/membershiplevels.php:284 adminpages/membershiplevels.php:286 +#: adminpages/membershiplevels.php:288 adminpages/membershiplevels.php:312 +#: adminpages/membershiplevels.php:505 adminpages/membershiplevels.php:511 +#: adminpages/membershiplevels.php:513 adminpages/membershiplevels.php:540 +#: adminpages/membershiplevels.php:541 adminpages/membershiplevels.php:583 +#: adminpages/membershiplevels.php:629 adminpages/membershiplevels.php:631 +#: adminpages/membershiplevels.php:636 adminpages/membershiplevels.php:637 +#: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:653 +#: adminpages/memberslist.php:111 adminpages/memberslist.php:144 +#: adminpages/memberslist.php:154 adminpages/orders.php:597 +#: adminpages/orders.php:900 adminpages/orders.php:910 +#: adminpages/orders.php:937 adminpages/orders.php:966 +#: adminpages/orders.php:1103 adminpages/orders.php:1134 +#: adminpages/orders.php:1140 adminpages/reports/login.php:140 +#: adminpages/reports/login.php:142 adminpages/reports/login.php:158 +#: adminpages/discountcodes.php:444 adminpages/discountcodes.php:783 +#: adminpages/membershiplevels.php:347 adminpages/membershiplevels.php:807 +#: adminpages/orders.php:1333 adminpages/reports/history.php:182 +#: adminpages/reports/login.php:179 adminpages/orders.php:1339 +#: adminpages/discountcodes.php:446 adminpages/discountcodes.php:785 +msgid "ID" +msgstr "ID" + +#: adminpages/discountcodes.php:423 adminpages/orders.php:394 +#: adminpages/discountcodes.php:307 adminpages/discountcodes.php:310 +#: adminpages/discountcodes.php:311 adminpages/discountcodes.php:312 +#: adminpages/discountcodes.php:317 adminpages/discountcodes.php:382 +#: adminpages/orders.php:211 adminpages/orders.php:261 +#: adminpages/orders.php:333 adminpages/orders.php:344 +#: adminpages/orders.php:362 adminpages/orders.php:375 +#: adminpages/orders.php:386 adminpages/discountcodes.php:445 +#: adminpages/orders.php:415 adminpages/orders.php:421 +#: adminpages/discountcodes.php:447 +msgid "This will be generated when you save." +msgstr "Wird beim Speichern automatisch generiert." + +#: adminpages/discountcodes.php:427 adminpages/discountcodes.php:720 +#: adminpages/orders.php:401 adminpages/orders.php:1232 +#: adminpages/discountcodes.php:311 adminpages/discountcodes.php:314 +#: adminpages/discountcodes.php:315 adminpages/discountcodes.php:316 +#: adminpages/discountcodes.php:321 adminpages/discountcodes.php:386 +#: adminpages/discountcodes.php:548 adminpages/discountcodes.php:558 +#: adminpages/discountcodes.php:586 adminpages/discountcodes.php:587 +#: adminpages/discountcodes.php:588 adminpages/discountcodes.php:593 +#: adminpages/discountcodes.php:666 adminpages/orders.php:215 +#: adminpages/orders.php:265 adminpages/orders.php:337 +#: adminpages/orders.php:349 adminpages/orders.php:366 +#: adminpages/orders.php:380 adminpages/orders.php:391 +#: adminpages/orders.php:598 adminpages/orders.php:901 +#: adminpages/orders.php:911 adminpages/orders.php:938 +#: adminpages/orders.php:967 adminpages/orders.php:1104 +#: adminpages/orders.php:1135 adminpages/orders.php:1141 +#: adminpages/dashboard.php:286 adminpages/discountcodes.php:449 +#: adminpages/discountcodes.php:784 adminpages/orders.php:422 +#: adminpages/orders.php:1334 adminpages/dashboard.php:290 +#: adminpages/orders.php:428 adminpages/orders.php:1340 +#: adminpages/discountcodes.php:451 adminpages/discountcodes.php:786 +msgid "Code" +msgstr "Code" + +#: adminpages/discountcodes.php:465 includes/privacy.php:186 +#: adminpages/discountcodes.php:349 adminpages/discountcodes.php:352 +#: adminpages/discountcodes.php:353 adminpages/discountcodes.php:354 +#: adminpages/discountcodes.php:359 adminpages/discountcodes.php:424 +#: adminpages/discountcodes.php:487 adminpages/reports/history.php:34 +#: includes/profile.php:495 adminpages/discountcodes.php:489 +#: includes/profile.php:501 +msgid "Start Date" +msgstr "Start Datum" + +#: adminpages/discountcodes.php:483 +#: classes/gateways/class.pmprogateway_braintree.php:459 +#: classes/gateways/class.pmprogateway_stripe.php:621 pages/billing.php:313 +#: pages/checkout.php:463 adminpages/discountcodes.php:367 +#: adminpages/discountcodes.php:370 adminpages/discountcodes.php:371 +#: adminpages/discountcodes.php:372 adminpages/discountcodes.php:377 +#: adminpages/discountcodes.php:442 +#: classes/gateways/class.pmprogateway_braintree.php:308 +#: classes/gateways/class.pmprogateway_braintree.php:321 +#: classes/gateways/class.pmprogateway_braintree.php:323 +#: classes/gateways/class.pmprogateway_braintree.php:326 +#: classes/gateways/class.pmprogateway_braintree.php:327 +#: classes/gateways/class.pmprogateway_braintree.php:359 +#: classes/gateways/class.pmprogateway_braintree.php:361 +#: classes/gateways/class.pmprogateway_braintree.php:423 +#: classes/gateways/class.pmprogateway_stripe.php:454 +#: classes/gateways/class.pmprogateway_stripe.php:455 +#: classes/gateways/class.pmprogateway_stripe.php:465 +#: classes/gateways/class.pmprogateway_stripe.php:469 +#: classes/gateways/class.pmprogateway_stripe.php:495 +#: classes/gateways/class.pmprogateway_stripe.php:498 +#: classes/gateways/class.pmprogateway_stripe.php:500 +#: classes/gateways/class.pmprogateway_stripe.php:503 +#: classes/gateways/class.pmprogateway_stripe.php:521 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:597 +#: classes/gateways/class.pmprogateway_stripe.php:613 +#: classes/gateways/class.pmprogateway_stripe.php:629 +#: classes/gateways/class.pmprogateway_stripe.php:630 pages/billing.php:249 +#: pages/billing.php:253 pages/billing.php:262 pages/billing.php:265 +#: pages/billing.php:268 pages/billing.php:310 pages/billing.php:316 +#: pages/billing.php:317 pages/billing.php:319 pages/billing.php:342 +#: pages/checkout.php:508 pages/checkout.php:524 pages/checkout.php:525 +#: pages/checkout.php:532 pages/checkout.php:553 pages/checkout.php:562 +#: pages/checkout.php:571 pages/checkout.php:575 pages/checkout.php:582 +#: pages/checkout.php:585 adminpages/discountcodes.php:505 +#: classes/gateways/class.pmprogateway_braintree.php:479 +#: classes/gateways/class.pmprogateway_stripe.php:1289 pages/billing.php:375 +#: pages/checkout.php:393 classes/gateways/class.pmprogateway_stripe.php:1301 +#: adminpages/discountcodes.php:507 +#: classes/gateways/class.pmprogateway_stripe.php:1320 +#: classes/gateways/class.pmprogateway_stripe.php:1326 +msgid "Expiration Date" +msgstr "Ablaufdatum" + +#: adminpages/discountcodes.php:501 adminpages/discountcodes.php:723 +#: adminpages/discountcodes.php:385 adminpages/discountcodes.php:388 +#: adminpages/discountcodes.php:389 adminpages/discountcodes.php:390 +#: adminpages/discountcodes.php:395 adminpages/discountcodes.php:460 +#: adminpages/discountcodes.php:551 adminpages/discountcodes.php:561 +#: adminpages/discountcodes.php:589 adminpages/discountcodes.php:590 +#: adminpages/discountcodes.php:591 adminpages/discountcodes.php:596 +#: adminpages/discountcodes.php:669 adminpages/discountcodes.php:523 +#: adminpages/discountcodes.php:787 adminpages/discountcodes.php:525 +#: adminpages/discountcodes.php:789 +msgid "Uses" +msgstr "Nutzungen" + +#: adminpages/discountcodes.php:504 adminpages/discountcodes.php:388 +#: adminpages/discountcodes.php:391 adminpages/discountcodes.php:392 +#: adminpages/discountcodes.php:393 adminpages/discountcodes.php:398 +#: adminpages/discountcodes.php:463 adminpages/discountcodes.php:526 +#: adminpages/discountcodes.php:528 +msgid "Leave blank for unlimited uses." +msgstr "Für unbeschränkte Anzahl an Nutzungen leer lassen." + +#: adminpages/discountcodes.php:513 adminpages/discountcodes.php:400 +#: adminpages/discountcodes.php:401 adminpages/discountcodes.php:402 +#: adminpages/discountcodes.php:407 adminpages/discountcodes.php:472 +#: adminpages/discountcodes.php:535 adminpages/discountcodes.php:537 +msgid "Which Levels Will This Code Apply To?" +msgstr "Für welche Pakete wird dieser Code angewandt?" + +#: adminpages/discountcodes.php:551 adminpages/membershiplevels.php:375 +#: adminpages/discountcodes.php:427 adminpages/discountcodes.php:430 +#: adminpages/discountcodes.php:431 adminpages/discountcodes.php:432 +#: adminpages/discountcodes.php:437 adminpages/discountcodes.php:510 +#: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:339 +#: adminpages/membershiplevels.php:341 adminpages/membershiplevels.php:342 +#: adminpages/membershiplevels.php:365 adminpages/membershiplevels.php:507 +#: adminpages/membershiplevels.php:513 adminpages/membershiplevels.php:515 +#: adminpages/membershiplevels.php:542 pages/levels.php:14 +#: adminpages/discountcodes.php:574 adminpages/membershiplevels.php:401 +#: adminpages/discountcodes.php:576 +msgid "Initial Payment" +msgstr "Einmal-Zahlung" + +#: adminpages/discountcodes.php:562 adminpages/membershiplevels.php:386 +#: adminpages/discountcodes.php:428 adminpages/discountcodes.php:431 +#: adminpages/discountcodes.php:441 adminpages/discountcodes.php:442 +#: adminpages/discountcodes.php:443 adminpages/discountcodes.php:448 +#: adminpages/discountcodes.php:521 adminpages/membershiplevels.php:338 +#: adminpages/membershiplevels.php:340 adminpages/membershiplevels.php:350 +#: adminpages/membershiplevels.php:352 adminpages/membershiplevels.php:353 +#: adminpages/membershiplevels.php:376 adminpages/discountcodes.php:585 +#: adminpages/membershiplevels.php:412 adminpages/discountcodes.php:587 +msgid "The initial amount collected at registration." +msgstr "Einmal-Zahlung, die bei Anmeldung fällig wird." + +#: adminpages/discountcodes.php:567 adminpages/membershiplevels.php:390 +#: adminpages/discountcodes.php:432 adminpages/discountcodes.php:435 +#: adminpages/discountcodes.php:446 adminpages/discountcodes.php:447 +#: adminpages/discountcodes.php:448 adminpages/discountcodes.php:453 +#: adminpages/discountcodes.php:526 adminpages/membershiplevels.php:342 +#: adminpages/membershiplevels.php:344 adminpages/membershiplevels.php:354 +#: adminpages/membershiplevels.php:356 adminpages/membershiplevels.php:357 +#: adminpages/membershiplevels.php:380 adminpages/discountcodes.php:590 +#: adminpages/membershiplevels.php:417 adminpages/discountcodes.php:592 +msgid "Recurring Subscription" +msgstr "Abo-Mitgliedschaft" + +#: adminpages/discountcodes.php:568 adminpages/membershiplevels.php:391 +#: adminpages/discountcodes.php:433 adminpages/discountcodes.php:436 +#: adminpages/discountcodes.php:447 adminpages/discountcodes.php:448 +#: adminpages/discountcodes.php:449 adminpages/discountcodes.php:454 +#: adminpages/discountcodes.php:527 adminpages/membershiplevels.php:343 +#: adminpages/membershiplevels.php:345 adminpages/membershiplevels.php:355 +#: adminpages/membershiplevels.php:357 adminpages/membershiplevels.php:358 +#: adminpages/membershiplevels.php:381 adminpages/discountcodes.php:591 +#: adminpages/membershiplevels.php:418 adminpages/discountcodes.php:593 +msgid "Check if this level has a recurring subscription payment." +msgstr "Auswählen, wenn dieses Paket eine Abo-Mitgliedschaft haben soll." + +#: adminpages/discountcodes.php:572 adminpages/membershiplevels.php:395 +#: adminpages/discountcodes.php:440 adminpages/discountcodes.php:451 +#: adminpages/discountcodes.php:452 adminpages/discountcodes.php:453 +#: adminpages/discountcodes.php:458 adminpages/discountcodes.php:531 +#: adminpages/membershiplevels.php:347 adminpages/membershiplevels.php:349 +#: adminpages/membershiplevels.php:359 adminpages/membershiplevels.php:361 +#: adminpages/membershiplevels.php:362 adminpages/membershiplevels.php:385 +#: adminpages/discountcodes.php:595 adminpages/membershiplevels.php:422 +#: adminpages/discountcodes.php:597 +msgid "Billing Amount" +msgstr "Gesamtbetrag" + +#: adminpages/discountcodes.php:587 adminpages/discountcodes.php:641 +#: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:511 +#: classes/gateways/class.pmprogateway_stripe.php:679 +#: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466 +#: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468 +#: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492 +#: adminpages/discountcodes.php:520 adminpages/discountcodes.php:521 +#: adminpages/discountcodes.php:522 adminpages/discountcodes.php:527 +#: adminpages/discountcodes.php:546 adminpages/discountcodes.php:600 +#: adminpages/membershiplevels.php:353 adminpages/membershiplevels.php:355 +#: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376 +#: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400 +#: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476 +#: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479 +#: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501 +#: classes/gateways/class.pmprogateway_stripe.php:521 +#: classes/gateways/class.pmprogateway_stripe.php:522 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:536 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:566 +#: classes/gateways/class.pmprogateway_stripe.php:567 +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:599 +#: classes/gateways/class.pmprogateway_stripe.php:637 +#: classes/gateways/class.pmprogateway_stripe.php:664 +#: classes/gateways/class.pmprogateway_stripe.php:671 +#: classes/gateways/class.pmprogateway_stripe.php:687 +#: classes/gateways/class.pmprogateway_stripe.php:688 +#: adminpages/discountcodes.php:610 adminpages/discountcodes.php:697 +#: adminpages/membershiplevels.php:437 adminpages/membershiplevels.php:580 +#: classes/gateways/class.pmprogateway_stripe.php:1332 +#: classes/gateways/class.pmprogateway_stripe.php:1344 +#: adminpages/discountcodes.php:612 adminpages/discountcodes.php:699 +#: classes/gateways/class.pmprogateway_stripe.php:1363 +#: classes/gateways/class.pmprogateway_stripe.php:1369 +msgid "Day(s)" +msgstr "Tag(e)" + +#: adminpages/discountcodes.php:587 adminpages/discountcodes.php:641 +#: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:511 +#: classes/gateways/class.pmprogateway_stripe.php:679 +#: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466 +#: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468 +#: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492 +#: adminpages/discountcodes.php:520 adminpages/discountcodes.php:521 +#: adminpages/discountcodes.php:522 adminpages/discountcodes.php:527 +#: adminpages/discountcodes.php:546 adminpages/discountcodes.php:600 +#: adminpages/membershiplevels.php:353 adminpages/membershiplevels.php:355 +#: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376 +#: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400 +#: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476 +#: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479 +#: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501 +#: classes/gateways/class.pmprogateway_stripe.php:521 +#: classes/gateways/class.pmprogateway_stripe.php:522 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:536 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:566 +#: classes/gateways/class.pmprogateway_stripe.php:567 +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:599 +#: classes/gateways/class.pmprogateway_stripe.php:637 +#: classes/gateways/class.pmprogateway_stripe.php:664 +#: classes/gateways/class.pmprogateway_stripe.php:671 +#: classes/gateways/class.pmprogateway_stripe.php:687 +#: classes/gateways/class.pmprogateway_stripe.php:688 +#: adminpages/discountcodes.php:610 adminpages/discountcodes.php:697 +#: adminpages/membershiplevels.php:437 adminpages/membershiplevels.php:580 +#: classes/gateways/class.pmprogateway_stripe.php:1334 +#: classes/gateways/class.pmprogateway_stripe.php:1346 +#: adminpages/discountcodes.php:612 adminpages/discountcodes.php:699 +#: classes/gateways/class.pmprogateway_stripe.php:1365 +#: classes/gateways/class.pmprogateway_stripe.php:1371 +msgid "Month(s)" +msgstr "Monat(e)" + +#: adminpages/discountcodes.php:587 adminpages/discountcodes.php:641 +#: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:511 +#: classes/gateways/class.pmprogateway_stripe.php:679 +#: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466 +#: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468 +#: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492 +#: adminpages/discountcodes.php:520 adminpages/discountcodes.php:521 +#: adminpages/discountcodes.php:522 adminpages/discountcodes.php:527 +#: adminpages/discountcodes.php:546 adminpages/discountcodes.php:600 +#: adminpages/membershiplevels.php:353 adminpages/membershiplevels.php:355 +#: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376 +#: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400 +#: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476 +#: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479 +#: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501 +#: classes/gateways/class.pmprogateway_stripe.php:521 +#: classes/gateways/class.pmprogateway_stripe.php:522 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:536 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:566 +#: classes/gateways/class.pmprogateway_stripe.php:567 +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:599 +#: classes/gateways/class.pmprogateway_stripe.php:637 +#: classes/gateways/class.pmprogateway_stripe.php:664 +#: classes/gateways/class.pmprogateway_stripe.php:671 +#: classes/gateways/class.pmprogateway_stripe.php:687 +#: classes/gateways/class.pmprogateway_stripe.php:688 +#: adminpages/discountcodes.php:610 adminpages/discountcodes.php:697 +#: adminpages/membershiplevels.php:437 adminpages/membershiplevels.php:580 +#: classes/gateways/class.pmprogateway_stripe.php:1333 +#: classes/gateways/class.pmprogateway_stripe.php:1345 +#: adminpages/discountcodes.php:612 adminpages/discountcodes.php:699 +#: classes/gateways/class.pmprogateway_stripe.php:1364 +#: classes/gateways/class.pmprogateway_stripe.php:1370 +msgid "Week(s)" +msgstr "Woche(n)" + +#: adminpages/discountcodes.php:587 adminpages/discountcodes.php:641 +#: adminpages/membershiplevels.php:410 adminpages/membershiplevels.php:511 +#: classes/gateways/class.pmprogateway_stripe.php:679 +#: adminpages/discountcodes.php:446 adminpages/discountcodes.php:466 +#: adminpages/discountcodes.php:467 adminpages/discountcodes.php:468 +#: adminpages/discountcodes.php:473 adminpages/discountcodes.php:492 +#: adminpages/discountcodes.php:520 adminpages/discountcodes.php:521 +#: adminpages/discountcodes.php:522 adminpages/discountcodes.php:527 +#: adminpages/discountcodes.php:546 adminpages/discountcodes.php:600 +#: adminpages/membershiplevels.php:353 adminpages/membershiplevels.php:355 +#: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:376 +#: adminpages/membershiplevels.php:377 adminpages/membershiplevels.php:400 +#: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:476 +#: adminpages/membershiplevels.php:477 adminpages/membershiplevels.php:479 +#: adminpages/membershiplevels.php:480 adminpages/membershiplevels.php:501 +#: classes/gateways/class.pmprogateway_stripe.php:521 +#: classes/gateways/class.pmprogateway_stripe.php:522 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:536 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:566 +#: classes/gateways/class.pmprogateway_stripe.php:567 +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:599 +#: classes/gateways/class.pmprogateway_stripe.php:637 +#: classes/gateways/class.pmprogateway_stripe.php:664 +#: classes/gateways/class.pmprogateway_stripe.php:671 +#: classes/gateways/class.pmprogateway_stripe.php:687 +#: classes/gateways/class.pmprogateway_stripe.php:688 +#: adminpages/discountcodes.php:610 adminpages/discountcodes.php:697 +#: adminpages/membershiplevels.php:437 adminpages/membershiplevels.php:580 +#: classes/gateways/class.pmprogateway_stripe.php:1335 +#: classes/gateways/class.pmprogateway_stripe.php:1347 +#: adminpages/discountcodes.php:612 adminpages/discountcodes.php:699 +#: classes/gateways/class.pmprogateway_stripe.php:1366 +#: classes/gateways/class.pmprogateway_stripe.php:1372 +msgid "Year(s)" +msgstr "Jahr(e)" + +#: adminpages/discountcodes.php:595 adminpages/membershiplevels.php:419 +#: adminpages/discountcodes.php:451 adminpages/discountcodes.php:454 +#: adminpages/discountcodes.php:474 adminpages/discountcodes.php:475 +#: adminpages/discountcodes.php:476 adminpages/discountcodes.php:481 +#: adminpages/discountcodes.php:554 adminpages/membershiplevels.php:362 +#: adminpages/membershiplevels.php:364 adminpages/membershiplevels.php:383 +#: adminpages/membershiplevels.php:385 adminpages/membershiplevels.php:386 +#: adminpages/membershiplevels.php:409 adminpages/discountcodes.php:618 +#: adminpages/membershiplevels.php:446 adminpages/discountcodes.php:620 +msgid "The amount to be billed one cycle after the initial payment." +msgstr "Der Betrag, der einen Zyklus nach der ersten Zahlung in Rechnung gestellt wird." + +#: adminpages/discountcodes.php:600 adminpages/membershiplevels.php:435 +#: adminpages/discountcodes.php:456 adminpages/discountcodes.php:459 +#: adminpages/discountcodes.php:479 adminpages/discountcodes.php:480 +#: adminpages/discountcodes.php:481 adminpages/discountcodes.php:486 +#: adminpages/discountcodes.php:559 adminpages/membershiplevels.php:380 +#: adminpages/membershiplevels.php:382 adminpages/membershiplevels.php:401 +#: adminpages/membershiplevels.php:403 adminpages/membershiplevels.php:404 +#: adminpages/membershiplevels.php:425 adminpages/discountcodes.php:628 +#: adminpages/membershiplevels.php:465 adminpages/discountcodes.php:630 +msgid "Billing Cycle Limit" +msgstr "Limit der Abrechnungszyklen" + +#: adminpages/discountcodes.php:603 adminpages/membershiplevels.php:439 +#: adminpages/discountcodes.php:459 adminpages/discountcodes.php:462 +#: adminpages/discountcodes.php:482 adminpages/discountcodes.php:483 +#: adminpages/discountcodes.php:484 adminpages/discountcodes.php:489 +#: adminpages/discountcodes.php:562 adminpages/membershiplevels.php:384 +#: adminpages/membershiplevels.php:386 adminpages/membershiplevels.php:405 +#: adminpages/membershiplevels.php:407 adminpages/membershiplevels.php:408 +#: adminpages/membershiplevels.php:429 adminpages/discountcodes.php:632 +#: adminpages/membershiplevels.php:469 adminpages/discountcodes.php:634 +msgid "The total 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." +msgstr "Die gesamte Anzahl an Zahlungszyklen für dieses Paket, inklusive der Test-Periode (falls zutreffend) aber ohne die Einmal-Zahlung. Auf Null setzen, falls der Zugang unbegrenzt ist." + +#: adminpages/discountcodes.php:608 adminpages/membershiplevels.php:448 +#: adminpages/discountcodes.php:464 adminpages/discountcodes.php:467 +#: adminpages/discountcodes.php:487 adminpages/discountcodes.php:488 +#: adminpages/discountcodes.php:489 adminpages/discountcodes.php:494 +#: adminpages/discountcodes.php:567 adminpages/membershiplevels.php:393 +#: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:414 +#: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:417 +#: adminpages/membershiplevels.php:438 adminpages/discountcodes.php:651 +#: adminpages/membershiplevels.php:488 adminpages/discountcodes.php:653 +msgid "Custom Trial" +msgstr "Testphase" + +#: adminpages/discountcodes.php:609 adminpages/membershiplevels.php:450 +#: adminpages/discountcodes.php:465 adminpages/discountcodes.php:468 +#: adminpages/discountcodes.php:488 adminpages/discountcodes.php:489 +#: adminpages/discountcodes.php:490 adminpages/discountcodes.php:495 +#: adminpages/discountcodes.php:568 adminpages/membershiplevels.php:394 +#: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:397 +#: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:418 +#: adminpages/membershiplevels.php:419 adminpages/membershiplevels.php:440 +#: adminpages/discountcodes.php:653 adminpages/membershiplevels.php:490 +#: adminpages/discountcodes.php:655 +msgid "Check to add a custom trial period." +msgstr "Aktivieren, um eine Testphase hinzuzufügen." + +#: adminpages/discountcodes.php:613 adminpages/membershiplevels.php:459 +#: adminpages/discountcodes.php:469 adminpages/discountcodes.php:472 +#: adminpages/discountcodes.php:492 adminpages/discountcodes.php:493 +#: adminpages/discountcodes.php:494 adminpages/discountcodes.php:499 +#: adminpages/discountcodes.php:572 adminpages/membershiplevels.php:398 +#: adminpages/membershiplevels.php:404 adminpages/membershiplevels.php:406 +#: adminpages/membershiplevels.php:425 adminpages/membershiplevels.php:427 +#: adminpages/membershiplevels.php:428 adminpages/membershiplevels.php:449 +#: adminpages/discountcodes.php:661 adminpages/membershiplevels.php:510 +#: adminpages/discountcodes.php:663 +msgid "Trial Billing Amount" +msgstr "Betrag für Testphase" + +#: adminpages/discountcodes.php:624 adminpages/membershiplevels.php:470 +#: adminpages/discountcodes.php:472 adminpages/discountcodes.php:475 +#: adminpages/discountcodes.php:503 adminpages/discountcodes.php:504 +#: adminpages/discountcodes.php:505 adminpages/discountcodes.php:510 +#: adminpages/discountcodes.php:583 adminpages/membershiplevels.php:401 +#: adminpages/membershiplevels.php:407 adminpages/membershiplevels.php:409 +#: adminpages/membershiplevels.php:436 adminpages/membershiplevels.php:438 +#: adminpages/membershiplevels.php:439 adminpages/membershiplevels.php:460 +#: adminpages/discountcodes.php:672 adminpages/membershiplevels.php:521 +#: adminpages/discountcodes.php:674 +msgid "for the first" +msgstr "für die ersten" + +#: adminpages/discountcodes.php:626 adminpages/membershiplevels.php:472 +#: adminpages/discountcodes.php:474 adminpages/discountcodes.php:477 +#: adminpages/discountcodes.php:505 adminpages/discountcodes.php:506 +#: adminpages/discountcodes.php:507 adminpages/discountcodes.php:512 +#: adminpages/discountcodes.php:585 adminpages/membershiplevels.php:403 +#: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:411 +#: adminpages/membershiplevels.php:438 adminpages/membershiplevels.php:440 +#: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:462 +#: adminpages/discountcodes.php:674 adminpages/membershiplevels.php:523 +#: adminpages/discountcodes.php:676 +msgid "subscription payments" +msgstr "Abonnement Zahlungen" + +#: adminpages/discountcodes.php:631 adminpages/membershiplevels.php:501 +#: adminpages/discountcodes.php:479 adminpages/discountcodes.php:482 +#: adminpages/discountcodes.php:510 adminpages/discountcodes.php:511 +#: adminpages/discountcodes.php:512 adminpages/discountcodes.php:517 +#: adminpages/discountcodes.php:590 adminpages/membershiplevels.php:431 +#: adminpages/membershiplevels.php:437 adminpages/membershiplevels.php:439 +#: adminpages/membershiplevels.php:466 adminpages/membershiplevels.php:467 +#: adminpages/membershiplevels.php:469 adminpages/membershiplevels.php:470 +#: adminpages/membershiplevels.php:491 adminpages/discountcodes.php:686 +#: adminpages/membershiplevels.php:559 adminpages/discountcodes.php:688 +msgid "Membership Expiration" +msgstr "Zugang läuft ab" + +#: adminpages/discountcodes.php:632 adminpages/membershiplevels.php:502 +#: adminpages/discountcodes.php:483 adminpages/discountcodes.php:511 +#: adminpages/discountcodes.php:512 adminpages/discountcodes.php:513 +#: adminpages/discountcodes.php:518 adminpages/discountcodes.php:591 +#: adminpages/membershiplevels.php:432 adminpages/membershiplevels.php:438 +#: adminpages/membershiplevels.php:440 adminpages/membershiplevels.php:467 +#: adminpages/membershiplevels.php:468 adminpages/membershiplevels.php:470 +#: adminpages/membershiplevels.php:471 adminpages/membershiplevels.php:492 +#: adminpages/discountcodes.php:687 adminpages/membershiplevels.php:560 +#: adminpages/discountcodes.php:689 +msgid "Check this to set when membership access expires." +msgstr "Wählen Sie diese Option, wenn der Zugang ablaufen soll." + +#: adminpages/discountcodes.php:636 adminpages/membershiplevels.php:506 +#: adminpages/discountcodes.php:484 adminpages/discountcodes.php:487 +#: adminpages/discountcodes.php:515 adminpages/discountcodes.php:516 +#: adminpages/discountcodes.php:517 adminpages/discountcodes.php:522 +#: adminpages/discountcodes.php:595 adminpages/membershiplevels.php:436 +#: adminpages/membershiplevels.php:442 adminpages/membershiplevels.php:444 +#: adminpages/membershiplevels.php:471 adminpages/membershiplevels.php:472 +#: adminpages/membershiplevels.php:474 adminpages/membershiplevels.php:475 +#: adminpages/membershiplevels.php:496 adminpages/discountcodes.php:691 +#: adminpages/membershiplevels.php:575 pages/confirmation.php:140 +#: adminpages/discountcodes.php:693 +msgid "Expires In" +msgstr "Läuft ab in" + +#: adminpages/discountcodes.php:649 adminpages/membershiplevels.php:519 +#: adminpages/discountcodes.php:500 adminpages/discountcodes.php:528 +#: adminpages/discountcodes.php:529 adminpages/discountcodes.php:530 +#: adminpages/discountcodes.php:535 adminpages/discountcodes.php:608 +#: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:455 +#: adminpages/membershiplevels.php:457 adminpages/membershiplevels.php:484 +#: adminpages/membershiplevels.php:485 adminpages/membershiplevels.php:487 +#: adminpages/membershiplevels.php:488 adminpages/membershiplevels.php:509 +#: adminpages/discountcodes.php:707 adminpages/membershiplevels.php:586 +#: adminpages/discountcodes.php:709 +msgid "Set the duration of membership access. Note that the any future payments (recurring subscription, if any) will be cancelled when the membership expires." +msgstr " Dauer des Zugangs bestimmen. Beachten Sie, dass zukünftige Zahlungen (Abo-Zahlungen, falls welche anfallen) storniert werden, wenn der Zugang abläuft." + +#: adminpages/discountcodes.php:677 adminpages/discountcodes.php:525 +#: adminpages/discountcodes.php:528 adminpages/discountcodes.php:556 +#: adminpages/discountcodes.php:557 adminpages/discountcodes.php:558 +#: adminpages/discountcodes.php:563 adminpages/discountcodes.php:636 +#: adminpages/discountcodes.php:734 adminpages/discountcodes.php:736 +msgid "Memberships Discount Codes" +msgstr "Mitgliedschaft Gutscheincodes" + +#: adminpages/discountcodes.php:700 adminpages/discountcodes.php:766 +#: adminpages/discountcodes.php:768 +#, php-format +msgid "%d discount codes found." +msgstr "%d Gutscheincodes gefunden." + +#: adminpages/discountcodes.php:707 adminpages/discountcodes.php:535 +#: adminpages/discountcodes.php:538 adminpages/discountcodes.php:566 +#: adminpages/discountcodes.php:567 adminpages/discountcodes.php:568 +#: adminpages/discountcodes.php:573 adminpages/discountcodes.php:646 +#: adminpages/discountcodes.php:771 adminpages/discountcodes.php:773 +msgid "Search Discount Codes" +msgstr "Gutscheincodes durchsuchen" + +#: adminpages/discountcodes.php:710 adminpages/reports/login.php:103 +#: adminpages/discountcodes.php:538 adminpages/discountcodes.php:541 +#: adminpages/discountcodes.php:569 adminpages/discountcodes.php:570 +#: adminpages/discountcodes.php:571 adminpages/discountcodes.php:576 +#: adminpages/discountcodes.php:649 adminpages/reports/login.php:81 +#: adminpages/reports/login.php:83 adminpages/reports/login.php:99 +#: adminpages/discountcodes.php:774 adminpages/discountcodes.php:776 +msgid "Search" +msgstr "Suchen" + +#: adminpages/discountcodes.php:721 adminpages/discountcodes.php:549 +#: adminpages/discountcodes.php:559 adminpages/discountcodes.php:587 +#: adminpages/discountcodes.php:588 adminpages/discountcodes.php:589 +#: adminpages/discountcodes.php:594 adminpages/discountcodes.php:667 +#: adminpages/discountcodes.php:785 adminpages/discountcodes.php:787 +msgid "Starts" +msgstr "Beginnt" + +#: adminpages/discountcodes.php:722 adminpages/memberslist.php:183 +#: adminpages/reports/login.php:167 includes/profile.php:122 +#: adminpages/discountcodes.php:550 adminpages/discountcodes.php:560 +#: adminpages/discountcodes.php:588 adminpages/discountcodes.php:589 +#: adminpages/discountcodes.php:590 adminpages/discountcodes.php:595 +#: adminpages/discountcodes.php:668 adminpages/memberslist.php:121 +#: adminpages/memberslist.php:159 adminpages/memberslist.php:169 +#: adminpages/memberslist.php:179 adminpages/reports/login.php:145 +#: adminpages/reports/login.php:147 adminpages/reports/login.php:163 +#: includes/profile.php:98 includes/profile.php:102 includes/profile.php:107 +#: includes/profile.php:114 includes/profile.php:118 includes/profile.php:120 +#: adminpages/dashboard.php:222 adminpages/discountcodes.php:786 +#: adminpages/reports/history.php:187 adminpages/reports/login.php:184 +#: includes/profile.php:89 adminpages/dashboard.php:226 +#: adminpages/discountcodes.php:788 +msgid "Expires" +msgstr "Endet" + +#: adminpages/discountcodes.php:724 adminpages/discountcodes.php:552 +#: adminpages/discountcodes.php:562 adminpages/discountcodes.php:590 +#: adminpages/discountcodes.php:591 adminpages/discountcodes.php:592 +#: adminpages/discountcodes.php:597 adminpages/discountcodes.php:670 +#: adminpages/admin_header.php:253 adminpages/discountcodes.php:788 +#: adminpages/discountcodes.php:790 +msgid "Levels" +msgstr "Pakete" + +#: adminpages/discountcodes.php:736 adminpages/discountcodes.php:570 +#: adminpages/discountcodes.php:574 adminpages/discountcodes.php:602 +#: adminpages/discountcodes.php:603 adminpages/discountcodes.php:604 +#: adminpages/discountcodes.php:609 adminpages/discountcodes.php:682 +msgid "Create your first discount code now" +msgstr "Erstellen Sie Ihren ersten Gutscheincode" + +#: adminpages/discountcodes.php:736 adminpages/discountcodes.php:570 +#: adminpages/discountcodes.php:574 adminpages/discountcodes.php:602 +#: adminpages/discountcodes.php:603 adminpages/discountcodes.php:604 +#: adminpages/discountcodes.php:609 adminpages/discountcodes.php:682 +msgid "Discount codes allow you to offer your memberships at discounted prices to select customers." +msgstr "Gutscheincodes erlauben Ihnen, Zugänge zu günstigeren Preisen an ausgewählte Kunden zu vergeben." + +#: adminpages/discountcodes.php:789 adminpages/membershiplevels.php:696 +#: adminpages/orders.php:1360 adminpages/discountcodes.php:614 +#: adminpages/discountcodes.php:619 adminpages/discountcodes.php:647 +#: adminpages/discountcodes.php:648 adminpages/discountcodes.php:649 +#: adminpages/discountcodes.php:650 adminpages/discountcodes.php:655 +#: adminpages/discountcodes.php:735 adminpages/membershiplevels.php:564 +#: adminpages/membershiplevels.php:570 adminpages/membershiplevels.php:572 +#: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:599 +#: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662 +#: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669 +#: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674 +#: adminpages/membershiplevels.php:686 adminpages/orders.php:658 +#: adminpages/orders.php:961 adminpages/orders.php:979 +#: adminpages/orders.php:989 adminpages/orders.php:992 +#: adminpages/orders.php:1021 adminpages/orders.php:1050 +#: adminpages/orders.php:1205 adminpages/orders.php:1239 +#: adminpages/orders.php:1245 adminpages/orders.php:1488 +#: adminpages/orders.php:1565 adminpages/orders.php:1564 +msgid "edit" +msgstr "bearbeiten" + +#. translators: %s is the Discount Code. +#: adminpages/discountcodes.php:792 adminpages/discountcodes.php:617 +#: adminpages/discountcodes.php:622 adminpages/discountcodes.php:650 +#: adminpages/discountcodes.php:651 adminpages/discountcodes.php:652 +#: adminpages/discountcodes.php:653 adminpages/discountcodes.php:658 +#: adminpages/discountcodes.php:738 adminpages/discountcodes.php:816 +#: adminpages/discountcodes.php:813 adminpages/discountcodes.php:815 +#, php-format +msgid "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." +msgstr "Sind Sie sicher, dass Sie den %s Gutscheincode löschen wollen? Die Mitgliedschaften für bestehende Kunden wird nicht verändert, aber neue Kunden werden diesen Code nicht mehr nutzen können." + +#: adminpages/discountcodes.php:792 adminpages/membershiplevels.php:696 +#: adminpages/orders.php:1366 adminpages/discountcodes.php:617 +#: adminpages/discountcodes.php:622 adminpages/discountcodes.php:650 +#: adminpages/discountcodes.php:651 adminpages/discountcodes.php:652 +#: adminpages/discountcodes.php:653 adminpages/discountcodes.php:658 +#: adminpages/discountcodes.php:738 adminpages/membershiplevels.php:566 +#: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:574 +#: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:601 +#: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662 +#: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669 +#: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674 +#: adminpages/membershiplevels.php:686 adminpages/orders.php:664 +#: adminpages/orders.php:967 adminpages/orders.php:985 +#: adminpages/orders.php:995 adminpages/orders.php:998 +#: adminpages/orders.php:1027 adminpages/orders.php:1056 +#: adminpages/orders.php:1211 adminpages/orders.php:1245 +#: adminpages/orders.php:1251 +msgid "delete" +msgstr "löschen" + +#: adminpages/emailsettings.php:79 includes/adminpages.php:51 +#: includes/adminpages.php:137 adminpages/emailsettings.php:60 +#: adminpages/emailsettings.php:69 includes/adminpages.php:12 +#: includes/adminpages.php:50 includes/adminpages.php:59 +#: includes/adminpages.php:121 includes/adminpages.php:128 +#: includes/adminpages.php:132 adminpages/admin_header.php:269 +#: adminpages/emailsettings.php:85 includes/adminpages.php:71 +msgid "Email Settings" +msgstr "E-Mail Einstellungen" + +#: adminpages/emailsettings.php:80 adminpages/emailsettings.php:61 +#: adminpages/emailsettings.php:70 adminpages/emailsettings.php:88 +msgid "By default, system generated emails are sent from wordpress@yourdomain.com. You can update this from address using the fields below." +msgstr "wordpress@yourdomain.com wird als Standard als Absender für vom System verschickte E-Mails verwendet. Sie können diese E-Mail Adresse über die unten stehenden Felder ändern." + +#: adminpages/emailsettings.php:82 +msgid "To modify the appearance of system generated emails, add the files email_header.html and email_footer.html to your theme's directory. This will modify both the WordPress default messages as well as messages generated by Paid Memberships Pro. Click here to learn more about Paid Memberships Pro emails." +msgstr "Um das Design von system-generierten E-Mails anzupassen, fügen Sie die Dateien email_header.html und email_footer.html Ihrem Theme-Ordner hinzu. Damit werden sowohl die Wordpress-Standard-Nachrichten, als auch die von Paid Memberships Pro generierten Nachrichten angepasst. Klicken Sie hier um mehr über Paid Memberships Pro emails zu erfahren." + +#: adminpages/emailsettings.php:88 adminpages/emailsettings.php:69 +#: adminpages/emailsettings.php:78 adminpages/emailsettings.php:94 +msgid "From Email" +msgstr "Von E-Mail" + +#: adminpages/emailsettings.php:96 adminpages/emailsettings.php:77 +#: adminpages/emailsettings.php:86 adminpages/emailsettings.php:102 +msgid "From Name" +msgstr "Von Name" + +#: adminpages/emailsettings.php:104 adminpages/emailsettings.php:94 +#: adminpages/emailsettings.php:110 +msgid "Only Filter PMPro Emails?" +msgstr "Nur PMPro E-Mails filtern?" + +#: adminpages/emailsettings.php:108 adminpages/emailsettings.php:98 +#: adminpages/emailsettings.php:114 +#, php-format +msgid "If unchecked, all emails from \"WordPress <%s>\" will be filtered to use the above settings." +msgstr "Wenn deaktiviert werden alle E-Mails von \"WordPress <%s>\" gefiltert, um die obigen Einstellungen zu verwenden." + +#: adminpages/emailsettings.php:125 adminpages/emailsettings.php:86 +#: adminpages/emailsettings.php:104 adminpages/emailsettings.php:115 +msgid "Send the site admin emails" +msgstr "E-Mails an den Admin senden" + +#: adminpages/emailsettings.php:131 adminpages/emailsettings.php:92 +#: adminpages/emailsettings.php:110 adminpages/emailsettings.php:121 +msgid "Checkout" +msgstr "Buchen" + +#: adminpages/emailsettings.php:135 adminpages/emailsettings.php:96 +#: adminpages/emailsettings.php:114 adminpages/emailsettings.php:125 +msgid "when a member checks out." +msgstr "wenn ein Kunde die Anmeldung abschließt." + +#: adminpages/emailsettings.php:140 adminpages/emailsettings.php:101 +#: adminpages/emailsettings.php:119 adminpages/emailsettings.php:130 +msgid "Admin Changes" +msgstr "Admin Änderungen" + +#: adminpages/emailsettings.php:144 adminpages/emailsettings.php:105 +#: adminpages/emailsettings.php:123 adminpages/emailsettings.php:134 +msgid "when an admin changes a user's membership level through the dashboard." +msgstr "wenn ein Admin über das Dashboard das Paket eines Kunden ändert." + +#: adminpages/emailsettings.php:149 adminpages/emailsettings.php:110 +#: adminpages/emailsettings.php:128 adminpages/emailsettings.php:139 +msgid "Cancellation" +msgstr "Stornierung" + +#: adminpages/emailsettings.php:153 adminpages/emailsettings.php:114 +#: adminpages/emailsettings.php:132 adminpages/emailsettings.php:143 +msgid "when a user cancels his or her account." +msgstr "wenn ein Benutzer sein Konto storniert." + +#: adminpages/emailsettings.php:158 adminpages/emailsettings.php:119 +#: adminpages/emailsettings.php:137 adminpages/emailsettings.php:148 +msgid "Bill Updates" +msgstr "Zahlungs-Updates" + +#: adminpages/emailsettings.php:162 adminpages/emailsettings.php:123 +#: adminpages/emailsettings.php:141 adminpages/emailsettings.php:152 +msgid "when a user updates his or her billing information." +msgstr "wenn ein Benutzer seine Zahlungsinformationen aktualisiert." + +#: adminpages/emailsettings.php:168 adminpages/emailsettings.php:129 +#: adminpages/emailsettings.php:147 adminpages/emailsettings.php:158 +#: adminpages/emailsettings.php:162 +msgid "Send members emails" +msgstr "E-Mails an Mitglieder versenden" + +#: adminpages/emailsettings.php:174 adminpages/emailsettings.php:135 +#: adminpages/emailsettings.php:153 adminpages/emailsettings.php:164 +msgid "New Users" +msgstr "Neue Benutzer" + +#: adminpages/emailsettings.php:178 adminpages/emailsettings.php:139 +#: adminpages/emailsettings.php:157 adminpages/emailsettings.php:168 +msgid "Default WP notification email. (Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout.)" +msgstr "Standard WP Benachrichtigungs E-Mail. (Empfohlen: nicht auswählen. Kunden bekommen trotzdem eine E-Mail Bestätigung von PMPro nach dem Checkout)" + +#: adminpages/membershiplevels.php:146 adminpages/membershiplevels.php:137 +#: adminpages/membershiplevels.php:141 adminpages/membershiplevels.php:143 +#: adminpages/membershiplevels.php:150 +msgid "Membership level added successfully." +msgstr "Paket erfolgreich hinzugefügt." + +#: adminpages/membershiplevels.php:149 adminpages/membershiplevels.php:140 +#: adminpages/membershiplevels.php:146 adminpages/membershiplevels.php:148 +#: adminpages/membershiplevels.php:153 +msgid "Error adding membership level." +msgstr "Fehler beim Hinzfügen eines Pakets." + +#: adminpages/membershiplevels.php:157 adminpages/membershiplevels.php:118 +#: adminpages/membershiplevels.php:120 adminpages/membershiplevels.php:148 +#: adminpages/membershiplevels.php:161 +msgid "Membership level updated successfully." +msgstr "Paket erfolgreich bearbeitet." + +#: adminpages/membershiplevels.php:161 adminpages/membershiplevels.php:124 +#: adminpages/membershiplevels.php:126 adminpages/membershiplevels.php:152 +#: adminpages/membershiplevels.php:164 +msgid "Error updating membership level." +msgstr "Fehler beim bearbeiten des Pakets." + +#: adminpages/membershiplevels.php:202 adminpages/membershiplevels.php:179 +#: adminpages/membershiplevels.php:181 adminpages/membershiplevels.php:183 +#: adminpages/membershiplevels.php:193 adminpages/membershiplevels.php:219 +#: classes/class-pmpro-levels.php:232 +#, php-format +msgid "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." +msgstr "Es gab einen Fehler beim Stornieren der Mitgliedschaft für den Benutzer mit der ID=%d. Bitte checken Sie die Daten bei Ihrem Zahlungsdienstleister um zu überprüfen, ob die Mitgliedschaft noch aktiv ist." + +# Da keine gesetzlichen Kriterien für Rechnungen erfüllt werden Rechnung in Zahlungsbestätigung umbenannt. +#: adminpages/membershiplevels.php:210 adminpages/membershiplevels.php:182 +#: adminpages/membershiplevels.php:184 adminpages/membershiplevels.php:186 +#: adminpages/membershiplevels.php:201 adminpages/membershiplevels.php:227 +#: classes/class-pmpro-levels.php:240 +msgid "Last Invoice" +msgstr "Letzte Rechnung" + +#: adminpages/membershiplevels.php:227 adminpages/membershiplevels.php:196 +#: adminpages/membershiplevels.php:198 adminpages/membershiplevels.php:200 +#: adminpages/membershiplevels.php:218 adminpages/membershiplevels.php:244 +msgid "Membership level deleted successfully." +msgstr "Paket erfolgreich gelöscht." + +#: adminpages/membershiplevels.php:230 adminpages/membershiplevels.php:235 +#: adminpages/membershiplevels.php:201 adminpages/membershiplevels.php:203 +#: adminpages/membershiplevels.php:205 adminpages/membershiplevels.php:207 +#: adminpages/membershiplevels.php:209 adminpages/membershiplevels.php:211 +#: adminpages/membershiplevels.php:221 adminpages/membershiplevels.php:226 +#: adminpages/membershiplevels.php:247 adminpages/membershiplevels.php:252 +msgid "Error deleting membership level." +msgstr "Fehler beim Löschen des Pakets." + +#: adminpages/membershiplevels.php:249 adminpages/membershiplevels.php:222 +#: adminpages/membershiplevels.php:224 adminpages/membershiplevels.php:226 +#: adminpages/membershiplevels.php:240 adminpages/membershiplevels.php:266 +msgid "Edit Membership Level" +msgstr "Paket bearbeiten" + +#: adminpages/membershiplevels.php:251 adminpages/membershiplevels.php:224 +#: adminpages/membershiplevels.php:226 adminpages/membershiplevels.php:228 +#: adminpages/membershiplevels.php:242 adminpages/membershiplevels.php:268 +msgid "Add New Membership Level" +msgstr "Neues Paket hinzufügen" + +#: adminpages/membershiplevels.php:329 adminpages/membershiplevels.php:664 +#: adminpages/reports/login.php:164 adminpages/membershiplevels.php:291 +#: adminpages/membershiplevels.php:293 adminpages/membershiplevels.php:295 +#: adminpages/membershiplevels.php:319 adminpages/membershiplevels.php:506 +#: adminpages/membershiplevels.php:512 adminpages/membershiplevels.php:514 +#: adminpages/membershiplevels.php:541 adminpages/membershiplevels.php:542 +#: adminpages/membershiplevels.php:584 adminpages/membershiplevels.php:630 +#: adminpages/membershiplevels.php:632 adminpages/membershiplevels.php:637 +#: adminpages/membershiplevels.php:638 adminpages/membershiplevels.php:642 +#: adminpages/membershiplevels.php:654 adminpages/reports/login.php:142 +#: adminpages/reports/login.php:144 adminpages/reports/login.php:160 +#: adminpages/membershiplevels.php:354 adminpages/membershiplevels.php:808 +#: adminpages/reports/history.php:184 adminpages/reports/login.php:181 +msgid "Name" +msgstr "Name" + +#: adminpages/membershiplevels.php:352 adminpages/membershiplevels.php:314 +#: adminpages/membershiplevels.php:316 adminpages/membershiplevels.php:318 +#: adminpages/membershiplevels.php:342 adminpages/membershiplevels.php:377 +msgid "Confirmation Message" +msgstr "Bestätigungs-Nachricht" + +#: adminpages/membershiplevels.php:371 adminpages/membershiplevels.php:665 +#: adminpages/membershiplevels.php:333 adminpages/membershiplevels.php:335 +#: adminpages/membershiplevels.php:337 adminpages/membershiplevels.php:338 +#: adminpages/membershiplevels.php:361 adminpages/membershiplevels.php:543 +#: adminpages/membershiplevels.php:585 adminpages/membershiplevels.php:631 +#: adminpages/membershiplevels.php:633 adminpages/membershiplevels.php:638 +#: adminpages/membershiplevels.php:639 adminpages/membershiplevels.php:643 +#: adminpages/membershiplevels.php:655 adminpages/membershiplevels.php:397 +#: adminpages/membershiplevels.php:809 +msgid "Billing Details" +msgstr "Zahlungs-Einstellungen" + +#: adminpages/membershiplevels.php:406 +#: classes/gateways/class.pmprogateway_stripe.php:777 +#: adminpages/membershiplevels.php:349 adminpages/membershiplevels.php:351 +#: adminpages/membershiplevels.php:370 adminpages/membershiplevels.php:372 +#: adminpages/membershiplevels.php:373 adminpages/membershiplevels.php:396 +#: classes/gateways/class.pmprogateway_stripe.php:619 +#: classes/gateways/class.pmprogateway_stripe.php:620 +#: classes/gateways/class.pmprogateway_stripe.php:630 +#: classes/gateways/class.pmprogateway_stripe.php:634 +#: classes/gateways/class.pmprogateway_stripe.php:660 +#: classes/gateways/class.pmprogateway_stripe.php:664 +#: classes/gateways/class.pmprogateway_stripe.php:665 +#: classes/gateways/class.pmprogateway_stripe.php:668 +#: classes/gateways/class.pmprogateway_stripe.php:686 +#: classes/gateways/class.pmprogateway_stripe.php:697 +#: classes/gateways/class.pmprogateway_stripe.php:735 +#: classes/gateways/class.pmprogateway_stripe.php:762 +#: classes/gateways/class.pmprogateway_stripe.php:769 +#: classes/gateways/class.pmprogateway_stripe.php:785 +#: classes/gateways/class.pmprogateway_stripe.php:786 +#: adminpages/discountcodes.php:606 adminpages/membershiplevels.php:433 +#: classes/gateways/class.pmprogateway_stripe.php:1466 +#: classes/gateways/class.pmprogateway_stripe.php:1478 +#: adminpages/discountcodes.php:608 +#: classes/gateways/class.pmprogateway_stripe.php:1497 +#: classes/gateways/class.pmprogateway_stripe.php:1503 +msgid "per" +msgstr "pro" + +#: adminpages/membershiplevels.php:421 adminpages/membershiplevels.php:366 +#: adminpages/membershiplevels.php:385 adminpages/membershiplevels.php:387 +#: adminpages/membershiplevels.php:388 adminpages/membershiplevels.php:411 +msgid "Stripe integration currently only supports billing periods of \"Week\", \"Month\" or \"Year\"." +msgstr "Stripe unterstützt derzeit nur \"Wochen\", \"Monate\" oder \"Jahre\" als Zahlungszyklen." + +#: adminpages/membershiplevels.php:423 adminpages/membershiplevels.php:366 +#: adminpages/membershiplevels.php:368 adminpages/membershiplevels.php:387 +#: adminpages/membershiplevels.php:389 adminpages/membershiplevels.php:390 +#: adminpages/membershiplevels.php:413 adminpages/discountcodes.php:620 +#: adminpages/membershiplevels.php:448 adminpages/discountcodes.php:622 +msgid "Braintree integration currently only supports billing periods of \"Month\" or \"Year\"." +msgstr "Braintree unterstützt derzeit nur \"Monate\" oder \"Jahre\" als Zahlungszyklen." + +#: adminpages/membershiplevels.php:427 adminpages/membershiplevels.php:372 +#: adminpages/membershiplevels.php:374 adminpages/membershiplevels.php:393 +#: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:396 +#: adminpages/membershiplevels.php:417 adminpages/membershiplevels.php:454 +msgid "After saving this level, make note of the ID and create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to pmpro_#, where # is the level ID." +msgstr "Nach dem Speichern des Pakets notieren Sie sich die ID und erstellen Sie einen \"Tarif\" in Ihrem Braintree Dashboard mit den gleichen Einstellungen und der \"Tarif ID\" wie in pmpro_Nummer, wobei Nummer die Paket ID ist." + +#: adminpages/membershiplevels.php:427 adminpages/membershiplevels.php:429 +#: classes/gateways/class.pmprogateway_cybersource.php:101 +#: classes/gateways/class.pmprogateway_paypal.php:130 +#: classes/gateways/class.pmprogateway_paypalexpress.php:145 +#: classes/gateways/class.pmprogateway_paypalstandard.php:137 +#: adminpages/membershiplevels.php:372 adminpages/membershiplevels.php:374 +#: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:393 +#: adminpages/membershiplevels.php:395 adminpages/membershiplevels.php:396 +#: adminpages/membershiplevels.php:397 adminpages/membershiplevels.php:398 +#: adminpages/membershiplevels.php:417 adminpages/membershiplevels.php:419 +#: adminpages/paymentsettings.php:170 adminpages/paymentsettings.php:174 +#: adminpages/paymentsettings.php:179 +#: classes/gateways/class.pmprogateway_paypal.php:118 +#: classes/gateways/class.pmprogateway_paypalexpress.php:123 +#: classes/gateways/class.pmprogateway_paypalexpress.php:133 +#: classes/gateways/class.pmprogateway_paypalstandard.php:117 +#: adminpages/membershiplevels.php:454 adminpages/membershiplevels.php:459 +#: classes/gateways/class.pmprogateway_cybersource.php:89 +msgid "Note" +msgstr "Hinweis" + +#: adminpages/membershiplevels.php:429 adminpages/membershiplevels.php:374 +#: adminpages/membershiplevels.php:376 adminpages/membershiplevels.php:395 +#: adminpages/membershiplevels.php:397 adminpages/membershiplevels.php:398 +#: adminpages/membershiplevels.php:419 +msgid "You will need to create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to" +msgstr "Sie müssen in Ihrem Braintree Dashboard einen \"Tarif\" anlegen mit den gleichen Einstellungen und der \"Tarif ID\" " + +#: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:386 +#: adminpages/membershiplevels.php:388 adminpages/membershiplevels.php:407 +#: adminpages/membershiplevels.php:409 adminpages/membershiplevels.php:410 +#: adminpages/membershiplevels.php:431 adminpages/discountcodes.php:634 +#: adminpages/membershiplevels.php:471 adminpages/discountcodes.php:636 +msgid "Stripe integration currently does not support billing limits. You can still set an expiration date below." +msgstr "Stripe unterstützt derzeit keine Zahlungs-Limits. Sie können unten dennoch ein Ablaufdatum festlegen." + +#: adminpages/membershiplevels.php:453 adminpages/membershiplevels.php:398 +#: adminpages/membershiplevels.php:400 adminpages/membershiplevels.php:419 +#: adminpages/membershiplevels.php:421 adminpages/membershiplevels.php:422 +#: adminpages/membershiplevels.php:443 adminpages/discountcodes.php:655 +#: adminpages/membershiplevels.php:493 adminpages/discountcodes.php:657 +msgid "2Checkout integration does not support custom trials. You can do one period trials by setting an initial payment different from the billing amount." +msgstr "2Checkout unterstützt keine Testphasen. Sie können eine Testphase einrichten, indem Sie eine Erst-Zahlung einstellen, die sich von den anderen Beträgen unterscheidet." + +#: adminpages/membershiplevels.php:475 adminpages/membershiplevels.php:406 +#: adminpages/membershiplevels.php:412 adminpages/membershiplevels.php:414 +#: adminpages/membershiplevels.php:441 adminpages/membershiplevels.php:443 +#: adminpages/membershiplevels.php:444 adminpages/membershiplevels.php:465 +#: adminpages/discountcodes.php:676 adminpages/membershiplevels.php:525 +#: adminpages/discountcodes.php:678 +msgid "Stripe integration currently does not support trial amounts greater than $0." +msgstr "Stripe unterstützt derzeit keine Beträge für Testphasen, die größer als $0 sind." + +#: adminpages/membershiplevels.php:479 adminpages/membershiplevels.php:410 +#: adminpages/membershiplevels.php:416 adminpages/membershiplevels.php:418 +#: adminpages/membershiplevels.php:445 adminpages/membershiplevels.php:447 +#: adminpages/membershiplevels.php:448 adminpages/membershiplevels.php:469 +#: adminpages/discountcodes.php:678 adminpages/membershiplevels.php:527 +#: adminpages/discountcodes.php:680 +msgid "Braintree integration currently does not support trial amounts greater than $0." +msgstr "Braintree unterstützt derzeit keine Beträge für Testphasen, die größer als $0 sind." + +#: adminpages/membershiplevels.php:483 adminpages/membershiplevels.php:414 +#: adminpages/membershiplevels.php:420 adminpages/membershiplevels.php:422 +#: adminpages/membershiplevels.php:449 adminpages/membershiplevels.php:451 +#: adminpages/membershiplevels.php:452 adminpages/membershiplevels.php:473 +#: adminpages/discountcodes.php:680 adminpages/membershiplevels.php:529 +#: adminpages/discountcodes.php:682 +msgid "Payflow integration currently does not support trial amounts greater than $0." +msgstr "Payflow unterstützt derzeit keine Beträge für Testphasen, die größer als $0 sind." + +#: adminpages/membershiplevels.php:492 adminpages/membershiplevels.php:422 +#: adminpages/membershiplevels.php:428 adminpages/membershiplevels.php:430 +#: adminpages/membershiplevels.php:457 adminpages/membershiplevels.php:458 +#: adminpages/membershiplevels.php:460 adminpages/membershiplevels.php:461 +#: adminpages/membershiplevels.php:482 adminpages/advancedsettings.php:328 +#: adminpages/dashboard.php:140 adminpages/membershiplevels.php:550 +msgid "Other Settings" +msgstr "Andere Einstellungen" + +#: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:426 +#: adminpages/membershiplevels.php:432 adminpages/membershiplevels.php:434 +#: adminpages/membershiplevels.php:461 adminpages/membershiplevels.php:462 +#: adminpages/membershiplevels.php:464 adminpages/membershiplevels.php:465 +#: adminpages/membershiplevels.php:486 adminpages/membershiplevels.php:554 +msgid "Disable New Signups" +msgstr "Neuanmeldungen deaktivieren" + +#: adminpages/membershiplevels.php:497 adminpages/membershiplevels.php:427 +#: adminpages/membershiplevels.php:433 adminpages/membershiplevels.php:435 +#: adminpages/membershiplevels.php:462 adminpages/membershiplevels.php:463 +#: adminpages/membershiplevels.php:465 adminpages/membershiplevels.php:466 +#: adminpages/membershiplevels.php:487 adminpages/membershiplevels.php:555 +msgid "Check to hide this level from the membership levels page and disable registration." +msgstr "Auswählen, um dieses Paket auf der Paket-Seite zu verbergen und die Anmeldung dafür zu deaktivieren." + +#: adminpages/membershiplevels.php:527 adminpages/membershiplevels.php:457 +#: adminpages/membershiplevels.php:463 adminpages/membershiplevels.php:465 +#: adminpages/membershiplevels.php:492 adminpages/membershiplevels.php:493 +#: adminpages/membershiplevels.php:495 adminpages/membershiplevels.php:496 +#: adminpages/membershiplevels.php:517 adminpages/advancedsettings.php:194 +#: adminpages/membershiplevels.php:624 +msgid "Content Settings" +msgstr "Inhaltliche Einstellungen" + +#: adminpages/membershiplevels.php:531 adminpages/membershiplevels.php:461 +#: adminpages/membershiplevels.php:467 adminpages/membershiplevels.php:469 +#: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:497 +#: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:500 +#: adminpages/membershiplevels.php:521 adminpages/membershiplevels.php:654 +msgid "Categories" +msgstr "Kategorien" + +#: adminpages/membershiplevels.php:539 adminpages/membershiplevels.php:505 +#: adminpages/membershiplevels.php:507 adminpages/membershiplevels.php:516 +#: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:529 +#: adminpages/membershiplevels.php:674 +msgid "Save Level" +msgstr "Paket speichern" + +#: adminpages/membershiplevels.php:540 adminpages/orders.php:894 +#: pages/billing.php:363 pages/cancel.php:84 shortcodes/pmpro_account.php:72 +#: adminpages/membershiplevels.php:506 adminpages/membershiplevels.php:508 +#: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:518 +#: adminpages/membershiplevels.php:530 adminpages/orders.php:511 +#: adminpages/orders.php:561 adminpages/orders.php:633 +#: adminpages/orders.php:662 adminpages/orders.php:765 +#: adminpages/orders.php:796 adminpages/orders.php:807 pages/account.php:44 +#: pages/billing.php:295 pages/billing.php:299 pages/billing.php:330 +#: pages/billing.php:339 pages/billing.php:342 pages/billing.php:344 +#: pages/billing.php:348 pages/billing.php:364 pages/billing.php:365 +#: pages/billing.php:371 pages/billing.php:392 pages/billing.php:397 +#: pages/billing.php:401 pages/billing.php:406 pages/cancel.php:71 +#: pages/cancel.php:83 shortcodes/pmpro_account.php:70 +#: shortcodes/pmpro_account.php:73 adminpages/membershiplevels.php:675 +#: adminpages/orders.php:962 includes/email-templates.php:123 +#: includes/profile.php:786 includes/profile.php:910 pages/billing.php:426 +#: pages/cancel.php:96 shortcodes/pmpro_account.php:106 +#: adminpages/orders.php:968 includes/profile.php:798 includes/profile.php:922 +msgid "Cancel" +msgstr "Stornieren" + +#: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:490 +#: adminpages/membershiplevels.php:496 adminpages/membershiplevels.php:498 +#: adminpages/membershiplevels.php:525 adminpages/membershiplevels.php:526 +#: adminpages/membershiplevels.php:569 adminpages/membershiplevels.php:607 +#: adminpages/membershiplevels.php:609 adminpages/membershiplevels.php:618 +#: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:631 +#: adminpages/membershiplevels.php:793 +msgid "Add New Level" +msgstr "Neues Paket hinzufügen" + +#: adminpages/membershiplevels.php:644 adminpages/membershiplevels.php:647 +#: adminpages/membershiplevels.php:493 adminpages/membershiplevels.php:496 +#: adminpages/membershiplevels.php:499 adminpages/membershiplevels.php:501 +#: adminpages/membershiplevels.php:502 adminpages/membershiplevels.php:504 +#: adminpages/membershiplevels.php:528 adminpages/membershiplevels.php:529 +#: adminpages/membershiplevels.php:531 adminpages/membershiplevels.php:532 +#: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:575 +#: adminpages/membershiplevels.php:610 adminpages/membershiplevels.php:612 +#: adminpages/membershiplevels.php:613 adminpages/membershiplevels.php:615 +#: adminpages/membershiplevels.php:621 adminpages/membershiplevels.php:622 +#: adminpages/membershiplevels.php:624 adminpages/membershiplevels.php:625 +#: adminpages/membershiplevels.php:634 adminpages/membershiplevels.php:637 +#: adminpages/membershiplevels.php:786 adminpages/membershiplevels.php:789 +msgid "Search Levels" +msgstr "Pakete durchsuchen" + +#: adminpages/membershiplevels.php:653 adminpages/membershiplevels.php:579 +#: adminpages/membershiplevels.php:619 adminpages/membershiplevels.php:621 +#: adminpages/membershiplevels.php:630 adminpages/membershiplevels.php:631 +#: adminpages/membershiplevels.php:643 adminpages/membershiplevels.php:797 +msgid "Drag and drop membership levels to reorder them on the Levels page." +msgstr "Pakete mit der Maus verschieben, um sie auf der Pakete-Seite zu sortieren." + +#: adminpages/membershiplevels.php:666 pages/cancel.php:62 +#: pages/confirmation.php:81 pages/invoice.php:63 +#: shortcodes/pmpro_account.php:46 adminpages/membershiplevels.php:510 +#: adminpages/membershiplevels.php:516 adminpages/membershiplevels.php:518 +#: adminpages/membershiplevels.php:544 adminpages/membershiplevels.php:545 +#: adminpages/membershiplevels.php:586 adminpages/membershiplevels.php:632 +#: adminpages/membershiplevels.php:634 adminpages/membershiplevels.php:639 +#: adminpages/membershiplevels.php:640 adminpages/membershiplevels.php:644 +#: adminpages/membershiplevels.php:656 pages/account.php:20 pages/cancel.php:53 +#: pages/cancel.php:61 pages/confirmation.php:83 pages/confirmation.php:84 +#: pages/confirmation.php:89 pages/invoice.php:68 pages/invoice.php:70 +#: shortcodes/pmpro_account.php:45 adminpages/membershiplevels.php:810 +#: pages/billing.php:100 pages/cancel.php:71 pages/confirmation.php:99 +#: pages/invoice.php:89 shortcodes/pmpro_account.php:44 +msgid "Expiration" +msgstr "Gültig bis" + +#: adminpages/membershiplevels.php:667 adminpages/membershiplevels.php:511 +#: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:519 +#: adminpages/membershiplevels.php:545 adminpages/membershiplevels.php:546 +#: adminpages/membershiplevels.php:587 adminpages/membershiplevels.php:633 +#: adminpages/membershiplevels.php:635 adminpages/membershiplevels.php:640 +#: adminpages/membershiplevels.php:641 adminpages/membershiplevels.php:645 +#: adminpages/membershiplevels.php:657 adminpages/membershiplevels.php:811 +msgid "Allow Signups" +msgstr "Anmeldungen zulassen" + +#: adminpages/membershiplevels.php:682 adminpages/membershiplevels.php:534 +#: adminpages/membershiplevels.php:540 adminpages/membershiplevels.php:542 +#: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:569 +#: adminpages/membershiplevels.php:646 adminpages/membershiplevels.php:648 +#: adminpages/membershiplevels.php:650 adminpages/membershiplevels.php:655 +#: adminpages/membershiplevels.php:656 adminpages/membershiplevels.php:660 +#: adminpages/membershiplevels.php:672 adminpages/membershiplevels.php:840 +#: adminpages/membershiplevels.php:921 +msgid "FREE" +msgstr "Kostenlos" + +#: adminpages/membershiplevels.php:691 adminpages/membershiplevels.php:560 +#: adminpages/membershiplevels.php:566 adminpages/membershiplevels.php:568 +#: adminpages/membershiplevels.php:575 adminpages/membershiplevels.php:595 +#: adminpages/membershiplevels.php:655 adminpages/membershiplevels.php:657 +#: adminpages/membershiplevels.php:659 adminpages/membershiplevels.php:664 +#: adminpages/membershiplevels.php:665 adminpages/membershiplevels.php:669 +#: adminpages/membershiplevels.php:681 adminpages/membershiplevels.php:849 +#: adminpages/membershiplevels.php:930 +msgid "After" +msgstr "Nach" + +#. translators: %s is the Level Name. +#: adminpages/membershiplevels.php:696 adminpages/membershiplevels.php:566 +#: adminpages/membershiplevels.php:572 adminpages/membershiplevels.php:574 +#: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:601 +#: adminpages/membershiplevels.php:660 adminpages/membershiplevels.php:662 +#: adminpages/membershiplevels.php:664 adminpages/membershiplevels.php:669 +#: adminpages/membershiplevels.php:670 adminpages/membershiplevels.php:674 +#: adminpages/membershiplevels.php:686 adminpages/membershiplevels.php:835 +#: adminpages/membershiplevels.php:837 +#, php-format +msgid "Are you sure you want to delete membership level %s? All subscriptions will be cancelled." +msgstr "Sind Sie sicher, dass sie Mitgliedschafts-Paket %s löschen möchten? Alle Anmeldungen werden storniert." + +#: adminpages/membershiplevels.php:696 adminpages/orders.php:1363 +#: adminpages/membershiplevels.php:565 adminpages/membershiplevels.php:571 +#: adminpages/membershiplevels.php:573 adminpages/membershiplevels.php:580 +#: adminpages/membershiplevels.php:600 adminpages/membershiplevels.php:660 +#: adminpages/membershiplevels.php:662 adminpages/membershiplevels.php:664 +#: adminpages/membershiplevels.php:669 adminpages/membershiplevels.php:670 +#: adminpages/membershiplevels.php:674 adminpages/membershiplevels.php:686 +#: adminpages/orders.php:661 adminpages/orders.php:964 +#: adminpages/orders.php:982 adminpages/orders.php:992 +#: adminpages/orders.php:995 adminpages/orders.php:1024 +#: adminpages/orders.php:1053 adminpages/orders.php:1208 +#: adminpages/orders.php:1242 adminpages/orders.php:1248 +msgid "copy" +msgstr "kopieren" + +#: adminpages/memberslist.php:25 includes/adminpages.php:54 +#: includes/adminpages.php:158 includes/adminpages.php:15 +#: includes/adminpages.php:53 includes/adminpages.php:74 +#: includes/adminpages.php:142 includes/adminpages.php:149 +#: includes/adminpages.php:153 adminpages/memberslist.php:20 +msgid "Members List" +msgstr "Mitgliederliste" + +#: adminpages/memberslist.php:26 adminpages/orders.php:962 +#: adminpages/orders.php:522 adminpages/orders.php:591 +#: adminpages/orders.php:698 adminpages/orders.php:727 +#: adminpages/orders.php:833 adminpages/orders.php:864 +#: adminpages/orders.php:875 adminpages/memberslist.php:21 +#: adminpages/orders.php:994 adminpages/orders.php:1000 +msgid "Export to CSV" +msgstr "Als CSV exportieren" + +#: adminpages/memberslist.php:30 adminpages/orders.php:981 +#: adminpages/reports/login.php:87 adminpages/reports/memberships.php:328 +#: adminpages/reports/sales.php:203 adminpages/orders.php:603 +#: adminpages/orders.php:710 adminpages/orders.php:739 +#: adminpages/orders.php:848 adminpages/orders.php:879 +#: adminpages/orders.php:890 adminpages/reports/login.php:65 +#: adminpages/reports/login.php:67 adminpages/reports/login.php:83 +#: adminpages/reports/memberships.php:256 +#: adminpages/reports/memberships.php:263 +#: adminpages/reports/memberships.php:276 +#: adminpages/reports/memberships.php:292 +#: adminpages/reports/memberships.php:304 adminpages/reports/sales.php:185 +#: adminpages/reports/sales.php:193 adminpages/reports/sales.php:194 +#: adminpages/reports/sales.php:202 adminpages/orders.php:1014 +#: adminpages/reports/history.php:103 adminpages/reports/memberships.php:331 +#: adminpages/reports/sales.php:293 +#: classes/class-pmpro-members-list-table.php:623 adminpages/orders.php:1020 +#: classes/class-pmpro-members-list-table.php:622 +msgid "Show" +msgstr "Anzeigen" + +#: adminpages/memberslist.php:32 adminpages/reports/login.php:89 +#: adminpages/reports/memberships.php:355 adminpages/reports/sales.php:226 +#: classes/class.pmproemail.php:154 classes/class.pmproemail.php:199 +#: adminpages/reports/login.php:67 adminpages/reports/login.php:69 +#: adminpages/reports/login.php:85 adminpages/reports/memberships.php:281 +#: adminpages/reports/memberships.php:290 +#: adminpages/reports/memberships.php:303 +#: adminpages/reports/memberships.php:317 +#: adminpages/reports/memberships.php:331 adminpages/reports/sales.php:208 +#: adminpages/reports/sales.php:216 adminpages/reports/sales.php:217 +#: adminpages/reports/sales.php:225 classes/class.pmproemail.php:145 +#: classes/class.pmproemail.php:147 classes/class.pmproemail.php:189 +#: classes/class.pmproemail.php:192 adminpages/reports/history.php:105 +#: adminpages/reports/login.php:105 adminpages/reports/sales.php:316 +#: classes/class-pmpro-members-list-table.php:625 +#: classes/class.pmproemail.php:202 classes/class.pmproemail.php:242 +#: classes/class-pmpro-members-list-table.php:624 +msgid "All Levels" +msgstr "Alle Pakete" + +#: adminpages/memberslist.php:42 classes/class-pmpro-members-list-table.php:235 +#: classes/class-pmpro-members-list-table.php:635 +#: classes/class-pmpro-members-list-table.php:234 +#: classes/class-pmpro-members-list-table.php:634 +msgid "Cancelled Members" +msgstr "Stornierte Mitgliedschaften" + +#: adminpages/memberslist.php:43 classes/class-pmpro-members-list-table.php:236 +#: classes/class-pmpro-members-list-table.php:636 +#: classes/class-pmpro-members-list-table.php:235 +#: classes/class-pmpro-members-list-table.php:635 +msgid "Expired Members" +msgstr "Abgelaufene Mitgliedschaften" + +#: adminpages/memberslist.php:44 adminpages/memberslist.php:42 +#: classes/class-pmpro-members-list-table.php:237 +#: classes/class-pmpro-members-list-table.php:637 +#: classes/class-pmpro-members-list-table.php:236 +#: classes/class-pmpro-members-list-table.php:636 +msgid "Old Members" +msgstr "Alte Mitglieder" + +#: adminpages/memberslist.php:49 adminpages/memberslist.php:52 +#: adminpages/memberslist.php:46 adminpages/memberslist.php:47 +#: adminpages/memberslist.php:50 adminpages/memberslist.php:28 +#: adminpages/reports/history.php:115 adminpages/reports/history.php:119 +msgid "Search Members" +msgstr "Mitglieder suchen" + +#: adminpages/memberslist.php:156 adminpages/memberslist.php:103 +#: adminpages/memberslist.php:136 adminpages/memberslist.php:146 +#: adminpages/reports/history.php:177 +#, php-format +msgid "%d members found." +msgstr "%d Mitglieder gefunden." + +#: adminpages/memberslist.php:165 pages/checkout.php:167 +#: shortcodes/pmpro_account.php:110 adminpages/memberslist.php:112 +#: adminpages/memberslist.php:145 adminpages/memberslist.php:155 +#: pages/account.php:51 pages/account.php:55 pages/account.php:76 +#: pages/checkout.php:168 pages/checkout.php:171 pages/checkout.php:173 +#: pages/checkout.php:180 pages/checkout.php:182 pages/checkout.php:184 +#: pages/checkout.php:191 pages/checkout.php:194 +#: shortcodes/pmpro_account.php:105 shortcodes/pmpro_account.php:107 +#: shortcodes/pmpro_account.php:108 adminpages/dashboard.php:219 +#: adminpages/emailtemplates.php:127 adminpages/reports/history.php:183 +#: adminpages/reports/login.php:180 classes/class.memberorder.php:961 +#: pages/checkout.php:134 shortcodes/pmpro_account.php:173 +#: adminpages/dashboard.php:223 +msgid "Username" +msgstr "Benutzername" + +#: adminpages/memberslist.php:166 adminpages/memberslist.php:113 +#: adminpages/memberslist.php:146 adminpages/memberslist.php:156 +msgid "First Name" +msgstr "Vorname" + +#: adminpages/memberslist.php:167 adminpages/memberslist.php:114 +#: adminpages/memberslist.php:147 adminpages/memberslist.php:157 +msgid "Last Name" +msgstr "Nachname" + +#: adminpages/memberslist.php:170 pages/billing.php:100 pages/checkout.php:275 +#: pages/confirmation.php:66 pages/invoice.php:48 +#: adminpages/memberslist.php:117 adminpages/memberslist.php:150 +#: adminpages/memberslist.php:160 pages/account.php:90 pages/account.php:94 +#: pages/billing.php:58 pages/billing.php:62 pages/billing.php:71 +#: pages/billing.php:74 pages/billing.php:76 pages/billing.php:77 +#: pages/billing.php:80 pages/billing.php:103 pages/billing.php:104 +#: pages/checkout.php:298 pages/checkout.php:300 pages/checkout.php:302 +#: pages/checkout.php:311 pages/checkout.php:314 pages/checkout.php:317 +#: pages/checkout.php:319 pages/checkout.php:321 pages/checkout.php:326 +#: pages/checkout.php:329 pages/confirmation.php:59 pages/confirmation.php:61 +#: pages/confirmation.php:67 pages/confirmation.php:69 pages/invoice.php:46 +#: pages/billing.php:160 pages/checkout.php:230 pages/confirmation.php:78 +#: pages/invoice.php:68 +msgid "Billing Address" +msgstr "Rechnungsadresse" + +#: adminpages/memberslist.php:171 adminpages/reports/login.php:165 +#: classes/gateways/class.pmprogateway_authorizenet.php:303 +#: adminpages/memberslist.php:118 adminpages/memberslist.php:151 +#: adminpages/memberslist.php:161 adminpages/pagesettings.php:51 +#: adminpages/reports/login.php:143 adminpages/reports/login.php:145 +#: adminpages/reports/login.php:161 +#: classes/gateways/class.pmprogateway_authorizenet.php:187 +msgid "Membership" +msgstr "Mitgliedschaft" + +#: adminpages/memberslist.php:172 adminpages/memberslist.php:119 +#: adminpages/memberslist.php:152 adminpages/memberslist.php:162 +msgid "Fee" +msgstr "Gebühr" + +#: adminpages/memberslist.php:173 adminpages/reports/login.php:166 +#: adminpages/memberslist.php:120 adminpages/memberslist.php:153 +#: adminpages/memberslist.php:163 adminpages/reports/login.php:144 +#: adminpages/reports/login.php:146 adminpages/reports/login.php:162 +#: adminpages/dashboard.php:221 adminpages/reports/history.php:186 +#: adminpages/reports/login.php:183 adminpages/dashboard.php:225 +msgid "Joined" +msgstr "Beigetreten" + +#: adminpages/memberslist.php:177 adminpages/memberslist.php:157 +#: adminpages/memberslist.php:167 +msgid "Ended" +msgstr "Beendet" + +#: adminpages/memberslist.php:179 +msgid "Cancelled" +msgstr "Storniert" + +#: adminpages/memberslist.php:181 +msgid "Expired" +msgstr "Abgelaufen" + +#: adminpages/memberslist.php:266 adminpages/reports/login.php:232 +#: adminpages/memberslist.php:195 adminpages/memberslist.php:223 +#: adminpages/memberslist.php:251 adminpages/memberslist.php:261 +#: adminpages/memberslist.php:262 adminpages/reports/login.php:210 +#: adminpages/reports/login.php:212 adminpages/reports/login.php:228 +#: adminpages/dashboard.php:228 adminpages/reports/history.php:236 +#: adminpages/reports/login.php:263 +#: classes/class-pmpro-members-list-table.php:226 adminpages/dashboard.php:232 +#: classes/class-pmpro-members-list-table.php:225 +msgid "No members found." +msgstr "Keine Mitglieder gefunden." + +#: adminpages/memberslist.php:266 adminpages/reports/login.php:232 +#: adminpages/memberslist.php:195 adminpages/memberslist.php:223 +#: adminpages/memberslist.php:251 adminpages/memberslist.php:261 +#: adminpages/memberslist.php:262 adminpages/reports/login.php:210 +#: adminpages/reports/login.php:212 adminpages/reports/login.php:228 +#: adminpages/reports/history.php:236 adminpages/reports/login.php:263 +#: classes/class-pmpro-members-list-table.php:228 +#: classes/class-pmpro-members-list-table.php:227 +msgid "Search all levels" +msgstr "Alle Pakete durchsuchen" + +#: adminpages/orders.php:146 adminpages/orders.php:155 +#: adminpages/functions.php:394 +msgid "Invoice emailed successfully." +msgstr "Rechnung erfolgreich als E-Mail versendet." + +#: adminpages/orders.php:149 adminpages/orders.php:160 +#: adminpages/functions.php:398 +msgid "Error emailing invoice." +msgstr "Fehler beim E-Mail-Versand der Rechnung." + +#: adminpages/orders.php:162 adminpages/orders.php:26 adminpages/orders.php:67 +#: adminpages/orders.php:175 adminpages/orders.php:161 +#: adminpages/orders.php:167 +msgid "Order deleted successfully." +msgstr "Bestellung erfolgreich gelöscht." + +#: adminpages/orders.php:165 adminpages/orders.php:31 adminpages/orders.php:72 +#: adminpages/orders.php:180 adminpages/orders.php:164 +#: adminpages/orders.php:170 +msgid "Error deleting order." +msgstr "Fehler beim Löschen der Bestellung." + +#: adminpages/orders.php:297 adminpages/orders.php:119 +#: adminpages/orders.php:169 adminpages/orders.php:270 +#: adminpages/orders.php:284 adminpages/orders.php:285 +#: adminpages/orders.php:295 adminpages/orders.php:309 +#: adminpages/orders.php:315 +msgid "Order saved successfully." +msgstr "Bestellung erfolgreich gespeichert." + +#: adminpages/orders.php:300 adminpages/orders.php:124 +#: adminpages/orders.php:174 adminpages/orders.php:275 +#: adminpages/orders.php:287 adminpages/orders.php:288 +#: adminpages/orders.php:298 +msgid "Error updating order timestamp." +msgstr "Fehler beim aktualisieren des Zeitstempels für die Bestellung." + +#: adminpages/orders.php:304 adminpages/orders.php:130 +#: adminpages/orders.php:180 adminpages/orders.php:281 +#: adminpages/orders.php:291 adminpages/orders.php:292 +#: adminpages/orders.php:302 adminpages/orders.php:312 +#: adminpages/orders.php:318 +msgid "Error saving order." +msgstr "Fehler beim Speichern der Bestellung." + +#: adminpages/orders.php:364 classes/class.memberorder.php:763 +#: adminpages/orders.php:195 adminpages/orders.php:245 +#: adminpages/orders.php:317 adminpages/orders.php:321 +#: adminpages/orders.php:346 adminpages/orders.php:352 +#: adminpages/orders.php:362 classes/class.memberorder.php:743 +#: classes/class.memberorder.php:746 adminpages/orders.php:383 +#: classes/class-pmpro-admin-activity-email.php:219 +#: classes/class.memberorder.php:963 adminpages/orders.php:389 +msgid "Order" +msgstr "Bestellung" + +#: adminpages/orders.php:366 adminpages/orders.php:197 +#: adminpages/orders.php:247 adminpages/orders.php:319 +#: adminpages/orders.php:323 adminpages/orders.php:348 +#: adminpages/orders.php:354 adminpages/orders.php:364 +#: adminpages/orders.php:387 adminpages/orders.php:393 +msgid "New Order" +msgstr "Neue Bestellung" + +#: adminpages/orders.php:413 adminpages/orders.php:220 +#: adminpages/orders.php:270 adminpages/orders.php:342 +#: adminpages/orders.php:359 adminpages/orders.php:371 +#: adminpages/orders.php:390 adminpages/orders.php:401 +#: adminpages/orders.php:433 adminpages/orders.php:439 +msgid "Randomly generated for you." +msgstr "Automatisch generiert." + +#: adminpages/orders.php:418 adminpages/orders.php:225 +#: adminpages/orders.php:275 adminpages/orders.php:347 +#: adminpages/orders.php:364 adminpages/orders.php:376 +#: adminpages/orders.php:395 adminpages/orders.php:406 +#: adminpages/orders.php:438 adminpages/orders.php:444 +msgid "User ID" +msgstr "Benutzer ID" + +#: adminpages/orders.php:432 adminpages/orders.php:234 +#: adminpages/orders.php:284 adminpages/orders.php:356 +#: adminpages/orders.php:376 adminpages/orders.php:385 +#: adminpages/orders.php:407 adminpages/orders.php:418 +#: adminpages/emailtemplates.php:130 adminpages/orders.php:451 +#: adminpages/orders.php:457 +msgid "Membership Level ID" +msgstr "Paket ID" + +#: adminpages/orders.php:447 includes/privacy.php:245 adminpages/orders.php:243 +#: adminpages/orders.php:293 adminpages/orders.php:365 +#: adminpages/orders.php:389 adminpages/orders.php:394 +#: adminpages/orders.php:420 adminpages/orders.php:431 +#: adminpages/orders.php:464 adminpages/orders.php:470 +msgid "Billing Name" +msgstr "Name" + +#: adminpages/orders.php:461 includes/privacy.php:249 adminpages/orders.php:251 +#: adminpages/orders.php:301 adminpages/orders.php:373 +#: adminpages/orders.php:401 adminpages/orders.php:402 +#: adminpages/orders.php:432 adminpages/orders.php:443 +#: adminpages/orders.php:478 adminpages/orders.php:484 +msgid "Billing Street" +msgstr "Straße" + +#: adminpages/orders.php:474 includes/privacy.php:253 includes/privacy.php:358 +#: adminpages/orders.php:258 adminpages/orders.php:308 +#: adminpages/orders.php:380 adminpages/orders.php:409 +#: adminpages/orders.php:412 adminpages/orders.php:443 +#: adminpages/orders.php:454 adminpages/orders.php:491 +#: adminpages/orders.php:497 +msgid "Billing City" +msgstr "Ort" + +#: adminpages/orders.php:487 includes/privacy.php:257 adminpages/orders.php:265 +#: adminpages/orders.php:315 adminpages/orders.php:387 +#: adminpages/orders.php:416 adminpages/orders.php:423 +#: adminpages/orders.php:454 adminpages/orders.php:465 +#: adminpages/orders.php:504 adminpages/orders.php:510 +msgid "Billing State" +msgstr "Bundesland" + +#: adminpages/orders.php:500 includes/privacy.php:261 includes/privacy.php:360 +#: adminpages/orders.php:272 adminpages/orders.php:322 +#: adminpages/orders.php:394 adminpages/orders.php:423 +#: adminpages/orders.php:434 adminpages/orders.php:465 +#: adminpages/orders.php:476 adminpages/orders.php:517 +#: adminpages/orders.php:523 +msgid "Billing Postal Code" +msgstr "Postleitzahl" + +#: adminpages/orders.php:513 includes/privacy.php:265 includes/privacy.php:362 +#: adminpages/orders.php:279 adminpages/orders.php:329 +#: adminpages/orders.php:401 adminpages/orders.php:430 +#: adminpages/orders.php:445 adminpages/orders.php:476 +#: adminpages/orders.php:487 adminpages/orders.php:530 +#: adminpages/orders.php:536 +msgid "Billing Country" +msgstr "Land" + +#: adminpages/orders.php:527 includes/privacy.php:269 adminpages/orders.php:287 +#: adminpages/orders.php:337 adminpages/orders.php:409 +#: adminpages/orders.php:438 adminpages/orders.php:457 +#: adminpages/orders.php:488 adminpages/orders.php:499 +#: adminpages/orders.php:544 adminpages/orders.php:550 +msgid "Billing Phone" +msgstr "Telefon" + +#: adminpages/orders.php:542 includes/privacy.php:273 adminpages/orders.php:296 +#: adminpages/orders.php:346 adminpages/orders.php:418 +#: adminpages/orders.php:447 adminpages/orders.php:470 +#: adminpages/orders.php:501 adminpages/orders.php:512 +#: adminpages/orders.php:596 adminpages/orders.php:602 +msgid "Sub Total" +msgstr "Zwischensumme" + +#: adminpages/orders.php:555 adminpages/templates/orders-email.php:60 +#: adminpages/templates/orders-print.php:89 includes/privacy.php:277 +#: pages/confirmation.php:92 pages/invoice.php:74 adminpages/orders.php:304 +#: adminpages/orders.php:354 adminpages/orders.php:426 +#: adminpages/orders.php:455 adminpages/orders.php:481 +#: adminpages/orders.php:512 adminpages/orders.php:523 pages/invoice.php:78 +#: pages/invoice.php:80 adminpages/orders.php:609 includes/functions.php:2849 +#: adminpages/orders.php:615 +msgid "Tax" +msgstr "Steuern" + +#: adminpages/orders.php:568 includes/privacy.php:281 adminpages/orders.php:312 +#: adminpages/orders.php:362 adminpages/orders.php:434 +#: adminpages/orders.php:463 adminpages/orders.php:492 +#: adminpages/orders.php:523 adminpages/orders.php:534 +#: adminpages/orders.php:626 adminpages/orders.php:632 +msgid "Coupon Amount" +msgstr "Gutscheinbetrag" + +#: adminpages/orders.php:582 adminpages/orders.php:1236 +#: adminpages/templates/orders-email.php:64 +#: adminpages/templates/orders-print.php:93 includes/privacy.php:285 +#: pages/confirmation.php:96 pages/invoice.php:78 adminpages/orders.php:320 +#: adminpages/orders.php:370 adminpages/orders.php:442 +#: adminpages/orders.php:471 adminpages/orders.php:504 +#: adminpages/orders.php:535 adminpages/orders.php:546 +#: adminpages/orders.php:602 adminpages/orders.php:905 +#: adminpages/orders.php:915 adminpages/orders.php:942 +#: adminpages/orders.php:971 adminpages/orders.php:1108 +#: adminpages/orders.php:1139 adminpages/orders.php:1145 pages/invoice.php:82 +#: pages/invoice.php:84 adminpages/dashboard.php:289 adminpages/orders.php:644 +#: adminpages/orders.php:1338 includes/functions.php:2878 +#: adminpages/dashboard.php:293 adminpages/orders.php:650 +#: adminpages/orders.php:1344 +msgid "Total" +msgstr "Gesamt" + +#: adminpages/orders.php:593 adminpages/orders.php:325 +#: adminpages/orders.php:375 adminpages/orders.php:447 +#: adminpages/orders.php:476 adminpages/orders.php:513 +#: adminpages/orders.php:544 adminpages/orders.php:555 +msgid "Should be subtotal + tax - couponamount." +msgstr "Sollte Zwischensumme + Steuern - Gutscheinwert entsprechen." + +#: adminpages/orders.php:598 includes/privacy.php:289 adminpages/orders.php:330 +#: adminpages/orders.php:380 adminpages/orders.php:452 +#: adminpages/orders.php:481 adminpages/orders.php:518 +#: adminpages/orders.php:549 adminpages/orders.php:560 +#: adminpages/orders.php:658 adminpages/orders.php:664 +msgid "Payment Type" +msgstr "Zahlungsart" + +#: adminpages/orders.php:610 adminpages/orders.php:335 +#: adminpages/orders.php:385 adminpages/orders.php:457 +#: adminpages/orders.php:486 adminpages/orders.php:528 +#: adminpages/orders.php:559 adminpages/orders.php:570 +#: adminpages/orders.php:669 adminpages/orders.php:675 +msgid "e.g. PayPal Express, PayPal Standard, Credit Card." +msgstr "z.B. PayPal Express, PayPal Standard, Kreditkarte." + +#: adminpages/orders.php:614 +#: classes/gateways/class.pmprogateway_braintree.php:446 +#: classes/gateways/class.pmprogateway_stripe.php:581 includes/privacy.php:293 +#: pages/billing.php:271 pages/checkout.php:423 adminpages/orders.php:339 +#: adminpages/orders.php:389 adminpages/orders.php:461 +#: adminpages/orders.php:490 adminpages/orders.php:532 +#: adminpages/orders.php:563 adminpages/orders.php:574 +#: classes/gateways/class.pmprogateway_braintree.php:291 +#: classes/gateways/class.pmprogateway_braintree.php:304 +#: classes/gateways/class.pmprogateway_braintree.php:306 +#: classes/gateways/class.pmprogateway_braintree.php:309 +#: classes/gateways/class.pmprogateway_braintree.php:310 +#: classes/gateways/class.pmprogateway_braintree.php:342 +#: classes/gateways/class.pmprogateway_braintree.php:344 +#: classes/gateways/class.pmprogateway_braintree.php:406 +#: classes/gateways/class.pmprogateway_braintree.php:441 +#: classes/gateways/class.pmprogateway_stripe.php:408 +#: classes/gateways/class.pmprogateway_stripe.php:409 +#: classes/gateways/class.pmprogateway_stripe.php:419 +#: classes/gateways/class.pmprogateway_stripe.php:423 +#: classes/gateways/class.pmprogateway_stripe.php:447 +#: classes/gateways/class.pmprogateway_stripe.php:450 +#: classes/gateways/class.pmprogateway_stripe.php:452 +#: classes/gateways/class.pmprogateway_stripe.php:455 +#: classes/gateways/class.pmprogateway_stripe.php:473 +#: classes/gateways/class.pmprogateway_stripe.php:484 +#: classes/gateways/class.pmprogateway_stripe.php:522 +#: classes/gateways/class.pmprogateway_stripe.php:549 +#: classes/gateways/class.pmprogateway_stripe.php:573 +#: classes/gateways/class.pmprogateway_stripe.php:589 +#: classes/gateways/class.pmprogateway_stripe.php:590 pages/billing.php:234 +#: pages/billing.php:238 pages/billing.php:247 pages/billing.php:250 +#: pages/billing.php:253 pages/billing.php:262 pages/billing.php:268 +#: pages/billing.php:274 pages/billing.php:275 pages/billing.php:294 +#: pages/checkout.php:493 pages/checkout.php:507 pages/checkout.php:510 +#: pages/checkout.php:516 pages/checkout.php:517 pages/checkout.php:525 +#: pages/checkout.php:527 pages/checkout.php:534 pages/checkout.php:537 +#: adminpages/orders.php:673 +#: classes/gateways/class.pmprogateway_braintree.php:466 +#: classes/gateways/class.pmprogateway_stripe.php:1272 pages/billing.php:333 +#: pages/checkout.php:378 adminpages/orders.php:679 +#: classes/gateways/class.pmprogateway_stripe.php:1284 +#: classes/gateways/class.pmprogateway_stripe.php:1303 +#: classes/gateways/class.pmprogateway_stripe.php:1309 +msgid "Card Type" +msgstr "Kreditkarte" + +#: adminpages/orders.php:624 adminpages/orders.php:344 +#: adminpages/orders.php:394 adminpages/orders.php:466 +#: adminpages/orders.php:495 adminpages/orders.php:540 +#: adminpages/orders.php:571 adminpages/orders.php:582 +#: adminpages/orders.php:683 adminpages/orders.php:689 +msgid "e.g. Visa, MasterCard, AMEX, etc" +msgstr "z.B. Visa, MasterCard, AMEX, etc" + +#: adminpages/orders.php:628 +#: classes/gateways/class.pmprogateway_twocheckout.php:137 +#: includes/privacy.php:297 adminpages/orders.php:348 adminpages/orders.php:398 +#: adminpages/orders.php:470 adminpages/orders.php:499 +#: adminpages/orders.php:544 adminpages/orders.php:575 +#: adminpages/orders.php:586 adminpages/paymentsettings.php:347 +#: adminpages/paymentsettings.php:352 +#: classes/gateways/class.pmprogateway_twocheckout.php:129 +#: classes/gateways/class.pmprogateway_twocheckout.php:148 +#: adminpages/orders.php:687 +#: classes/gateways/class.pmprogateway_twocheckout.php:138 +#: adminpages/orders.php:693 +msgid "Account Number" +msgstr "Konto Nummer" + +#: adminpages/orders.php:639 adminpages/orders.php:353 +#: adminpages/orders.php:403 adminpages/orders.php:475 +#: adminpages/orders.php:504 adminpages/orders.php:553 +#: adminpages/orders.php:584 adminpages/orders.php:595 +#: adminpages/orders.php:698 adminpages/orders.php:704 +msgid "Obscure all but last 4 digits." +msgstr "Alle Stellen verbergen, außer die letzten 4." + +#: adminpages/orders.php:649 includes/privacy.php:301 adminpages/orders.php:358 +#: adminpages/orders.php:408 adminpages/orders.php:480 +#: adminpages/orders.php:509 adminpages/orders.php:561 +#: adminpages/orders.php:592 adminpages/orders.php:603 +#: adminpages/orders.php:707 adminpages/orders.php:718 +#: adminpages/orders.php:713 adminpages/orders.php:724 +msgid "Expiration Month" +msgstr "Ablaufdatum Monat" + +#: adminpages/orders.php:657 includes/privacy.php:305 adminpages/orders.php:365 +#: adminpages/orders.php:415 adminpages/orders.php:487 +#: adminpages/orders.php:516 adminpages/orders.php:569 +#: adminpages/orders.php:600 adminpages/orders.php:611 +#: adminpages/orders.php:726 adminpages/orders.php:732 +msgid "Expiration Year" +msgstr "Ablaufdatum Jahr" + +#: adminpages/orders.php:667 adminpages/orders.php:1240 +#: includes/privacy.php:202 includes/privacy.php:309 adminpages/orders.php:373 +#: adminpages/orders.php:423 adminpages/orders.php:495 +#: adminpages/orders.php:524 adminpages/orders.php:579 +#: adminpages/orders.php:606 adminpages/orders.php:610 +#: adminpages/orders.php:621 adminpages/orders.php:909 +#: adminpages/orders.php:919 adminpages/orders.php:946 +#: adminpages/orders.php:975 adminpages/orders.php:1112 +#: adminpages/orders.php:1143 adminpages/orders.php:1149 +#: adminpages/dashboard.php:290 adminpages/orders.php:736 +#: adminpages/orders.php:1342 includes/profile.php:428 includes/profile.php:499 +#: pages/invoice.php:40 shortcodes/pmpro_account.php:226 +#: adminpages/dashboard.php:294 adminpages/orders.php:742 +#: adminpages/orders.php:1348 includes/profile.php:505 +msgid "Status" +msgstr "Status" + +#: adminpages/orders.php:689 adminpages/orders.php:1238 +#: classes/class.memberorder.php:764 includes/privacy.php:313 +#: adminpages/orders.php:394 adminpages/orders.php:444 +#: adminpages/orders.php:516 adminpages/orders.php:545 +#: adminpages/orders.php:604 adminpages/orders.php:612 +#: adminpages/orders.php:643 adminpages/orders.php:654 +#: adminpages/orders.php:907 adminpages/orders.php:917 +#: adminpages/orders.php:944 adminpages/orders.php:973 +#: adminpages/orders.php:1110 adminpages/orders.php:1141 +#: adminpages/orders.php:1147 classes/class.memberorder.php:744 +#: classes/class.memberorder.php:747 adminpages/orders.php:758 +#: adminpages/orders.php:1340 classes/class.memberorder.php:964 +#: adminpages/orders.php:764 adminpages/orders.php:1346 +msgid "Gateway" +msgstr "Zahlungsdienstleister" + +#: adminpages/orders.php:712 adminpages/paymentsettings.php:141 +#: includes/privacy.php:317 adminpages/orders.php:411 adminpages/orders.php:461 +#: adminpages/orders.php:462 adminpages/orders.php:534 +#: adminpages/orders.php:563 adminpages/orders.php:633 +#: adminpages/orders.php:664 adminpages/orders.php:675 +#: adminpages/paymentsettings.php:124 adminpages/paymentsettings.php:175 +#: adminpages/paymentsettings.php:179 adminpages/paymentsettings.php:184 +#: adminpages/orders.php:781 adminpages/paymentsettings.php:148 +#: adminpages/orders.php:787 +msgid "Gateway Environment" +msgstr "Zahlungsfunktion" + +#: adminpages/orders.php:724 adminpages/paymentsettings.php:145 +#: adminpages/orders.php:415 adminpages/orders.php:465 +#: adminpages/orders.php:466 adminpages/orders.php:538 +#: adminpages/orders.php:567 adminpages/orders.php:640 +#: adminpages/orders.php:671 adminpages/orders.php:682 +#: adminpages/paymentsettings.php:128 adminpages/paymentsettings.php:179 +#: adminpages/paymentsettings.php:183 adminpages/paymentsettings.php:188 +#: adminpages/orders.php:789 adminpages/paymentsettings.php:152 +#: adminpages/orders.php:795 classes/class-pmpro-site-health.php:195 +msgid "Sandbox/Testing" +msgstr "Sandbox/Testing" + +#: adminpages/orders.php:729 adminpages/paymentsettings.php:146 +#: adminpages/orders.php:416 adminpages/orders.php:466 +#: adminpages/orders.php:467 adminpages/orders.php:539 +#: adminpages/orders.php:568 adminpages/orders.php:642 +#: adminpages/orders.php:673 adminpages/orders.php:684 +#: adminpages/paymentsettings.php:129 adminpages/paymentsettings.php:180 +#: adminpages/paymentsettings.php:184 adminpages/paymentsettings.php:189 +#: adminpages/orders.php:790 adminpages/paymentsettings.php:153 +#: adminpages/orders.php:796 classes/class-pmpro-site-health.php:196 +msgid "Live/Production" +msgstr "Live/Production" + +#: adminpages/orders.php:737 includes/privacy.php:321 adminpages/orders.php:423 +#: adminpages/orders.php:473 adminpages/orders.php:474 +#: adminpages/orders.php:546 adminpages/orders.php:575 +#: adminpages/orders.php:650 adminpages/orders.php:681 +#: adminpages/orders.php:692 adminpages/orders.php:798 +#: adminpages/orders.php:804 +msgid "Payment Transaction ID" +msgstr "ID der Zahlungstransaktion" + +#: adminpages/orders.php:748 adminpages/orders.php:428 +#: adminpages/orders.php:478 adminpages/orders.php:479 +#: adminpages/orders.php:551 adminpages/orders.php:580 +#: adminpages/orders.php:659 adminpages/orders.php:690 +#: adminpages/orders.php:701 adminpages/orders.php:808 +#: adminpages/orders.php:814 +msgid "Generated by the gateway. Useful to cross reference orders." +msgstr "Vom Zahlungsdienstleister generiert. Hilfreich um Bestellungen zuzuordnen." + +#: adminpages/orders.php:753 classes/class.memberorder.php:765 +#: includes/privacy.php:325 adminpages/orders.php:432 adminpages/orders.php:482 +#: adminpages/orders.php:483 adminpages/orders.php:555 +#: adminpages/orders.php:584 adminpages/orders.php:664 +#: adminpages/orders.php:695 adminpages/orders.php:706 +#: classes/class.memberorder.php:745 classes/class.memberorder.php:748 +#: adminpages/orders.php:813 classes/class.memberorder.php:965 +#: adminpages/orders.php:819 +msgid "Subscription Transaction ID" +msgstr "Mitglieds-Transaktions-ID" + +#: adminpages/orders.php:765 adminpages/orders.php:437 +#: adminpages/orders.php:487 adminpages/orders.php:488 +#: adminpages/orders.php:560 adminpages/orders.php:589 +#: adminpages/orders.php:674 adminpages/orders.php:705 +#: adminpages/orders.php:716 adminpages/orders.php:824 +#: adminpages/orders.php:830 +msgid "Generated by the gateway. Useful to cross reference subscriptions." +msgstr "Vom Zahlungsdienstleister generiert. Hilfreich um Zahlungen zuzuordnen." + +#: adminpages/orders.php:770 adminpages/orders.php:1241 pages/invoice.php:100 +#: shortcodes/pmpro_account.php:127 adminpages/orders.php:442 +#: adminpages/orders.php:492 adminpages/orders.php:493 +#: adminpages/orders.php:565 adminpages/orders.php:594 +#: adminpages/orders.php:607 adminpages/orders.php:679 +#: adminpages/orders.php:710 adminpages/orders.php:721 +#: adminpages/orders.php:910 adminpages/orders.php:920 +#: adminpages/orders.php:947 adminpages/orders.php:976 +#: adminpages/orders.php:1113 adminpages/orders.php:1144 +#: adminpages/orders.php:1150 pages/account.php:91 pages/invoice.php:87 +#: pages/invoice.php:105 pages/invoice.php:107 shortcodes/pmpro_account.php:122 +#: shortcodes/pmpro_account.php:124 shortcodes/pmpro_account.php:125 +#: adminpages/dashboard.php:291 adminpages/orders.php:829 +#: adminpages/orders.php:1343 includes/profile.php:422 pages/invoice.php:122 +#: shortcodes/pmpro_account.php:223 adminpages/dashboard.php:295 +#: adminpages/orders.php:835 adminpages/orders.php:1349 +msgid "Date" +msgstr "Datum" + +#: adminpages/orders.php:812 adminpages/orders.php:477 +#: adminpages/orders.php:527 adminpages/orders.php:599 +#: adminpages/orders.php:628 adminpages/orders.php:716 +#: adminpages/orders.php:747 adminpages/orders.php:758 +#: adminpages/orders.php:874 adminpages/orders.php:880 +msgid "Affiliate ID" +msgstr "Partner-ID" + +#: adminpages/orders.php:826 adminpages/orders.php:485 +#: adminpages/orders.php:535 adminpages/orders.php:607 +#: adminpages/orders.php:636 adminpages/orders.php:728 +#: adminpages/orders.php:759 adminpages/orders.php:770 +#: adminpages/orders.php:887 adminpages/orders.php:893 +msgid "Affiliate SubID" +msgstr "Partner SubID" + +#: adminpages/orders.php:848 adminpages/orders.php:908 +#: adminpages/orders.php:914 +msgid "TOS Consent" +msgstr "AGB Zustimmung" + +#: adminpages/orders.php:865 adminpages/orders.php:495 +#: adminpages/orders.php:545 adminpages/orders.php:617 +#: adminpages/orders.php:646 adminpages/orders.php:742 +#: adminpages/orders.php:773 adminpages/orders.php:784 +#: adminpages/orders.php:923 adminpages/orders.php:929 +msgid "Notes" +msgstr "Anmerkungen" + +#: adminpages/orders.php:893 adminpages/orders.php:510 +#: adminpages/orders.php:560 adminpages/orders.php:632 +#: adminpages/orders.php:661 adminpages/orders.php:764 +#: adminpages/orders.php:795 adminpages/orders.php:806 +#: adminpages/orders.php:961 adminpages/orders.php:967 +msgid "Save Order" +msgstr "Auftrag speichern" + +#: adminpages/orders.php:929 adminpages/orders.php:667 +#: adminpages/orders.php:696 adminpages/orders.php:800 +#: adminpages/orders.php:831 adminpages/orders.php:842 +#: adminpages/functions.php:425 +msgid "Email Invoice" +msgstr "E-Mail-Rechnung" + +#: adminpages/orders.php:932 adminpages/orders.php:670 +#: adminpages/orders.php:699 adminpages/orders.php:803 +#: adminpages/orders.php:834 adminpages/orders.php:845 +#: adminpages/functions.php:428 +msgid "Send an invoice for this order to: " +msgstr "Sende eine Rechnung für diese Bestellung an:" + +#: adminpages/orders.php:934 adminpages/orders.php:672 +#: adminpages/orders.php:701 adminpages/orders.php:805 +#: adminpages/orders.php:836 adminpages/orders.php:847 +#: adminpages/functions.php:430 +msgid "Send Email" +msgstr "E-Mail senden" + +#: adminpages/orders.php:939 includes/adminpages.php:56 +#: includes/adminpages.php:172 adminpages/orders.php:520 +#: adminpages/orders.php:570 adminpages/orders.php:677 +#: adminpages/orders.php:706 adminpages/orders.php:810 +#: adminpages/orders.php:841 adminpages/orders.php:852 +#: includes/adminpages.php:17 includes/adminpages.php:55 +#: includes/adminpages.php:84 includes/adminpages.php:156 +#: includes/adminpages.php:163 includes/adminpages.php:167 +#: adminpages/admin_header.php:230 adminpages/discountcodes.php:820 +#: adminpages/orders.php:972 classes/class-pmpro-admin-activity-email.php:221 +#: includes/adminpages.php:53 includes/adminpages.php:170 +#: adminpages/discountcodes.php:882 adminpages/orders.php:978 +#: adminpages/discountcodes.php:884 +msgid "Orders" +msgstr "Bestellungen" + +#: adminpages/orders.php:941 adminpages/orders.php:521 +#: adminpages/orders.php:571 adminpages/orders.php:678 +#: adminpages/orders.php:707 adminpages/orders.php:812 +#: adminpages/orders.php:843 adminpages/orders.php:854 +#: adminpages/orders.php:973 adminpages/orders.php:979 +msgid "Add New Order" +msgstr "Neuen Auftrag hinzufügen" + +#: adminpages/orders.php:985 adminpages/orders.php:606 +#: adminpages/orders.php:713 adminpages/orders.php:742 +#: adminpages/orders.php:852 adminpages/orders.php:883 +#: adminpages/orders.php:894 adminpages/orders.php:1018 +#: adminpages/orders.php:1024 +msgid "Within a Date Range" +msgstr "Innerhalb eines Zeitraums" + +#: adminpages/orders.php:987 adminpages/orders.php:607 +#: adminpages/orders.php:714 adminpages/orders.php:743 +#: adminpages/orders.php:854 adminpages/orders.php:885 +#: adminpages/orders.php:896 adminpages/orders.php:1020 +#: adminpages/orders.php:1026 +msgid "Predefined Date Range" +msgstr "Vorgegebener Zeitraum" + +#: adminpages/orders.php:989 adminpages/orders.php:608 +#: adminpages/orders.php:715 adminpages/orders.php:744 +#: adminpages/orders.php:856 adminpages/orders.php:887 +#: adminpages/orders.php:898 adminpages/orders.php:1022 +#: adminpages/orders.php:1028 +msgid "Within a Level" +msgstr "Innerhalb eines Pakets" + +#: adminpages/orders.php:991 adminpages/orders.php:609 +#: adminpages/orders.php:716 adminpages/orders.php:745 +#: adminpages/orders.php:858 adminpages/orders.php:889 +#: adminpages/orders.php:900 adminpages/orders.php:1026 +#: adminpages/orders.php:1032 +msgid "Within a Status" +msgstr "Innerhalb eines Status" + +#: adminpages/orders.php:994 adminpages/orders.php:612 +#: adminpages/orders.php:719 adminpages/orders.php:748 +#: adminpages/orders.php:861 adminpages/orders.php:892 +#: adminpages/orders.php:903 adminpages/orders.php:1038 +#: adminpages/orders.php:1044 +msgid "From" +msgstr "Von" + +#: adminpages/orders.php:1009 adminpages/orders.php:624 +#: adminpages/orders.php:731 adminpages/orders.php:760 +#: adminpages/orders.php:876 adminpages/orders.php:907 +#: adminpages/orders.php:918 adminpages/orders.php:1053 +#: adminpages/orders.php:1059 +msgid "To" +msgstr "An" + +#: adminpages/orders.php:1022 adminpages/orders.php:636 +#: adminpages/orders.php:743 adminpages/orders.php:772 +#: adminpages/orders.php:889 adminpages/orders.php:920 +#: adminpages/orders.php:931 adminpages/orders.php:1066 +#: adminpages/orders.php:1072 +msgid "filter by " +msgstr "filtern nach " + +#: adminpages/orders.php:1060 adminpages/orders.php:674 +#: adminpages/orders.php:780 adminpages/orders.php:809 +#: adminpages/orders.php:932 adminpages/orders.php:963 +#: adminpages/orders.php:969 adminpages/orders.php:1116 +#: adminpages/orders.php:1122 +msgid "Filter" +msgstr "Filter" + +#: adminpages/orders.php:1157 adminpages/orders.php:1160 +#: adminpages/orders.php:535 adminpages/orders.php:538 +#: adminpages/orders.php:777 adminpages/orders.php:780 +#: adminpages/orders.php:883 adminpages/orders.php:886 +#: adminpages/orders.php:912 adminpages/orders.php:915 +#: adminpages/orders.php:1029 adminpages/orders.php:1032 +#: adminpages/orders.php:1060 adminpages/orders.php:1063 +#: adminpages/orders.php:1066 adminpages/orders.php:1069 +#: adminpages/orders.php:1250 adminpages/orders.php:1253 +#: adminpages/orders.php:1256 adminpages/orders.php:1259 +msgid "Search Orders" +msgstr "Bestellungen suchen" + +#: adminpages/orders.php:1224 adminpages/orders.php:590 +#: adminpages/orders.php:893 adminpages/orders.php:903 +#: adminpages/orders.php:930 adminpages/orders.php:959 +#: adminpages/orders.php:1096 adminpages/orders.php:1127 +#: adminpages/orders.php:1133 adminpages/orders.php:1326 +#: adminpages/orders.php:1332 +#, php-format +msgid "%d orders found." +msgstr "%d Bestellungen gefunden." + +#: adminpages/orders.php:1233 adminpages/reports/login.php:163 +#: classes/gateways/class.pmprogateway_payflowpro.php:116 +#: adminpages/orders.php:599 adminpages/orders.php:902 +#: adminpages/orders.php:912 adminpages/orders.php:939 +#: adminpages/orders.php:968 adminpages/orders.php:1105 +#: adminpages/orders.php:1136 adminpages/orders.php:1142 +#: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:215 +#: adminpages/paymentsettings.php:220 adminpages/reports/login.php:141 +#: adminpages/reports/login.php:143 adminpages/reports/login.php:159 +#: adminpages/dashboard.php:287 adminpages/orders.php:1335 +#: classes/gateways/class.pmprogateway_payflowpro.php:117 +#: adminpages/dashboard.php:291 adminpages/orders.php:1341 +msgid "User" +msgstr "Benutzer" + +#: adminpages/orders.php:1235 includes/init.php:244 includes/profile.php:36 +#: pages/checkout.php:34 pages/confirmation.php:53 pages/confirmation.php:124 +#: pages/invoice.php:28 adminpages/orders.php:601 adminpages/orders.php:904 +#: adminpages/orders.php:914 adminpages/orders.php:941 +#: adminpages/orders.php:970 adminpages/orders.php:1107 +#: adminpages/orders.php:1138 adminpages/orders.php:1144 includes/init.php:214 +#: includes/init.php:217 includes/init.php:218 includes/init.php:220 +#: includes/init.php:222 includes/init.php:230 includes/init.php:238 +#: includes/init.php:243 includes/profile.php:25 includes/profile.php:27 +#: includes/profile.php:30 pages/checkout.php:33 pages/checkout.php:35 +#: pages/checkout.php:42 pages/checkout.php:45 pages/confirmation.php:46 +#: pages/confirmation.php:47 pages/confirmation.php:62 +#: pages/confirmation.php:64 pages/confirmation.php:70 +#: pages/confirmation.php:91 pages/confirmation.php:103 +#: pages/confirmation.php:105 pages/confirmation.php:113 +#: pages/confirmation.php:116 pages/invoice.php:27 pages/invoice.php:49 +#: pages/invoice.php:51 pages/invoice.php:70 includes/init.php:177 +#: includes/profile.php:22 pages/checkout.php:63 pages/confirmation.php:65 +#: pages/confirmation.php:138 pages/invoice.php:38 +#: blocks/checkout-button/block.js:73 blocks/checkout-page/block.js:55 +#: blocks/checkout-page/inspector.js:31 js/blocks.build.js:798 +#: js/blocks.build.js:1004 js/blocks.build.js:1086 +msgid "Membership Level" +msgstr "Paket" + +#: adminpages/orders.php:1237 adminpages/orders.php:1335 +#: adminpages/orders.php:603 adminpages/orders.php:651 +#: adminpages/orders.php:906 adminpages/orders.php:916 +#: adminpages/orders.php:943 adminpages/orders.php:954 +#: adminpages/orders.php:972 adminpages/orders.php:982 +#: adminpages/orders.php:1011 adminpages/orders.php:1040 +#: adminpages/orders.php:1109 adminpages/orders.php:1140 +#: adminpages/orders.php:1146 adminpages/orders.php:1186 +#: adminpages/orders.php:1220 adminpages/orders.php:1226 +#: adminpages/orders.php:1339 adminpages/orders.php:1462 +#: adminpages/orders.php:1345 adminpages/orders.php:1539 +msgid "Payment" +msgstr "Zahlung" + +#: adminpages/orders.php:1239 adminpages/orders.php:605 +#: adminpages/orders.php:908 adminpages/orders.php:918 +#: adminpages/orders.php:945 adminpages/orders.php:974 +#: adminpages/orders.php:1111 adminpages/orders.php:1142 +#: adminpages/orders.php:1148 adminpages/orders.php:1341 +#: adminpages/orders.php:1347 +msgid "Transaction IDs" +msgstr "Transaktions-IDs" + +#: adminpages/orders.php:1273 adminpages/orders.php:630 +#: adminpages/orders.php:933 adminpages/orders.php:943 +#: adminpages/orders.php:972 adminpages/orders.php:1001 +#: adminpages/orders.php:1141 adminpages/orders.php:1172 +#: adminpages/orders.php:1178 adminpages/dashboard.php:315 +#: adminpages/dashboard.php:330 adminpages/orders.php:1406 +#: adminpages/orders.php:1418 adminpages/reports/history.php:49 +#: adminpages/dashboard.php:319 adminpages/dashboard.php:334 +#: adminpages/orders.php:1483 adminpages/orders.php:1495 +msgid "deleted" +msgstr "gelöscht" + +#: adminpages/orders.php:1275 adminpages/dashboard.php:317 +#: adminpages/dashboard.php:332 adminpages/orders.php:1408 +#: adminpages/orders.php:1420 adminpages/reports/history.php:51 +#: adminpages/dashboard.php:321 adminpages/dashboard.php:336 +#: adminpages/orders.php:1485 adminpages/orders.php:1497 +msgid "none" +msgstr "keine" + +#: adminpages/orders.php:1344 adminpages/orders.php:653 +#: adminpages/orders.php:956 adminpages/orders.php:974 +#: adminpages/orders.php:984 adminpages/orders.php:1013 +#: adminpages/orders.php:1042 adminpages/orders.php:1192 +#: adminpages/orders.php:1226 adminpages/orders.php:1232 +#: adminpages/orders.php:1471 adminpages/orders.php:1548 +msgid "Subscription" +msgstr "Abonnement" + +#. translators: %s is the Order Code. +#: adminpages/orders.php:1366 adminpages/orders.php:664 +#: adminpages/orders.php:967 adminpages/orders.php:985 +#: adminpages/orders.php:995 adminpages/orders.php:998 +#: adminpages/orders.php:1027 adminpages/orders.php:1056 +#: adminpages/orders.php:1211 adminpages/orders.php:1245 +#: adminpages/orders.php:1251 adminpages/orders.php:1372 +#: adminpages/orders.php:1375 +#, php-format +msgid "Deleting orders is permanent and can affect active users. Are you sure you want to delete order %s?" +msgstr "Das Löschen von Bestellungen ist dauerhaft und kann aktive Benutzer betreffen. Sind Sie sicher, dass Sie die Bestellung %s löschen wollen?" + +#: adminpages/orders.php:1370 adminpages/orders.php:1030 +#: adminpages/orders.php:1059 adminpages/orders.php:1215 +#: adminpages/orders.php:1249 adminpages/orders.php:1255 +msgid "print" +msgstr "Drucken" + +#: adminpages/orders.php:1374 adminpages/orders.php:1033 +#: adminpages/orders.php:1062 adminpages/orders.php:1219 +#: adminpages/orders.php:1253 adminpages/orders.php:1259 +msgid "email" +msgstr "E-Mail" + +#: adminpages/orders.php:1383 adminpages/orders.php:674 +#: adminpages/orders.php:977 adminpages/orders.php:995 +#: adminpages/orders.php:1005 adminpages/orders.php:1008 +#: adminpages/orders.php:1043 adminpages/orders.php:1072 +#: adminpages/orders.php:1228 adminpages/orders.php:1262 +#: adminpages/orders.php:1268 adminpages/dashboard.php:298 +#: adminpages/orders.php:1500 adminpages/dashboard.php:302 +#: adminpages/orders.php:1577 adminpages/orders.php:1576 +msgid "No orders found." +msgstr "Keine Bestellungen gefunden." + +#: adminpages/pagesettings.php:62 adminpages/pagesettings.php:54 +#: adminpages/pagesettings.php:55 adminpages/pagesettings.php:66 +msgid "Your page settings have been updated." +msgstr "Ihre Seiteneinstellungen wurden aktualisiert." + +#: adminpages/pagesettings.php:79 adminpages/pagesettings.php:51 +#: adminpages/pagesettings.php:64 adminpages/pagesettings.php:65 +#: adminpages/pagesettings.php:92 +msgid "Membership Account" +msgstr "Mitgliedskonto" + +#: adminpages/pagesettings.php:80 adminpages/pagesettings.php:54 +#: adminpages/pagesettings.php:65 adminpages/pagesettings.php:66 +#: adminpages/pagesettings.php:93 +msgid "Membership Billing" +msgstr "Zahlungsinformationen" + +#: adminpages/pagesettings.php:81 adminpages/pagesettings.php:57 +#: adminpages/pagesettings.php:66 adminpages/pagesettings.php:67 +#: adminpages/pagesettings.php:94 +msgid "Membership Cancel" +msgstr "Konto löschen" + +#: adminpages/pagesettings.php:82 adminpages/pagesettings.php:60 +#: adminpages/pagesettings.php:67 adminpages/pagesettings.php:68 +#: adminpages/pagesettings.php:95 +msgid "Membership Checkout" +msgstr "Checkout" + +#: adminpages/pagesettings.php:83 adminpages/pagesettings.php:63 +#: adminpages/pagesettings.php:68 adminpages/pagesettings.php:69 +#: adminpages/pagesettings.php:96 +msgid "Membership Confirmation" +msgstr "Bestätigung" + +#: adminpages/pagesettings.php:84 adminpages/pagesettings.php:66 +#: adminpages/pagesettings.php:69 adminpages/pagesettings.php:70 +#: adminpages/pagesettings.php:97 +msgid "Membership Invoice" +msgstr "Rechnung" + +#: adminpages/pagesettings.php:98 adminpages/pagesettings.php:83 +#: adminpages/pagesettings.php:84 adminpages/pagesettings.php:111 +#: adminpages/pagesettings.php:138 +msgid "The following pages have been created for you" +msgstr "Folgende Seiten wurden für Sie erstellt" + +#: adminpages/pagesettings.php:113 adminpages/pagesettings.php:97 +#: adminpages/pagesettings.php:98 adminpages/pagesettings.php:126 +#: adminpages/pagesettings.php:167 +msgid "Manage the WordPress pages assigned to each required Paid Memberships Pro page." +msgstr "Bearbeiten der WordPress Seiten, die den erforderlichen Paid Memberships Pro Seiten zugeordnet sind." + +#: adminpages/pagesettings.php:117 adminpages/pagesettings.php:101 +#: adminpages/pagesettings.php:102 adminpages/pagesettings.php:104 +#: adminpages/pagesettings.php:132 adminpages/pagesettings.php:169 +msgid "Assign the WordPress pages for each required Paid Memberships Pro page or" +msgstr "Ordnen Sie Ihre WordPress Seiten allen erforderlichen Paid Memberships Pro Seiten zu oder " + +#: adminpages/pagesettings.php:118 adminpages/pagesettings.php:102 +#: adminpages/pagesettings.php:103 adminpages/pagesettings.php:104 +#: adminpages/pagesettings.php:132 adminpages/pagesettings.php:170 +msgid "click here to let us generate them for you" +msgstr "klicken Sie hier, um sie automatisch zu erzeugen" + +#: adminpages/pagesettings.php:127 adminpages/pagesettings.php:111 +#: adminpages/pagesettings.php:112 adminpages/pagesettings.php:140 +#: adminpages/pagesettings.php:186 +msgid "Account Page" +msgstr "Konto Seite" + +#: adminpages/pagesettings.php:131 adminpages/pagesettings.php:149 +#: adminpages/pagesettings.php:167 adminpages/pagesettings.php:186 +#: adminpages/pagesettings.php:205 adminpages/pagesettings.php:225 +#: adminpages/pagesettings.php:244 adminpages/pagesettings.php:284 +#: adminpages/pagesettings.php:115 adminpages/pagesettings.php:116 +#: adminpages/pagesettings.php:133 adminpages/pagesettings.php:134 +#: adminpages/pagesettings.php:144 adminpages/pagesettings.php:147 +#: adminpages/pagesettings.php:151 adminpages/pagesettings.php:152 +#: adminpages/pagesettings.php:159 adminpages/pagesettings.php:162 +#: adminpages/pagesettings.php:170 adminpages/pagesettings.php:171 +#: adminpages/pagesettings.php:174 adminpages/pagesettings.php:177 +#: adminpages/pagesettings.php:189 adminpages/pagesettings.php:190 +#: adminpages/pagesettings.php:193 adminpages/pagesettings.php:206 +#: adminpages/pagesettings.php:209 adminpages/pagesettings.php:210 +#: adminpages/pagesettings.php:222 adminpages/pagesettings.php:228 +#: adminpages/pagesettings.php:229 adminpages/pagesettings.php:238 +#: adminpages/pagesettings.php:241 adminpages/pagesettings.php:268 +#: adminpages/pagesettings.php:269 adminpages/pagesettings.php:207 +#: adminpages/pagesettings.php:224 adminpages/pagesettings.php:242 +#: adminpages/pagesettings.php:260 adminpages/pagesettings.php:278 +#: adminpages/pagesettings.php:296 adminpages/pagesettings.php:414 +msgid "Choose One" +msgstr "Bitte wählen" + +#: adminpages/pagesettings.php:135 adminpages/pagesettings.php:153 +#: adminpages/pagesettings.php:171 adminpages/pagesettings.php:190 +#: adminpages/pagesettings.php:209 adminpages/pagesettings.php:229 +#: adminpages/pagesettings.php:248 adminpages/pagesettings.php:290 +#: adminpages/pagesettings.php:119 adminpages/pagesettings.php:120 +#: adminpages/pagesettings.php:132 adminpages/pagesettings.php:134 +#: adminpages/pagesettings.php:137 adminpages/pagesettings.php:138 +#: adminpages/pagesettings.php:145 adminpages/pagesettings.php:147 +#: adminpages/pagesettings.php:149 adminpages/pagesettings.php:150 +#: adminpages/pagesettings.php:155 adminpages/pagesettings.php:156 +#: adminpages/pagesettings.php:159 adminpages/pagesettings.php:162 +#: adminpages/pagesettings.php:165 adminpages/pagesettings.php:173 +#: adminpages/pagesettings.php:174 adminpages/pagesettings.php:175 +#: adminpages/pagesettings.php:177 adminpages/pagesettings.php:180 +#: adminpages/pagesettings.php:181 adminpages/pagesettings.php:187 +#: adminpages/pagesettings.php:193 adminpages/pagesettings.php:194 +#: adminpages/pagesettings.php:196 adminpages/pagesettings.php:197 +#: adminpages/pagesettings.php:201 adminpages/pagesettings.php:212 +#: adminpages/pagesettings.php:213 adminpages/pagesettings.php:214 +#: adminpages/pagesettings.php:225 adminpages/pagesettings.php:228 +#: adminpages/pagesettings.php:232 adminpages/pagesettings.php:233 +#: adminpages/pagesettings.php:241 adminpages/pagesettings.php:244 +#: adminpages/pagesettings.php:274 adminpages/pagesettings.php:275 +#: adminpages/pagesettings.php:211 adminpages/pagesettings.php:246 +#: adminpages/pagesettings.php:264 adminpages/pagesettings.php:282 +#: adminpages/pagesettings.php:300 adminpages/pagesettings.php:336 +#: adminpages/pagesettings.php:364 adminpages/pagesettings.php:420 +msgid "edit page" +msgstr "Seite bearbeiten" + +#: adminpages/pagesettings.php:138 adminpages/pagesettings.php:156 +#: adminpages/pagesettings.php:174 adminpages/pagesettings.php:193 +#: adminpages/pagesettings.php:212 adminpages/pagesettings.php:232 +#: adminpages/pagesettings.php:251 adminpages/pagesettings.php:293 +#: adminpages/pagesettings.php:121 adminpages/pagesettings.php:122 +#: adminpages/pagesettings.php:123 adminpages/pagesettings.php:136 +#: adminpages/pagesettings.php:140 adminpages/pagesettings.php:141 +#: adminpages/pagesettings.php:149 adminpages/pagesettings.php:151 +#: adminpages/pagesettings.php:152 adminpages/pagesettings.php:158 +#: adminpages/pagesettings.php:159 adminpages/pagesettings.php:164 +#: adminpages/pagesettings.php:167 adminpages/pagesettings.php:177 +#: adminpages/pagesettings.php:178 adminpages/pagesettings.php:179 +#: adminpages/pagesettings.php:182 adminpages/pagesettings.php:183 +#: adminpages/pagesettings.php:195 adminpages/pagesettings.php:196 +#: adminpages/pagesettings.php:197 adminpages/pagesettings.php:198 +#: adminpages/pagesettings.php:199 adminpages/pagesettings.php:211 +#: adminpages/pagesettings.php:214 adminpages/pagesettings.php:215 +#: adminpages/pagesettings.php:216 adminpages/pagesettings.php:217 +#: adminpages/pagesettings.php:227 adminpages/pagesettings.php:230 +#: adminpages/pagesettings.php:235 adminpages/pagesettings.php:236 +#: adminpages/pagesettings.php:243 adminpages/pagesettings.php:246 +#: adminpages/pagesettings.php:277 adminpages/pagesettings.php:278 +#: adminpages/pagesettings.php:231 adminpages/pagesettings.php:249 +#: adminpages/pagesettings.php:267 adminpages/pagesettings.php:285 +#: adminpages/pagesettings.php:303 adminpages/pagesettings.php:339 +#: adminpages/pagesettings.php:367 adminpages/pagesettings.php:423 +msgid "view page" +msgstr "Seite ansehen" + +#: adminpages/pagesettings.php:141 adminpages/pagesettings.php:159 +#: adminpages/pagesettings.php:177 adminpages/pagesettings.php:196 +#: adminpages/pagesettings.php:215 adminpages/pagesettings.php:235 +#: adminpages/pagesettings.php:254 adminpages/pagesettings.php:121 +#: adminpages/pagesettings.php:123 adminpages/pagesettings.php:125 +#: adminpages/pagesettings.php:126 adminpages/pagesettings.php:134 +#: adminpages/pagesettings.php:138 adminpages/pagesettings.php:143 +#: adminpages/pagesettings.php:144 adminpages/pagesettings.php:147 +#: adminpages/pagesettings.php:151 adminpages/pagesettings.php:153 +#: adminpages/pagesettings.php:154 adminpages/pagesettings.php:161 +#: adminpages/pagesettings.php:162 adminpages/pagesettings.php:166 +#: adminpages/pagesettings.php:169 adminpages/pagesettings.php:175 +#: adminpages/pagesettings.php:180 adminpages/pagesettings.php:181 +#: adminpages/pagesettings.php:184 adminpages/pagesettings.php:185 +#: adminpages/pagesettings.php:189 adminpages/pagesettings.php:197 +#: adminpages/pagesettings.php:199 adminpages/pagesettings.php:200 +#: adminpages/pagesettings.php:201 adminpages/pagesettings.php:203 +#: adminpages/pagesettings.php:213 adminpages/pagesettings.php:216 +#: adminpages/pagesettings.php:217 adminpages/pagesettings.php:219 +#: adminpages/pagesettings.php:220 adminpages/pagesettings.php:229 +#: adminpages/pagesettings.php:232 adminpages/pagesettings.php:238 +#: adminpages/pagesettings.php:239 adminpages/pagesettings.php:245 +#: adminpages/pagesettings.php:248 adminpages/pagesettings.php:233 +#: adminpages/pagesettings.php:251 adminpages/pagesettings.php:269 +#: adminpages/pagesettings.php:287 adminpages/pagesettings.php:305 +msgid "Include the shortcode" +msgstr "Shortcode einfügen" + +#: adminpages/pagesettings.php:145 adminpages/pagesettings.php:125 +#: adminpages/pagesettings.php:127 adminpages/pagesettings.php:129 +#: adminpages/pagesettings.php:130 adminpages/pagesettings.php:155 +#: adminpages/pagesettings.php:158 adminpages/pagesettings.php:203 +msgid "Billing Information Page" +msgstr "Seite mit Informationen zur Rechnungsstellung" + +#: adminpages/pagesettings.php:163 adminpages/pagesettings.php:138 +#: adminpages/pagesettings.php:142 adminpages/pagesettings.php:147 +#: adminpages/pagesettings.php:148 adminpages/pagesettings.php:170 +#: adminpages/pagesettings.php:173 adminpages/pagesettings.php:220 +msgid "Cancel Page" +msgstr "Storno-Seite" + +#: adminpages/pagesettings.php:182 adminpages/pagesettings.php:152 +#: adminpages/pagesettings.php:158 adminpages/pagesettings.php:166 +#: adminpages/pagesettings.php:167 adminpages/pagesettings.php:186 +#: adminpages/pagesettings.php:189 adminpages/pagesettings.php:238 +msgid "Checkout Page" +msgstr "Checkout-Seite" + +#: adminpages/pagesettings.php:201 adminpages/pagesettings.php:166 +#: adminpages/pagesettings.php:174 adminpages/pagesettings.php:185 +#: adminpages/pagesettings.php:186 adminpages/pagesettings.php:202 +#: adminpages/pagesettings.php:205 adminpages/pagesettings.php:256 +msgid "Confirmation Page" +msgstr "Bestätigungs-Seite" + +#: adminpages/pagesettings.php:221 adminpages/pagesettings.php:180 +#: adminpages/pagesettings.php:190 adminpages/pagesettings.php:205 +#: adminpages/pagesettings.php:206 adminpages/pagesettings.php:218 +#: adminpages/pagesettings.php:274 +msgid "Invoice Page" +msgstr "Rechnungs-Seite" + +#: adminpages/pagesettings.php:240 adminpages/pagesettings.php:194 +#: adminpages/pagesettings.php:206 adminpages/pagesettings.php:224 +#: adminpages/pagesettings.php:225 adminpages/pagesettings.php:234 +#: adminpages/pagesettings.php:237 adminpages/pagesettings.php:292 +msgid "Levels Page" +msgstr "Paket-Seite" + +#: adminpages/pagesettings.php:261 adminpages/pagesettings.php:245 +#: adminpages/pagesettings.php:246 adminpages/pagesettings.php:391 +msgid "Additional Page Settings" +msgstr "Zusätzliche Seiteneinstellungen" + +#: adminpages/pagesettings.php:296 adminpages/pagesettings.php:280 +#: adminpages/pagesettings.php:281 adminpages/pagesettings.php:342 +#: adminpages/pagesettings.php:370 adminpages/pagesettings.php:426 +msgid "Generate Page" +msgstr "Seite erstellen" + +#: adminpages/paymentsettings.php:64 adminpages/paymentsettings.php:49 +#: adminpages/paymentsettings.php:77 adminpages/paymentsettings.php:82 +#: adminpages/paymentsettings.php:66 +msgid "Your payment settings have been updated." +msgstr "Ihre Zahlungs-Einstellungen wurden gespeichert." + +#: adminpages/paymentsettings.php:110 adminpages/paymentsettings.php:123 +#: adminpages/paymentsettings.php:93 adminpages/paymentsettings.php:106 +#: adminpages/paymentsettings.php:144 adminpages/paymentsettings.php:146 +#: adminpages/paymentsettings.php:152 adminpages/paymentsettings.php:154 +#: adminpages/paymentsettings.php:112 adminpages/paymentsettings.php:127 +msgid "Payment Gateway" +msgstr "Zahlungsdienstleister" + +#: adminpages/paymentsettings.php:110 adminpages/paymentsettings.php:218 +#: adminpages/paymentsettings.php:93 adminpages/paymentsettings.php:144 +#: adminpages/paymentsettings.php:146 adminpages/paymentsettings.php:201 +#: adminpages/paymentsettings.php:112 adminpages/paymentsettings.php:248 +msgid "SSL Settings" +msgstr "SSL Einstellungen" + +#: adminpages/paymentsettings.php:112 adminpages/paymentsettings.php:95 +#: adminpages/paymentsettings.php:148 +msgid "Learn more about SSL or Payment Gateway Settings." +msgstr "Erfahren Sie mehr über SSL oder Zahlungsdienstleister Einstellungen." + +#: adminpages/paymentsettings.php:118 adminpages/paymentsettings.php:101 +#: adminpages/paymentsettings.php:122 +msgid "Choose a Gateway" +msgstr "Gateway wählen" + +#: adminpages/paymentsettings.php:165 adminpages/paymentsettings.php:148 +#: adminpages/paymentsettings.php:194 +msgid "Currency and Tax Settings" +msgstr "Währungs- und Steuereinstellungen" + +#: adminpages/paymentsettings.php:170 adminpages/paymentsettings.php:153 +#: adminpages/paymentsettings.php:327 adminpages/paymentsettings.php:337 +#: adminpages/paymentsettings.php:356 adminpages/paymentsettings.php:381 +#: adminpages/paymentsettings.php:386 adminpages/paymentsettings.php:199 +msgid "Currency" +msgstr "Währung" + +#: adminpages/paymentsettings.php:186 adminpages/paymentsettings.php:169 +#: adminpages/paymentsettings.php:400 adminpages/paymentsettings.php:402 +#: adminpages/paymentsettings.php:215 +msgid "Not all currencies will be supported by every gateway. Please check with your gateway." +msgstr "Nicht alle Währungen werden von allen Zahlungsdienstleistern unterstützt. Bitte überprüfen Sie dies bei Ihrem Zahlungsdienstleister." + +#: adminpages/paymentsettings.php:191 adminpages/paymentsettings.php:174 +#: adminpages/paymentsettings.php:375 adminpages/paymentsettings.php:401 +#: adminpages/paymentsettings.php:406 adminpages/paymentsettings.php:408 +#: adminpages/paymentsettings.php:220 +msgid "Accepted Credit Card Types" +msgstr "Akzeptierete Kreditkarten" + +#: adminpages/paymentsettings.php:205 adminpages/paymentsettings.php:188 +#: adminpages/paymentsettings.php:398 adminpages/paymentsettings.php:438 +#: adminpages/paymentsettings.php:443 adminpages/paymentsettings.php:445 +#: adminpages/paymentsettings.php:234 +msgid "Sales Tax" +msgstr "Mehrwertsteuer" + +#: adminpages/paymentsettings.php:205 pages/billing.php:117 +#: adminpages/paymentsettings.php:188 adminpages/paymentsettings.php:398 +#: adminpages/paymentsettings.php:438 adminpages/paymentsettings.php:443 +#: adminpages/paymentsettings.php:445 pages/billing.php:78 pages/billing.php:82 +#: pages/billing.php:91 pages/billing.php:94 pages/billing.php:96 +#: pages/billing.php:97 pages/billing.php:100 pages/billing.php:120 +#: pages/billing.php:121 pages/billing.php:123 +#: adminpages/paymentsettings.php:234 pages/billing.php:179 +msgid "optional" +msgstr "optional" + +#: adminpages/paymentsettings.php:208 adminpages/paymentsettings.php:191 +#: adminpages/paymentsettings.php:401 adminpages/paymentsettings.php:441 +#: adminpages/paymentsettings.php:446 adminpages/paymentsettings.php:448 +#: adminpages/paymentsettings.php:237 +msgid "Tax State" +msgstr "Steuerstaat" + +#: adminpages/paymentsettings.php:209 adminpages/paymentsettings.php:192 +#: adminpages/paymentsettings.php:402 adminpages/paymentsettings.php:442 +#: adminpages/paymentsettings.php:447 adminpages/paymentsettings.php:449 +#: adminpages/paymentsettings.php:238 +msgid "abbreviation, e.g. \"PA\"" +msgstr "Abkürzung, z.B. \"PA\"" + +#: adminpages/paymentsettings.php:210 adminpages/paymentsettings.php:193 +#: adminpages/paymentsettings.php:239 +msgid "Tax Rate" +msgstr "Steuersatz" + +#: adminpages/paymentsettings.php:211 adminpages/paymentsettings.php:194 +#: adminpages/paymentsettings.php:404 adminpages/paymentsettings.php:444 +#: adminpages/paymentsettings.php:449 adminpages/paymentsettings.php:451 +#: adminpages/paymentsettings.php:240 +msgid "decimal, e.g. \"0.06\"" +msgstr "dezimal, z.B. \"0.06\"" + +#: adminpages/paymentsettings.php:212 +msgid "US only. If values are given, tax will be applied for any members ordering from the selected state.
    For non-US or more complex tax rules, use the pmpro_tax filter." +msgstr "Nur für USA. Wenn Werte angegeben werden, werden die Steuern für Kunden aus dem jeweiligen Staat berechnet.
    Für Nicht-US- oder komplexere Steuersätze, verwenden Sie die pmpro_tax-Filter." + +#: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:206 +#: adminpages/paymentsettings.php:450 adminpages/paymentsettings.php:455 +#: adminpages/paymentsettings.php:457 adminpages/paymentsettings.php:253 +msgid "Force SSL" +msgstr "Erzwinge SSL" + +#: adminpages/paymentsettings.php:230 adminpages/paymentsettings.php:213 +#: adminpages/paymentsettings.php:260 +msgid "Your Site URL starts with https:// and so PMPro will allow your entire site to be served over HTTPS." +msgstr "Ihre Seite URL beginnt mit https:// daher wird PMPro zulassen dass Ihre gesamte Seite über HTTPS bedient wird." + +#: adminpages/paymentsettings.php:238 adminpages/paymentsettings.php:212 +#: adminpages/paymentsettings.php:221 adminpages/paymentsettings.php:456 +#: adminpages/paymentsettings.php:461 adminpages/paymentsettings.php:463 +#: adminpages/paymentsettings.php:268 +msgid "Yes (with JavaScript redirects)" +msgstr "Ja (mit JavaScript Weiterleitungen)" + +#: adminpages/paymentsettings.php:240 adminpages/paymentsettings.php:214 +#: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:270 +msgid "Recommended: Yes. Try the JavaScript redirects setting if you are having issues with infinite redirect loops." +msgstr "Empfehlung: Ja. Versuchen Sie die JavaScript Weiterleitungseinstellungen wenn Sie probleme mit unendlichen Umleitungsschleifen haben." + +#: adminpages/paymentsettings.php:248 adminpages/paymentsettings.php:219 +#: adminpages/paymentsettings.php:231 adminpages/paymentsettings.php:430 +#: adminpages/paymentsettings.php:463 adminpages/paymentsettings.php:468 +#: adminpages/paymentsettings.php:470 adminpages/paymentsettings.php:278 +msgid "SSL Seal Code" +msgstr "SSL Seal Code" + +#: adminpages/paymentsettings.php:252 +msgid "Your SSL Certificate must be installed by your web host. Your SSL Seal will be a short HTML or JavaScript snippet that can be pasted here." +msgstr "Ihr SSL Zertifikat muss von Ihrem Webhost installiert werden. Ihr SSL Siegel ist ein kurzer HTML- oder JavaScript-Text, der hier eingefügt werden kann." + +#: adminpages/paymentsettings.php:257 adminpages/paymentsettings.php:228 +#: adminpages/paymentsettings.php:240 adminpages/paymentsettings.php:287 +msgid "Extra HTTPS URL Filter" +msgstr "Extra HTTPS URL Filter" + +#: adminpages/paymentsettings.php:260 adminpages/paymentsettings.php:231 +#: adminpages/paymentsettings.php:243 adminpages/paymentsettings.php:290 +msgid "Pass all generated HTML through a URL filter to add HTTPS to URLs used on secure pages. Check this if you are using SSL and have warnings on your checkout pages." +msgstr "Alles erzeugte HTML durch einen URL-Filter führen, um HTTPS an URLs von sicheren Seiten hinzuzufügen. Aktivieren Sie das wenn Sie SSL verwenden und Warnungen auf Ihrer Checkout-Seite sehen." + +#: adminpages/reports.php:41 adminpages/reports.php:26 +#: adminpages/reports.php:37 adminpages/reports.php:40 +#: adminpages/reports/history.php:70 adminpages/reports/login.php:71 +#: adminpages/reports/memberships.php:96 adminpages/reports/sales.php:99 +msgid "Details" +msgstr "Details" + +#: adminpages/reports.php:63 adminpages/reports.php:61 +#: adminpages/reports.php:19 +msgid "Back to Reports Dashboard" +msgstr "Zurück zum Berichte-Dashboard" + +#: adminpages/reports/login.php:16 adminpages/dashboard.php:33 +msgid "Visits, Views, and Logins" +msgstr "Besucher, Ansichten und Logins" + +#: adminpages/reports/login.php:31 +msgid "Visits" +msgstr "Besuche" + +#: adminpages/reports/login.php:32 +msgid "Views" +msgstr "Ansichten" + +#: adminpages/reports/login.php:33 +msgid "Logins" +msgstr "Anmeldungen" + +#: adminpages/reports/login.php:38 adminpages/reports/memberships.php:68 +#: adminpages/reports/sales.php:52 adminpages/reports/memberships.php:43 +#: adminpages/reports/memberships.php:46 adminpages/reports/memberships.php:62 +#: adminpages/reports/memberships.php:81 adminpages/reports/sales.php:51 +#: adminpages/reports/memberships.php:49 adminpages/reports/sales.php:50 +msgid "Today" +msgstr "Heute" + +#: adminpages/reports/login.php:44 adminpages/reports/memberships.php:69 +#: adminpages/reports/sales.php:57 adminpages/reports/memberships.php:47 +#: adminpages/reports/memberships.php:48 adminpages/reports/memberships.php:58 +#: adminpages/reports/memberships.php:77 adminpages/reports/sales.php:56 +#: adminpages/orders.php:1071 adminpages/reports/login.php:50 +#: adminpages/reports/memberships.php:50 adminpages/reports/sales.php:51 +#: adminpages/orders.php:1077 +msgid "This Month" +msgstr "Dieser Monat" + +#: adminpages/reports/login.php:50 adminpages/reports/memberships.php:71 +#: adminpages/reports/sales.php:67 adminpages/reports/memberships.php:49 +#: adminpages/reports/memberships.php:50 adminpages/reports/memberships.php:58 +#: adminpages/reports/memberships.php:69 adminpages/reports/sales.php:66 +#: adminpages/reports/login.php:62 adminpages/reports/memberships.php:52 +#: adminpages/reports/sales.php:53 +msgid "All Time" +msgstr "Gesamte Zeit" + +#: adminpages/reports/login.php:83 adminpages/reports/login.php:61 +#: adminpages/reports/login.php:63 adminpages/reports/login.php:79 +#: adminpages/reports/login.php:99 +msgid "Visits, Views, and Logins Report" +msgstr "Besucher, Ansichten und Login Berichte" + +#: adminpages/reports/login.php:88 adminpages/reports/login.php:66 +#: adminpages/reports/login.php:68 adminpages/reports/login.php:84 +#: adminpages/reports/login.php:104 +#: classes/class-pmpro-members-list-table.php:234 +#: classes/class-pmpro-members-list-table.php:233 +msgid "All Users" +msgstr "Alle Benutzer" + +#: adminpages/reports/login.php:168 adminpages/reports/login.php:146 +#: adminpages/reports/login.php:148 adminpages/reports/login.php:164 +#: adminpages/reports/login.php:185 +msgid "Last Visit" +msgstr "Letzter Besuch" + +#: adminpages/reports/login.php:169 adminpages/reports/login.php:27 +#: adminpages/reports/login.php:28 adminpages/reports/login.php:147 +#: adminpages/reports/login.php:149 adminpages/reports/login.php:165 +#: adminpages/reports/login.php:187 +msgid "Visits This Month" +msgstr "Besuche diesen Monat" + +#: adminpages/reports/login.php:170 adminpages/reports/login.php:148 +#: adminpages/reports/login.php:150 adminpages/reports/login.php:166 +msgid "Total Visits" +msgstr "Besucher Gesamt" + +#: adminpages/reports/login.php:171 adminpages/reports/login.php:32 +#: adminpages/reports/login.php:33 adminpages/reports/login.php:149 +#: adminpages/reports/login.php:151 adminpages/reports/login.php:167 +#: adminpages/reports/login.php:191 +msgid "Views This Month" +msgstr "Ansichten in diesem Monat" + +#: adminpages/reports/login.php:172 adminpages/reports/login.php:150 +#: adminpages/reports/login.php:152 adminpages/reports/login.php:168 +msgid "Total Views" +msgstr "Ansichten insgesamt" + +#: adminpages/reports/login.php:173 adminpages/reports/login.php:151 +#: adminpages/reports/login.php:153 adminpages/reports/login.php:169 +#: adminpages/reports/login.php:194 +msgid "Last Login" +msgstr "Letzter Login" + +#: adminpages/reports/login.php:174 adminpages/reports/login.php:37 +#: adminpages/reports/login.php:38 adminpages/reports/login.php:152 +#: adminpages/reports/login.php:154 adminpages/reports/login.php:170 +#: adminpages/reports/login.php:196 +msgid "Logins This Month" +msgstr "Logins diesen Monat" + +#: adminpages/reports/login.php:175 adminpages/reports/login.php:153 +#: adminpages/reports/login.php:155 adminpages/reports/login.php:171 +msgid "Total Logins" +msgstr "Logins Gesamt" + +#: adminpages/reports/memberships.php:18 adminpages/reports/memberships.php:324 +#: adminpages/reports/memberships.php:252 +#: adminpages/reports/memberships.php:259 +#: adminpages/reports/memberships.php:272 +#: adminpages/reports/memberships.php:288 +#: adminpages/reports/memberships.php:300 adminpages/dashboard.php:26 +#: adminpages/reports/memberships.php:327 +msgid "Membership Stats" +msgstr "Mitglieder-Statistiken" + +#: adminpages/reports/memberships.php:62 adminpages/reports/memberships.php:37 +#: adminpages/reports/memberships.php:40 adminpages/reports/memberships.php:48 +#: adminpages/reports/memberships.php:43 +msgid "Signups" +msgstr "Registrierungen" + +#: adminpages/reports/memberships.php:63 adminpages/reports/memberships.php:38 +#: adminpages/reports/memberships.php:41 adminpages/reports/memberships.php:44 +msgid "All Cancellations" +msgstr "Alle Stornierungen" + +#: adminpages/reports/memberships.php:70 adminpages/reports/sales.php:62 +#: adminpages/reports/memberships.php:48 adminpages/reports/memberships.php:53 +#: adminpages/reports/memberships.php:54 adminpages/reports/memberships.php:73 +#: adminpages/reports/sales.php:61 adminpages/orders.php:1075 +#: adminpages/reports/memberships.php:51 adminpages/reports/sales.php:52 +#: adminpages/orders.php:1081 +msgid "This Year" +msgstr "Dieses Jahr" + +#: adminpages/reports/memberships.php:330 adminpages/reports/sales.php:205 +#: adminpages/reports/memberships.php:258 +#: adminpages/reports/memberships.php:265 +#: adminpages/reports/memberships.php:278 +#: adminpages/reports/memberships.php:294 +#: adminpages/reports/memberships.php:306 adminpages/reports/sales.php:187 +#: adminpages/reports/sales.php:195 adminpages/reports/sales.php:196 +#: adminpages/reports/sales.php:204 adminpages/advancedsettings.php:307 +#: adminpages/reports/memberships.php:333 adminpages/reports/sales.php:295 +msgid "Daily" +msgstr "täglich" + +#: adminpages/reports/memberships.php:331 adminpages/reports/sales.php:206 +#: adminpages/reports/memberships.php:259 +#: adminpages/reports/memberships.php:266 +#: adminpages/reports/memberships.php:279 +#: adminpages/reports/memberships.php:295 +#: adminpages/reports/memberships.php:307 adminpages/reports/sales.php:188 +#: adminpages/reports/sales.php:196 adminpages/reports/sales.php:197 +#: adminpages/reports/sales.php:205 adminpages/advancedsettings.php:313 +#: adminpages/reports/memberships.php:334 adminpages/reports/sales.php:296 +msgid "Monthly" +msgstr "monatlich" + +#: adminpages/reports/memberships.php:332 adminpages/reports/sales.php:207 +#: adminpages/reports/memberships.php:260 +#: adminpages/reports/memberships.php:267 +#: adminpages/reports/memberships.php:280 +#: adminpages/reports/memberships.php:296 +#: adminpages/reports/memberships.php:308 adminpages/reports/sales.php:189 +#: adminpages/reports/sales.php:197 adminpages/reports/sales.php:198 +#: adminpages/reports/sales.php:206 adminpages/reports/memberships.php:335 +#: adminpages/reports/sales.php:297 +msgid "Annual" +msgstr "jährlich" + +#: adminpages/reports/memberships.php:335 +#: adminpages/reports/memberships.php:270 +#: adminpages/reports/memberships.php:283 +#: adminpages/reports/memberships.php:311 +#: adminpages/reports/memberships.php:338 +msgid "Signups vs. All Cancellations" +msgstr "Anmeldungen vs. Alle Stornierungen" + +#: adminpages/reports/memberships.php:336 +#: adminpages/reports/memberships.php:263 +#: adminpages/reports/memberships.php:271 +#: adminpages/reports/memberships.php:284 +#: adminpages/reports/memberships.php:299 +#: adminpages/reports/memberships.php:312 +#: adminpages/reports/memberships.php:339 +msgid "Signups vs. Cancellations" +msgstr "Anmeldungen vs. Abmeldungen" + +#: adminpages/reports/memberships.php:337 +#: adminpages/reports/memberships.php:272 +#: adminpages/reports/memberships.php:285 +#: adminpages/reports/memberships.php:313 +#: adminpages/reports/memberships.php:340 +msgid "Signups vs. Expirations" +msgstr "Anmeldungen vs. Ausgelaufene" + +#: adminpages/reports/memberships.php:342 +#: adminpages/reports/memberships.php:353 adminpages/reports/sales.php:213 +#: adminpages/reports/sales.php:224 adminpages/membershiplevels.php:545 +#: adminpages/membershiplevels.php:551 adminpages/membershiplevels.php:553 +#: adminpages/membershiplevels.php:559 adminpages/membershiplevels.php:561 +#: adminpages/membershiplevels.php:580 adminpages/membershiplevels.php:588 +#: adminpages/reports/memberships.php:268 +#: adminpages/reports/memberships.php:277 +#: adminpages/reports/memberships.php:279 +#: adminpages/reports/memberships.php:288 +#: adminpages/reports/memberships.php:290 +#: adminpages/reports/memberships.php:301 +#: adminpages/reports/memberships.php:304 +#: adminpages/reports/memberships.php:315 +#: adminpages/reports/memberships.php:318 +#: adminpages/reports/memberships.php:329 adminpages/reports/sales.php:195 +#: adminpages/reports/sales.php:203 adminpages/reports/sales.php:204 +#: adminpages/reports/sales.php:206 adminpages/reports/sales.php:212 +#: adminpages/reports/sales.php:214 adminpages/reports/sales.php:215 +#: adminpages/reports/sales.php:223 adminpages/reports/sales.php:303 +#: adminpages/reports/sales.php:314 +msgid "for" +msgstr "für" + +#: adminpages/reports/memberships.php:369 adminpages/reports/sales.php:240 +#: adminpages/reports/memberships.php:295 +#: adminpages/reports/memberships.php:304 +#: adminpages/reports/memberships.php:317 +#: adminpages/reports/memberships.php:331 +#: adminpages/reports/memberships.php:345 adminpages/reports/sales.php:222 +#: adminpages/reports/sales.php:230 adminpages/reports/sales.php:231 +#: adminpages/reports/sales.php:239 adminpages/reports/memberships.php:385 +#: adminpages/reports/sales.php:342 +msgid "Generate Report" +msgstr "Bericht erstellen" + +#: adminpages/reports/sales.php:18 +msgid "Sales and Revenue (Testing/Sandbox)" +msgstr "Verkäufe und Umsatz (Test/Sandbox)" + +#: adminpages/reports/sales.php:20 adminpages/reports/sales.php:199 +#: adminpages/reports/sales.php:180 adminpages/reports/sales.php:189 +#: adminpages/reports/sales.php:198 adminpages/dashboard.php:19 +#: adminpages/reports/sales.php:289 +#: classes/class-pmpro-admin-activity-email.php:103 +msgid "Sales and Revenue" +msgstr "Verkäufe und Umsatz" + +#: adminpages/reports/sales.php:46 adminpages/reports/sales.php:211 +#: adminpages/reports/sales.php:45 adminpages/reports/sales.php:193 +#: adminpages/reports/sales.php:201 adminpages/reports/sales.php:202 +#: adminpages/reports/sales.php:210 adminpages/reports/sales.php:44 +#: adminpages/reports/sales.php:301 +msgid "Sales" +msgstr "Verkäufe" + +#: adminpages/reports/sales.php:47 adminpages/reports/sales.php:210 +#: adminpages/reports/sales.php:46 adminpages/reports/sales.php:192 +#: adminpages/reports/sales.php:200 adminpages/reports/sales.php:201 +#: adminpages/reports/sales.php:209 adminpages/reports/sales.php:45 +#: adminpages/reports/sales.php:300 +msgid "Revenue" +msgstr "Umsatz" + +#: adminpages/templates/orders-email.php:14 +#: adminpages/templates/orders-print.php:50 +msgid "Invoice #: " +msgstr "Rechnungs-Nummer:" + +#: adminpages/templates/orders-email.php:18 +#: adminpages/templates/orders-print.php:54 +msgid "Date:" +msgstr "Datum:" + +#: adminpages/templates/orders-email.php:24 +msgid "Bill to:" +msgstr "Rechnung an:" + +#: adminpages/templates/orders-email.php:47 +#: adminpages/templates/orders-print.php:76 +msgid "Item" +msgstr "Artikel" + +#: adminpages/templates/orders-email.php:48 +#: adminpages/templates/orders-print.php:77 pages/levels.php:36 +#: pages/levels.php:14 pages/levels.php:28 +msgid "Price" +msgstr "Preis" + +#: adminpages/templates/orders-email.php:56 +#: adminpages/templates/orders-print.php:85 pages/confirmation.php:91 +#: pages/invoice.php:73 pages/invoice.php:77 pages/invoice.php:79 +#: includes/functions.php:2842 +msgid "Subtotal" +msgstr "Zwischensumme" + +#: adminpages/updates.php:14 adminpages/updates.php:11 +msgid "Updating Paid Memberships Pro" +msgstr "Paid Memberships Pro wird aktualisiert" + +#: adminpages/updates.php:21 adminpages/updates.php:18 +msgid "Updates are processing. This may take a few minutes to complete." +msgstr "Updates werden verarbeitet. Das kann ein paar Minuten bis zur Fertigstellung dauern." + +#: adminpages/updates.php:27 adminpages/updates.php:23 +msgid "Update complete." +msgstr "Update vollständig durchgeführt." + +#: classes/class-deny-network-activation.php:41 +#: classes/class-deny-network-activation.php:45 +#: classes/class-deny-network-activation.php:53 +#, php-format +msgid "The %s plugin should not be network activated. Activate on each individual site's plugin page." +msgstr "Das %s Plugin sollte nicht im gesamten Netzwerk aktiviert werden. Aktivieren Sie es auf der Plugin-Seite jeder einzelnen Site." + +#: classes/class.memberorder.php:760 classes/class.memberorder.php:553 +#: classes/class.memberorder.php:561 classes/class.memberorder.php:564 +#: classes/class.memberorder.php:573 classes/class.memberorder.php:644 +#: classes/class.memberorder.php:697 classes/class.memberorder.php:699 +#: classes/class.memberorder.php:706 classes/class.memberorder.php:716 +#: classes/class.memberorder.php:719 classes/class.memberorder.php:720 +#: classes/class.memberorder.php:729 classes/class.memberorder.php:740 +#: classes/class.memberorder.php:743 includes/cleanup.php:24 +#: classes/class.memberorder.php:959 +#, php-format +msgid "There was an error canceling the subscription for user with ID=%s. You will want to check your payment gateway to see if their subscription is still active." +msgstr "Bei der Stornierung des Abonnements für den Benutzer mit der ID=%s ist ein Fehler aufgetreten. Bitte überprüfen Sie bei Ihrem Zahlungsdienstleister, ob das Abonnement noch aktiv ist." + +#: classes/class.memberorder.php:761 classes/class.memberorder.php:741 +#: classes/class.memberorder.php:744 adminpages/emailtemplates.php:137 +#: classes/class.memberorder.php:960 +msgid "User Email" +msgstr "Benutzer E-Mail" + +#: classes/class.memberorder.php:762 classes/class.memberorder.php:742 +#: classes/class.memberorder.php:745 classes/class.memberorder.php:962 +msgid "User Display Name" +msgstr "Benutzer Anzeige-Name" + +#: classes/class.pmproemail.php:37 classes/class.pmproemail.php:52 +#, php-format +msgid "An Email From %s" +msgstr "Eine E-Mail von %s" + +#: classes/class.pmproemail.php:143 classes/class.pmproemail.php:120 +#: classes/class.pmproemail.php:122 classes/class.pmproemail.php:125 +#: classes/class.pmproemail.php:134 classes/class.pmproemail.php:136 +#: classes/class.pmproemail.php:191 +#, php-format +msgid "Your membership at %s has been CANCELLED" +msgstr "Ihre Mitgliedschaft bei %s wurde STORNIERT" + +#: classes/class.pmproemail.php:176 classes/class.pmproemail.php:142 +#: classes/class.pmproemail.php:144 classes/class.pmproemail.php:147 +#: classes/class.pmproemail.php:156 classes/class.pmproemail.php:166 +#: classes/class.pmproemail.php:169 classes/class.pmproemail.php:219 +#, php-format +msgid "Membership for %s at %s has been CANCELLED" +msgstr "Die Mitgliedschaft für %s bei %s wurde STORNIERT" + +#: classes/class.pmproemail.php:219 classes/class.pmproemail.php:172 +#: classes/class.pmproemail.php:173 classes/class.pmproemail.php:175 +#: classes/class.pmproemail.php:178 classes/class.pmproemail.php:187 +#: classes/class.pmproemail.php:207 classes/class.pmproemail.php:212 +#: classes/class.pmproemail.php:269 +#, php-format +msgid "Your membership confirmation for %s" +msgstr "Ihre Mitgliedschaftsbestätigung für %s" + +#: classes/class.pmproemail.php:276 classes/class.pmproemail.php:285 +#: classes/class.pmproemail.php:294 classes/class.pmproemail.php:376 +#: classes/class.pmproemail.php:385 classes/class.pmproemail.php:703 +#: classes/class.pmproemail.php:705 +#: classes/gateways/class.pmprogateway_braintree.php:489 +#: classes/gateways/class.pmprogateway_stripe.php:652 pages/checkout.php:70 +#: pages/checkout.php:76 pages/checkout.php:498 pages/confirmation.php:58 +#: pages/invoice.php:33 classes/class.pmproemail.php:216 +#: classes/class.pmproemail.php:218 classes/class.pmproemail.php:225 +#: classes/class.pmproemail.php:227 classes/class.pmproemail.php:228 +#: classes/class.pmproemail.php:231 classes/class.pmproemail.php:234 +#: classes/class.pmproemail.php:236 classes/class.pmproemail.php:237 +#: classes/class.pmproemail.php:240 classes/class.pmproemail.php:246 +#: classes/class.pmproemail.php:249 classes/class.pmproemail.php:258 +#: classes/class.pmproemail.php:260 classes/class.pmproemail.php:269 +#: classes/class.pmproemail.php:278 classes/class.pmproemail.php:287 +#: classes/class.pmproemail.php:304 classes/class.pmproemail.php:307 +#: classes/class.pmproemail.php:313 classes/class.pmproemail.php:316 +#: classes/class.pmproemail.php:325 classes/class.pmproemail.php:328 +#: classes/class.pmproemail.php:334 classes/class.pmproemail.php:337 +#: classes/class.pmproemail.php:346 classes/class.pmproemail.php:357 +#: classes/class.pmproemail.php:366 classes/class.pmproemail.php:369 +#: classes/class.pmproemail.php:378 classes/class.pmproemail.php:532 +#: classes/class.pmproemail.php:580 classes/class.pmproemail.php:645 +#: classes/class.pmproemail.php:648 classes/class.pmproemail.php:657 +#: classes/class.pmproemail.php:659 classes/class.pmproemail.php:679 +#: classes/class.pmproemail.php:696 classes/class.pmproemail.php:698 +#: classes/gateways/class.pmprogateway_braintree.php:349 +#: classes/gateways/class.pmprogateway_braintree.php:362 +#: classes/gateways/class.pmprogateway_braintree.php:364 +#: classes/gateways/class.pmprogateway_braintree.php:367 +#: classes/gateways/class.pmprogateway_braintree.php:368 +#: classes/gateways/class.pmprogateway_braintree.php:400 +#: classes/gateways/class.pmprogateway_braintree.php:402 +#: classes/gateways/class.pmprogateway_braintree.php:448 +#: classes/gateways/class.pmprogateway_braintree.php:464 +#: classes/gateways/class.pmprogateway_stripe.php:495 +#: classes/gateways/class.pmprogateway_stripe.php:496 +#: classes/gateways/class.pmprogateway_stripe.php:506 +#: classes/gateways/class.pmprogateway_stripe.php:510 +#: classes/gateways/class.pmprogateway_stripe.php:536 +#: classes/gateways/class.pmprogateway_stripe.php:540 +#: classes/gateways/class.pmprogateway_stripe.php:541 +#: classes/gateways/class.pmprogateway_stripe.php:544 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:573 +#: classes/gateways/class.pmprogateway_stripe.php:611 +#: classes/gateways/class.pmprogateway_stripe.php:638 +#: classes/gateways/class.pmprogateway_stripe.php:644 +#: classes/gateways/class.pmprogateway_stripe.php:660 +#: classes/gateways/class.pmprogateway_stripe.php:661 pages/checkout.php:66 +#: pages/checkout.php:67 pages/checkout.php:68 pages/checkout.php:75 +#: pages/checkout.php:77 pages/checkout.php:78 pages/checkout.php:83 +#: pages/checkout.php:85 pages/checkout.php:86 pages/checkout.php:93 +#: pages/checkout.php:96 pages/checkout.php:549 pages/checkout.php:565 +#: pages/checkout.php:566 pages/checkout.php:573 pages/checkout.php:594 +#: pages/checkout.php:603 pages/checkout.php:612 pages/checkout.php:616 +#: pages/checkout.php:617 pages/checkout.php:619 pages/checkout.php:622 +#: pages/confirmation.php:51 pages/confirmation.php:52 pages/invoice.php:32 +#: adminpages/orders.php:574 adminpages/orders.php:1344 +#: classes/class.pmproemail.php:329 classes/class.pmproemail.php:338 +#: classes/class.pmproemail.php:347 classes/class.pmproemail.php:425 +#: classes/class.pmproemail.php:434 classes/class.pmproemail.php:757 +#: classes/class.pmproemail.php:759 +#: classes/gateways/class.pmprogateway_braintree.php:509 +#: classes/gateways/class.pmprogateway_stripe.php:1302 includes/profile.php:427 +#: pages/checkout.php:99 pages/checkout.php:105 pages/checkout.php:430 +#: pages/confirmation.php:70 pages/invoice.php:52 adminpages/orders.php:580 +#: adminpages/orders.php:1350 +#: classes/gateways/class.pmprogateway_stripe.php:1314 +#: classes/class.pmproemail.php:339 classes/class.pmproemail.php:345 +#: classes/class.pmproemail.php:351 classes/class.pmproemail.php:441 +#: classes/class.pmproemail.php:447 classes/class.pmproemail.php:769 +#: classes/class.pmproemail.php:771 +#: classes/gateways/class.pmprogateway_stripe.php:1333 +#: classes/gateways/class.pmprogateway_stripe.php:1339 +msgid "Discount Code" +msgstr "Rabattcode" + +#: classes/class.pmproemail.php:301 classes/class.pmproemail.php:397 +#: classes/class.pmproemail.php:712 classes/class.pmproemail.php:241 +#: classes/class.pmproemail.php:243 classes/class.pmproemail.php:253 +#: classes/class.pmproemail.php:256 classes/class.pmproemail.php:265 +#: classes/class.pmproemail.php:285 classes/class.pmproemail.php:294 +#: classes/class.pmproemail.php:325 classes/class.pmproemail.php:328 +#: classes/class.pmproemail.php:346 classes/class.pmproemail.php:349 +#: classes/class.pmproemail.php:358 classes/class.pmproemail.php:378 +#: classes/class.pmproemail.php:390 classes/class.pmproemail.php:538 +#: classes/class.pmproemail.php:586 classes/class.pmproemail.php:651 +#: classes/class.pmproemail.php:654 classes/class.pmproemail.php:663 +#: classes/class.pmproemail.php:665 classes/class.pmproemail.php:685 +#: classes/class.pmproemail.php:705 classes/class.pmproemail.php:354 +#: classes/class.pmproemail.php:446 classes/class.pmproemail.php:766 +#: classes/class.pmproemail.php:900 classes/class.pmproemail.php:945 +#: includes/email.php:440 includes/email.php:441 includes/email.php:465 +#: includes/email.php:466 classes/class.pmproemail.php:359 +#: classes/class.pmproemail.php:457 classes/class.pmproemail.php:778 +#: classes/class.pmproemail.php:912 classes/class.pmproemail.php:957 +#: includes/email.php:472 includes/email.php:473 +#, php-format +msgid "This membership will expire on %s." +msgstr "Diese Mitgliedschaft läuft am %s ab." + +#: classes/class.pmproemail.php:323 classes/class.pmproemail.php:263 +#: classes/class.pmproemail.php:265 classes/class.pmproemail.php:275 +#: classes/class.pmproemail.php:278 classes/class.pmproemail.php:287 +#: classes/class.pmproemail.php:307 classes/class.pmproemail.php:316 +#, php-format +msgid "Member Checkout for %s at %s" +msgstr "Registrierung für %s bei %s" + +#: classes/class.pmproemail.php:414 classes/class.pmproemail.php:375 +#: classes/class.pmproemail.php:395 classes/class.pmproemail.php:407 +#: classes/class.pmproemail.php:463 classes/class.pmproemail.php:475 +#, php-format +msgid "Your billing information has been updated at %s" +msgstr "Ihre Zahlungsinformationen wurden aktualisiert um %s" + +#: classes/class.pmproemail.php:468 classes/class.pmproemail.php:428 +#: classes/class.pmproemail.php:448 classes/class.pmproemail.php:461 +#: classes/class.pmproemail.php:513 classes/class.pmproemail.php:525 +#, php-format +msgid "Billing information has been updated for %s at %s" +msgstr "Zahlungsinformationen wurden aktualisiert für %s um %s" + +#: classes/class.pmproemail.php:517 classes/class.pmproemail.php:425 +#: classes/class.pmproemail.php:430 classes/class.pmproemail.php:464 +#: classes/class.pmproemail.php:467 classes/class.pmproemail.php:476 +#: classes/class.pmproemail.php:496 classes/class.pmproemail.php:510 +#, php-format +msgid "Membership Payment Failed at %s" +msgstr "Mitgliedschafts-Zahlung bei %s fehlgeschlagen" + +#: classes/class.pmproemail.php:564 classes/class.pmproemail.php:462 +#: classes/class.pmproemail.php:468 classes/class.pmproemail.php:510 +#: classes/class.pmproemail.php:513 classes/class.pmproemail.php:522 +#: classes/class.pmproemail.php:542 classes/class.pmproemail.php:557 +#, php-format +msgid "Membership Payment Failed For %s at %s" +msgstr "Mitgliedschafts-Zahlung für %s bei %s fehlgeschlagen" + +#: classes/class.pmproemail.php:612 classes/class.pmproemail.php:508 +#: classes/class.pmproemail.php:557 classes/class.pmproemail.php:560 +#: classes/class.pmproemail.php:569 classes/class.pmproemail.php:589 +#: classes/class.pmproemail.php:605 +#, php-format +msgid "Credit Card on File Expiring Soon at %s" +msgstr "Kreditkarte läuft am %s ab." + +#: classes/class.pmproemail.php:663 classes/class.pmproemail.php:501 +#: classes/class.pmproemail.php:548 classes/class.pmproemail.php:605 +#: classes/class.pmproemail.php:608 classes/class.pmproemail.php:617 +#: classes/class.pmproemail.php:619 classes/class.pmproemail.php:639 +#: classes/class.pmproemail.php:656 +#, php-format +msgid "INVOICE for %s membership" +msgstr "ZAHLUNGSBESTÄTIGUNG für %s Mitgliedschaft" + +#: classes/class.pmproemail.php:740 classes/class.pmproemail.php:563 +#: classes/class.pmproemail.php:611 classes/class.pmproemail.php:676 +#: classes/class.pmproemail.php:679 classes/class.pmproemail.php:688 +#: classes/class.pmproemail.php:690 classes/class.pmproemail.php:710 +#: classes/class.pmproemail.php:733 classes/class.pmproemail.php:794 +#: classes/class.pmproemail.php:806 +#, php-format +msgid "Your trial at %s is ending soon" +msgstr "Ihre Testphase bei %s endet bald" + +#: classes/class.pmproemail.php:776 classes/class.pmproemail.php:596 +#: classes/class.pmproemail.php:645 classes/class.pmproemail.php:710 +#: classes/class.pmproemail.php:713 classes/class.pmproemail.php:722 +#: classes/class.pmproemail.php:724 classes/class.pmproemail.php:744 +#: classes/class.pmproemail.php:769 classes/class.pmproemail.php:831 +#: classes/class.pmproemail.php:843 +#, php-format +msgid "Your membership at %s has ended" +msgstr "Ihre Mitgliedschaft bei %s wurde beendet" + +#: classes/class.pmproemail.php:803 classes/class.pmproemail.php:621 +#: classes/class.pmproemail.php:670 classes/class.pmproemail.php:735 +#: classes/class.pmproemail.php:738 classes/class.pmproemail.php:747 +#: classes/class.pmproemail.php:749 classes/class.pmproemail.php:769 +#: classes/class.pmproemail.php:796 classes/class.pmproemail.php:858 +#: classes/class.pmproemail.php:870 +#, php-format +msgid "Your membership at %s will end soon" +msgstr "Ihre Mitgliedschaft bei %s endet bald" + +#: classes/class.pmproemail.php:825 classes/class.pmproemail.php:641 +#: classes/class.pmproemail.php:690 classes/class.pmproemail.php:755 +#: classes/class.pmproemail.php:758 classes/class.pmproemail.php:767 +#: classes/class.pmproemail.php:769 classes/class.pmproemail.php:789 +#: classes/class.pmproemail.php:818 classes/class.pmproemail.php:888 +#: classes/class.pmproemail.php:900 +#, php-format +msgid "Your membership at %s has been changed" +msgstr "Ihre Mitgliedschaft bei %s wurde geändert" + +#: classes/class.pmproemail.php:950 classes/class.pmproemail.php:905 +#, php-format +msgid "The new level is %s" +msgstr "Das neue Paket ist %s" + +#: classes/class.pmproemail.php:832 classes/class.pmproemail.php:647 +#: classes/class.pmproemail.php:696 classes/class.pmproemail.php:761 +#: classes/class.pmproemail.php:764 classes/class.pmproemail.php:773 +#: classes/class.pmproemail.php:775 classes/class.pmproemail.php:795 +#: classes/class.pmproemail.php:825 +msgid "Your membership has been cancelled" +msgstr "Ihre Mitgliedschaft wurde gekündigt" + +#: classes/class.pmproemail.php:836 classes/class.pmproemail.php:884 +#: classes/class.pmproemail.php:651 classes/class.pmproemail.php:689 +#: classes/class.pmproemail.php:700 classes/class.pmproemail.php:738 +#: classes/class.pmproemail.php:765 classes/class.pmproemail.php:768 +#: classes/class.pmproemail.php:777 classes/class.pmproemail.php:778 +#: classes/class.pmproemail.php:779 classes/class.pmproemail.php:798 +#: classes/class.pmproemail.php:803 classes/class.pmproemail.php:806 +#: classes/class.pmproemail.php:815 classes/class.pmproemail.php:816 +#: classes/class.pmproemail.php:817 classes/class.pmproemail.php:829 +#: classes/class.pmproemail.php:869 classes/class.pmproemail.php:876 +#, php-format +msgid "This membership will expire on %s" +msgstr "Diese Mitgliedschaft endet am %s" + +#: classes/class.pmproemail.php:840 classes/class.pmproemail.php:888 +#: classes/class.pmproemail.php:655 classes/class.pmproemail.php:693 +#: classes/class.pmproemail.php:704 classes/class.pmproemail.php:742 +#: classes/class.pmproemail.php:769 classes/class.pmproemail.php:772 +#: classes/class.pmproemail.php:781 classes/class.pmproemail.php:782 +#: classes/class.pmproemail.php:783 classes/class.pmproemail.php:802 +#: classes/class.pmproemail.php:807 classes/class.pmproemail.php:810 +#: classes/class.pmproemail.php:819 classes/class.pmproemail.php:820 +#: classes/class.pmproemail.php:821 classes/class.pmproemail.php:833 +#: classes/class.pmproemail.php:873 classes/class.pmproemail.php:880 +msgid "This membership does not expire" +msgstr "Diese Mitgliedschaft läuft nicht ab" + +#: classes/class.pmproemail.php:868 includes/init.php:265 +#: includes/profile.php:48 includes/init.php:229 includes/init.php:232 +#: includes/init.php:233 includes/init.php:235 includes/init.php:237 +#: includes/init.php:245 includes/init.php:253 includes/init.php:258 +#: includes/init.php:259 includes/profile.php:37 includes/profile.php:39 +#: includes/profile.php:42 adminpages/orders.php:585 +#: classes/class.pmproemail.php:883 classes/class.pmproemail.php:928 +#: includes/init.php:198 includes/profile.php:34 adminpages/orders.php:591 +#: classes/class.pmproemail.php:895 classes/class.pmproemail.php:940 +msgid "None" +msgstr "Kein" + +#: classes/class.pmproemail.php:872 classes/class.pmproemail.php:679 +#: classes/class.pmproemail.php:728 classes/class.pmproemail.php:793 +#: classes/class.pmproemail.php:796 classes/class.pmproemail.php:805 +#: classes/class.pmproemail.php:806 classes/class.pmproemail.php:807 +#: classes/class.pmproemail.php:826 classes/class.pmproemail.php:859 +#: classes/class.pmproemail.php:866 classes/class.pmproemail.php:933 +#: classes/class.pmproemail.php:945 +#, php-format +msgid "Membership for %s at %s has been changed" +msgstr "Mitgliedschaft für %s bei %s wurde geändert " + +#: classes/class.pmproemail.php:879 classes/class.pmproemail.php:799 +#: classes/class.pmproemail.php:802 classes/class.pmproemail.php:811 +#: classes/class.pmproemail.php:812 classes/class.pmproemail.php:813 +#: classes/class.pmproemail.php:832 classes/class.pmproemail.php:865 +#: classes/class.pmproemail.php:872 +msgid "Membership has been cancelled" +msgstr "Mitgliedschaft wurde storniert." + +#: classes/class.pmproemail.php:919 classes/class.pmproemail.php:848 +#: classes/class.pmproemail.php:849 classes/class.pmproemail.php:850 +#: classes/class.pmproemail.php:869 classes/class.pmproemail.php:904 +#: classes/class.pmproemail.php:911 +msgid "Invoice for Order #: " +msgstr "Rechnung für Bestellung Nummer:" + +#: classes/class.pmproemail.php:963 classes/class.pmproemail.php:948 +#: classes/class.pmproemail.php:955 +msgid "" +"

    An administrator at !!sitename!! has changed your membership level.

    \n" +"\n" +"

    !!membership_change!!.

    \n" +"\n" +"

    If you did not request this membership change and would like more information please contact us at !!siteemail!!

    \n" +"\n" +"

    Log in to your membership account here: !!login_link!!

    " +msgstr "" +"

    Ein Administrator bei !!sitename!! hat Ihr Mitgliedschafts-Paket geändert.

    \n" +"\n" +"

    !!membership_change!!.

    \n" +"\n" +"

    Wenn Sie das nicht verlangt haben und weitere Informationen möchten, kontaktieren Sie uns bitte als !!siteemail!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihren Mitgliedschafts-Konto ein: !!login_link!!

    " + +#: classes/gateways/class.pmprogateway.php:55 +#: classes/gateways/class.pmprogateway_authorizenet.php:171 +#: classes/gateways/class.pmprogateway_check.php:210 +#: classes/gateways/class.pmprogateway_cybersource.php:171 +#: classes/gateways/class.pmprogateway_payflowpro.php:164 +#: classes/gateways/class.pmprogateway_paypal.php:272 +#: classes/gateways/class.pmprogateway_authorizenet.php:55 +#: classes/gateways/class.pmprogateway_check.php:60 +#: classes/gateways/class.pmprogateway_check.php:193 +#: classes/gateways/class.pmprogateway_cybersource.php:57 +#: classes/gateways/class.pmprogateway_payflowpro.php:27 +#: classes/gateways/class.pmprogateway_paypal.php:27 +#: classes/gateways/class.pmprogateway_paypal.php:247 +#: classes/gateways/class.pmprogateway_paypal.php:249 +#: classes/gateways/class.pmprogateway_authorizenet.php:189 +#: classes/gateways/class.pmprogateway_check.php:211 +#: classes/gateways/class.pmprogateway_cybersource.php:155 +#: classes/gateways/class.pmprogateway_payflowpro.php:173 +#: classes/gateways/class.pmprogateway_paypal.php:315 +msgid "Unknown error: Authorization failed." +msgstr "Unbekannter Fehler: Autorisierung fehlgeschlagen." + +#: classes/gateways/class.pmprogateway.php:106 +#: classes/gateways/class.pmprogateway.php:111 +#: classes/gateways/class.pmprogateway.php:129 +#: classes/gateways/class.pmprogateway_authorizenet.php:222 +#: classes/gateways/class.pmprogateway_authorizenet.php:227 +#: classes/gateways/class.pmprogateway_authorizenet.php:244 +#: classes/gateways/class.pmprogateway_check.php:262 +#: classes/gateways/class.pmprogateway_check.php:267 +#: classes/gateways/class.pmprogateway_check.php:285 +#: classes/gateways/class.pmprogateway_cybersource.php:222 +#: classes/gateways/class.pmprogateway_cybersource.php:227 +#: classes/gateways/class.pmprogateway_cybersource.php:245 +#: classes/gateways/class.pmprogateway_payflowpro.php:187 +#: classes/gateways/class.pmprogateway_payflowpro.php:192 +#: classes/gateways/class.pmprogateway_paypal.php:295 +#: classes/gateways/class.pmprogateway_authorizenet.php:106 +#: classes/gateways/class.pmprogateway_authorizenet.php:111 +#: classes/gateways/class.pmprogateway_authorizenet.php:128 +#: classes/gateways/class.pmprogateway_check.php:111 +#: classes/gateways/class.pmprogateway_check.php:116 +#: classes/gateways/class.pmprogateway_check.php:134 +#: classes/gateways/class.pmprogateway_check.php:244 +#: classes/gateways/class.pmprogateway_check.php:245 +#: classes/gateways/class.pmprogateway_check.php:249 +#: classes/gateways/class.pmprogateway_check.php:250 +#: classes/gateways/class.pmprogateway_check.php:268 +#: classes/gateways/class.pmprogateway_cybersource.php:108 +#: classes/gateways/class.pmprogateway_cybersource.php:113 +#: classes/gateways/class.pmprogateway_cybersource.php:131 +#: classes/gateways/class.pmprogateway_payflowpro.php:50 +#: classes/gateways/class.pmprogateway_payflowpro.php:55 +#: classes/gateways/class.pmprogateway_paypal.php:50 +#: classes/gateways/class.pmprogateway_paypal.php:270 +#: classes/gateways/class.pmprogateway_paypal.php:272 +#: classes/gateways/class.pmprogateway_authorizenet.php:240 +#: classes/gateways/class.pmprogateway_authorizenet.php:245 +#: classes/gateways/class.pmprogateway_authorizenet.php:262 +#: classes/gateways/class.pmprogateway_check.php:263 +#: classes/gateways/class.pmprogateway_check.php:286 +#: classes/gateways/class.pmprogateway_cybersource.php:203 +#: classes/gateways/class.pmprogateway_cybersource.php:208 +#: classes/gateways/class.pmprogateway_cybersource.php:224 +#: classes/gateways/class.pmprogateway_payflowpro.php:196 +#: classes/gateways/class.pmprogateway_payflowpro.php:201 +#: classes/gateways/class.pmprogateway_paypal.php:338 +msgid "Unknown error: Payment failed." +msgstr "Unbekannter Fehler: Zahlung fehlgeschlagen." + +#: classes/gateways/class.pmprogateway.php:113 +#: classes/gateways/class.pmprogateway_authorizenet.php:228 +#: classes/gateways/class.pmprogateway_check.php:269 +#: classes/gateways/class.pmprogateway_cybersource.php:229 +#: classes/gateways/class.pmprogateway_authorizenet.php:112 +#: classes/gateways/class.pmprogateway_check.php:118 +#: classes/gateways/class.pmprogateway_check.php:251 +#: classes/gateways/class.pmprogateway_check.php:252 +#: classes/gateways/class.pmprogateway_cybersource.php:115 +#: classes/gateways/class.pmprogateway_authorizenet.php:246 +#: classes/gateways/class.pmprogateway_check.php:270 +#: classes/gateways/class.pmprogateway_cybersource.php:209 +msgid "A partial payment was made that we could not void. Please contact the site owner immediately to correct this." +msgstr "Es wurde eine Teilzahlung getätigt, die wir nicht stornieren können. Bitte kontaktieren Sie den Betreiber der Seite um das Problem zu klären." + +#: classes/gateways/class.pmprogateway_authorizenet.php:39 +#: paid-memberships-pro.php:136 paid-memberships-pro.php:122 +#: paid-memberships-pro.php:123 paid-memberships-pro.php:130 +#: paid-memberships-pro.php:131 paid-memberships-pro.php:132 +#: paid-memberships-pro.php:133 paid-memberships-pro.php:134 +#: paid-memberships-pro.php:135 paid-memberships-pro.php:142 +#: classes/gateways/class.pmprogateway_authorizenet.php:55 +#: paid-memberships-pro.php:164 paid-memberships-pro.php:166 +msgid "Authorize.net" +msgstr "Authorize.net" + +#: classes/gateways/class.pmprogateway_authorizenet.php:93 +#: classes/gateways/class.pmprogateway_authorizenet.php:110 +msgid "Authorize.net Settings" +msgstr "Authorize.net Einstellungen" + +#: classes/gateways/class.pmprogateway_authorizenet.php:98 +#: adminpages/paymentsettings.php:260 adminpages/paymentsettings.php:264 +#: adminpages/paymentsettings.php:269 +#: classes/gateways/class.pmprogateway_authorizenet.php:115 +msgid "Login Name" +msgstr "Login Name" + +#: classes/gateways/class.pmprogateway_authorizenet.php:106 +#: adminpages/paymentsettings.php:268 adminpages/paymentsettings.php:272 +#: adminpages/paymentsettings.php:277 +#: classes/gateways/class.pmprogateway_authorizenet.php:123 +msgid "Transaction Key" +msgstr "Transaktionsschlüssel" + +#: classes/gateways/class.pmprogateway_authorizenet.php:114 +#: adminpages/paymentsettings.php:454 adminpages/paymentsettings.php:495 +#: adminpages/paymentsettings.php:501 adminpages/paymentsettings.php:503 +#: classes/gateways/class.pmprogateway_authorizenet.php:131 +msgid "Silent Post URL" +msgstr "Stille-Post-URL" + +#: classes/gateways/class.pmprogateway_authorizenet.php:117 +#: adminpages/paymentsettings.php:457 adminpages/paymentsettings.php:498 +#: adminpages/paymentsettings.php:504 adminpages/paymentsettings.php:506 +#: classes/gateways/class.pmprogateway_authorizenet.php:134 +msgid "To fully integrate with Authorize.net, be sure to set your Silent Post URL to" +msgstr "Um Authorize.net vollständig zu integrieren, stellen Sie Ihre Silent Post URL auf " + +#: classes/gateways/class.pmprogateway_authorizenet.php:909 +#: classes/gateways/class.pmprogateway_authorizenet.php:910 +#: classes/gateways/class.pmprogateway_authorizenet.php:787 +#: classes/gateways/class.pmprogateway_authorizenet.php:788 +#: classes/gateways/class.pmprogateway_authorizenet.php:789 +#: classes/gateways/class.pmprogateway_authorizenet.php:792 +#: classes/gateways/class.pmprogateway_authorizenet.php:793 +#: classes/gateways/class.pmprogateway_authorizenet.php:908 +#: classes/gateways/class.pmprogateway_authorizenet.php:914 +#: classes/gateways/class.pmprogateway_authorizenet.php:915 +msgid "Could not connect to Authorize.net" +msgstr "Verbindung mit Authorize.net fehlgeschlagen" + +#: classes/gateways/class.pmprogateway_braintree.php:48 +#: classes/gateways/class.pmprogateway_braintree.php:51 +#, php-format +msgid "Attempting to load Braintree gateway: %s" +msgstr "Versuche, das Braintree-Gateway zu laden: %s" + +#: classes/gateways/class.pmprogateway_braintree.php:84 +#: classes/gateways/class.pmprogateway_stripe.php:81 +#: classes/gateways/class.pmprogateway_braintree.php:49 +#: classes/gateways/class.pmprogateway_braintree.php:62 +#: classes/gateways/class.pmprogateway_stripe.php:58 +#: classes/gateways/class.pmprogateway_braintree.php:87 +#: classes/gateways/class.pmprogateway_stripe.php:91 +#: classes/gateways/class.pmprogateway_stripe.php:97 +#, php-format +msgid "The %s gateway depends on the %s PHP extension. Please enable it, or ask your hosting provider to enable it." +msgstr "Das %s Gateway benötigt die %s PHP-Erweiterung. Bitte aktivieren Sie sie oder bitten Sie Ihren Hostinganbieter es zu aktivieren." + +#: classes/gateways/class.pmprogateway_braintree.php:141 +#: classes/gateways/class.pmprogateway_braintree.php:144 +#, php-format +msgid "Problem loading plans: %s" +msgstr "Problem, die Tarife zu laden: %s" + +#: classes/gateways/class.pmprogateway_braintree.php:143 +#: classes/gateways/class.pmprogateway_braintree.php:146 +msgid "Problem accessing the Braintree Gateway. Please verify your PMPro Payment Settings (Keys, etc)." +msgstr "Problem beim Zugriff auf das Braintree Gateway. Bitte verifizieren Sie Ihre PMPro Zahlungseinstellungen (Schlüssel usw.)." + +#: classes/gateways/class.pmprogateway_braintree.php:220 +#: paid-memberships-pro.php:137 +#: classes/gateways/class.pmprogateway_braintree.php:63 +#: classes/gateways/class.pmprogateway_braintree.php:76 +#: classes/gateways/class.pmprogateway_braintree.php:77 +#: classes/gateways/class.pmprogateway_braintree.php:109 +#: classes/gateways/class.pmprogateway_braintree.php:111 +#: classes/gateways/class.pmprogateway_braintree.php:172 +#: paid-memberships-pro.php:123 paid-memberships-pro.php:124 +#: paid-memberships-pro.php:131 paid-memberships-pro.php:132 +#: paid-memberships-pro.php:133 paid-memberships-pro.php:134 +#: paid-memberships-pro.php:135 paid-memberships-pro.php:136 +#: paid-memberships-pro.php:143 +#: classes/gateways/class.pmprogateway_braintree.php:251 +#: paid-memberships-pro.php:165 paid-memberships-pro.php:167 +msgid "Braintree Payments" +msgstr "Braintree Zahlungen" + +#: classes/gateways/class.pmprogateway_braintree.php:276 +#: classes/gateways/class.pmprogateway_braintree.php:119 +#: classes/gateways/class.pmprogateway_braintree.php:132 +#: classes/gateways/class.pmprogateway_braintree.php:133 +#: classes/gateways/class.pmprogateway_braintree.php:165 +#: classes/gateways/class.pmprogateway_braintree.php:167 +#: classes/gateways/class.pmprogateway_braintree.php:228 +#: classes/gateways/class.pmprogateway_braintree.php:308 +msgid "Braintree Settings" +msgstr "Braintree Einstellungen" + +#: classes/gateways/class.pmprogateway_braintree.php:281 +#: classes/gateways/class.pmprogateway_cybersource.php:106 +#: adminpages/paymentsettings.php:294 adminpages/paymentsettings.php:298 +#: adminpages/paymentsettings.php:303 adminpages/paymentsettings.php:364 +#: adminpages/paymentsettings.php:369 +#: classes/gateways/class.pmprogateway_braintree.php:124 +#: classes/gateways/class.pmprogateway_braintree.php:137 +#: classes/gateways/class.pmprogateway_braintree.php:138 +#: classes/gateways/class.pmprogateway_braintree.php:170 +#: classes/gateways/class.pmprogateway_braintree.php:172 +#: classes/gateways/class.pmprogateway_braintree.php:233 +#: classes/gateways/class.pmprogateway_braintree.php:313 +#: classes/gateways/class.pmprogateway_cybersource.php:94 +msgid "Merchant ID" +msgstr "Händler ID" + +#: classes/gateways/class.pmprogateway_braintree.php:289 +#: adminpages/paymentsettings.php:302 adminpages/paymentsettings.php:306 +#: adminpages/paymentsettings.php:311 +#: classes/gateways/class.pmprogateway_braintree.php:132 +#: classes/gateways/class.pmprogateway_braintree.php:145 +#: classes/gateways/class.pmprogateway_braintree.php:146 +#: classes/gateways/class.pmprogateway_braintree.php:178 +#: classes/gateways/class.pmprogateway_braintree.php:180 +#: classes/gateways/class.pmprogateway_braintree.php:241 +#: classes/gateways/class.pmprogateway_braintree.php:321 +msgid "Public Key" +msgstr "Öffentlicher Schlüssel" + +#: classes/gateways/class.pmprogateway_braintree.php:297 +#: adminpages/paymentsettings.php:310 adminpages/paymentsettings.php:314 +#: adminpages/paymentsettings.php:319 +#: classes/gateways/class.pmprogateway_braintree.php:140 +#: classes/gateways/class.pmprogateway_braintree.php:153 +#: classes/gateways/class.pmprogateway_braintree.php:154 +#: classes/gateways/class.pmprogateway_braintree.php:186 +#: classes/gateways/class.pmprogateway_braintree.php:188 +#: classes/gateways/class.pmprogateway_braintree.php:249 +#: classes/gateways/class.pmprogateway_braintree.php:329 +msgid "Private Key" +msgstr "Privater Schlüssel" + +#: classes/gateways/class.pmprogateway_braintree.php:305 +#: adminpages/paymentsettings.php:318 adminpages/paymentsettings.php:322 +#: adminpages/paymentsettings.php:327 +#: classes/gateways/class.pmprogateway_braintree.php:148 +#: classes/gateways/class.pmprogateway_braintree.php:161 +#: classes/gateways/class.pmprogateway_braintree.php:162 +#: classes/gateways/class.pmprogateway_braintree.php:194 +#: classes/gateways/class.pmprogateway_braintree.php:196 +#: classes/gateways/class.pmprogateway_braintree.php:257 +#: classes/gateways/class.pmprogateway_braintree.php:337 +msgid "Client-Side Encryption Key" +msgstr "Client-seitiger Verschlüsselungs-Schlüssel" + +#: classes/gateways/class.pmprogateway_braintree.php:313 +#: classes/gateways/class.pmprogateway_stripe.php:297 +#: adminpages/paymentsettings.php:462 adminpages/paymentsettings.php:470 +#: adminpages/paymentsettings.php:503 adminpages/paymentsettings.php:509 +#: adminpages/paymentsettings.php:511 adminpages/paymentsettings.php:517 +#: adminpages/paymentsettings.php:519 +#: classes/gateways/class.pmprogateway_braintree.php:156 +#: classes/gateways/class.pmprogateway_braintree.php:169 +#: classes/gateways/class.pmprogateway_braintree.php:170 +#: classes/gateways/class.pmprogateway_braintree.php:202 +#: classes/gateways/class.pmprogateway_braintree.php:204 +#: classes/gateways/class.pmprogateway_braintree.php:265 +#: classes/gateways/class.pmprogateway_stripe.php:181 +#: classes/gateways/class.pmprogateway_stripe.php:182 +#: classes/gateways/class.pmprogateway_stripe.php:192 +#: classes/gateways/class.pmprogateway_stripe.php:214 +#: classes/gateways/class.pmprogateway_stripe.php:216 +#: classes/gateways/class.pmprogateway_stripe.php:217 +#: classes/gateways/class.pmprogateway_stripe.php:228 +#: classes/gateways/class.pmprogateway_stripe.php:230 +#: classes/gateways/class.pmprogateway_stripe.php:257 +#: classes/gateways/class.pmprogateway_stripe.php:289 +#: classes/gateways/class.pmprogateway_stripe.php:305 +#: classes/gateways/class.pmprogateway_stripe.php:306 +#: classes/gateways/class.pmprogateway_braintree.php:345 +msgid "Web Hook URL" +msgstr "Web Hook URL" + +#: classes/gateways/class.pmprogateway_braintree.php:317 +#: adminpages/paymentsettings.php:474 adminpages/paymentsettings.php:515 +#: adminpages/paymentsettings.php:521 adminpages/paymentsettings.php:523 +#: classes/gateways/class.pmprogateway_braintree.php:160 +#: classes/gateways/class.pmprogateway_braintree.php:173 +#: classes/gateways/class.pmprogateway_braintree.php:174 +#: classes/gateways/class.pmprogateway_braintree.php:206 +#: classes/gateways/class.pmprogateway_braintree.php:208 +#: classes/gateways/class.pmprogateway_braintree.php:269 +#: classes/gateways/class.pmprogateway_braintree.php:348 +msgid "To fully integrate with Braintree, be sure to set your Web Hook URL to" +msgstr "Um Braintree vollständig zu integrieren, stellen Sie Ihre Web Hook URL auf " + +#: classes/gateways/class.pmprogateway_braintree.php:434 +#: classes/gateways/class.pmprogateway_stripe.php:569 pages/checkout.php:411 +#: classes/gateways/class.pmprogateway_braintree.php:270 +#: classes/gateways/class.pmprogateway_braintree.php:283 +#: classes/gateways/class.pmprogateway_braintree.php:285 +#: classes/gateways/class.pmprogateway_braintree.php:286 +#: classes/gateways/class.pmprogateway_braintree.php:287 +#: classes/gateways/class.pmprogateway_braintree.php:319 +#: classes/gateways/class.pmprogateway_braintree.php:321 +#: classes/gateways/class.pmprogateway_braintree.php:383 +#: classes/gateways/class.pmprogateway_braintree.php:429 +#: classes/gateways/class.pmprogateway_stripe.php:387 +#: classes/gateways/class.pmprogateway_stripe.php:388 +#: classes/gateways/class.pmprogateway_stripe.php:398 +#: classes/gateways/class.pmprogateway_stripe.php:402 +#: classes/gateways/class.pmprogateway_stripe.php:426 +#: classes/gateways/class.pmprogateway_stripe.php:427 +#: classes/gateways/class.pmprogateway_stripe.php:429 +#: classes/gateways/class.pmprogateway_stripe.php:432 +#: classes/gateways/class.pmprogateway_stripe.php:450 +#: classes/gateways/class.pmprogateway_stripe.php:461 +#: classes/gateways/class.pmprogateway_stripe.php:499 +#: classes/gateways/class.pmprogateway_stripe.php:526 +#: classes/gateways/class.pmprogateway_stripe.php:561 +#: classes/gateways/class.pmprogateway_stripe.php:577 +#: classes/gateways/class.pmprogateway_stripe.php:578 pages/checkout.php:476 +#: pages/checkout.php:478 pages/checkout.php:485 pages/checkout.php:493 +#: pages/checkout.php:494 pages/checkout.php:500 pages/checkout.php:501 +#: pages/checkout.php:503 pages/checkout.php:510 pages/checkout.php:513 +#: classes/gateways/class.pmprogateway_braintree.php:454 +#: classes/gateways/class.pmprogateway_stripe.php:1251 pages/checkout.php:366 +#: classes/gateways/class.pmprogateway_stripe.php:1263 +#: classes/gateways/class.pmprogateway_stripe.php:1282 +#: classes/gateways/class.pmprogateway_stripe.php:1288 +msgid "Payment Information" +msgstr "Zahlungsinformationen" + +#: classes/gateways/class.pmprogateway_braintree.php:435 +#: classes/gateways/class.pmprogateway_stripe.php:570 pages/checkout.php:412 +#: classes/gateways/class.pmprogateway_braintree.php:270 +#: classes/gateways/class.pmprogateway_braintree.php:283 +#: classes/gateways/class.pmprogateway_braintree.php:285 +#: classes/gateways/class.pmprogateway_braintree.php:287 +#: classes/gateways/class.pmprogateway_braintree.php:288 +#: classes/gateways/class.pmprogateway_braintree.php:320 +#: classes/gateways/class.pmprogateway_braintree.php:322 +#: classes/gateways/class.pmprogateway_braintree.php:384 +#: classes/gateways/class.pmprogateway_braintree.php:430 +#: classes/gateways/class.pmprogateway_stripe.php:387 +#: classes/gateways/class.pmprogateway_stripe.php:388 +#: classes/gateways/class.pmprogateway_stripe.php:398 +#: classes/gateways/class.pmprogateway_stripe.php:402 +#: classes/gateways/class.pmprogateway_stripe.php:426 +#: classes/gateways/class.pmprogateway_stripe.php:428 +#: classes/gateways/class.pmprogateway_stripe.php:430 +#: classes/gateways/class.pmprogateway_stripe.php:433 +#: classes/gateways/class.pmprogateway_stripe.php:451 +#: classes/gateways/class.pmprogateway_stripe.php:462 +#: classes/gateways/class.pmprogateway_stripe.php:500 +#: classes/gateways/class.pmprogateway_stripe.php:527 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:578 +#: classes/gateways/class.pmprogateway_stripe.php:579 pages/checkout.php:476 +#: pages/checkout.php:478 pages/checkout.php:485 pages/checkout.php:493 +#: pages/checkout.php:494 pages/checkout.php:500 pages/checkout.php:502 +#: pages/checkout.php:504 pages/checkout.php:511 pages/checkout.php:514 +#: classes/gateways/class.pmprogateway_braintree.php:455 +#: classes/gateways/class.pmprogateway_stripe.php:1252 pages/checkout.php:367 +#: classes/gateways/class.pmprogateway_stripe.php:1264 +#: classes/gateways/class.pmprogateway_stripe.php:1283 +#: classes/gateways/class.pmprogateway_stripe.php:1289 +#, php-format +msgid "We Accept %s" +msgstr "Wir aktzeptieren %s" + +#: classes/gateways/class.pmprogateway_braintree.php:455 +#: classes/gateways/class.pmprogateway_stripe.php:617 pages/billing.php:309 +#: pages/checkout.php:459 classes/gateways/class.pmprogateway_braintree.php:303 +#: classes/gateways/class.pmprogateway_braintree.php:316 +#: classes/gateways/class.pmprogateway_braintree.php:318 +#: classes/gateways/class.pmprogateway_braintree.php:321 +#: classes/gateways/class.pmprogateway_braintree.php:322 +#: classes/gateways/class.pmprogateway_braintree.php:354 +#: classes/gateways/class.pmprogateway_braintree.php:356 +#: classes/gateways/class.pmprogateway_braintree.php:418 +#: classes/gateways/class.pmprogateway_stripe.php:449 +#: classes/gateways/class.pmprogateway_stripe.php:450 +#: classes/gateways/class.pmprogateway_stripe.php:460 +#: classes/gateways/class.pmprogateway_stripe.php:464 +#: classes/gateways/class.pmprogateway_stripe.php:490 +#: classes/gateways/class.pmprogateway_stripe.php:493 +#: classes/gateways/class.pmprogateway_stripe.php:495 +#: classes/gateways/class.pmprogateway_stripe.php:498 +#: classes/gateways/class.pmprogateway_stripe.php:516 +#: classes/gateways/class.pmprogateway_stripe.php:527 +#: classes/gateways/class.pmprogateway_stripe.php:565 +#: classes/gateways/class.pmprogateway_stripe.php:592 +#: classes/gateways/class.pmprogateway_stripe.php:609 +#: classes/gateways/class.pmprogateway_stripe.php:625 +#: classes/gateways/class.pmprogateway_stripe.php:626 pages/billing.php:244 +#: pages/billing.php:248 pages/billing.php:257 pages/billing.php:260 +#: pages/billing.php:263 pages/billing.php:305 pages/billing.php:311 +#: pages/billing.php:312 pages/billing.php:313 pages/billing.php:314 +#: pages/billing.php:337 pages/checkout.php:503 pages/checkout.php:519 +#: pages/checkout.php:520 pages/checkout.php:527 pages/checkout.php:548 +#: pages/checkout.php:557 pages/checkout.php:566 pages/checkout.php:570 +#: pages/checkout.php:577 pages/checkout.php:580 +#: classes/gateways/class.pmprogateway_braintree.php:475 +#: classes/gateways/class.pmprogateway_stripe.php:1285 pages/billing.php:371 +#: pages/checkout.php:389 classes/gateways/class.pmprogateway_stripe.php:1297 +#: classes/gateways/class.pmprogateway_stripe.php:1316 +#: classes/gateways/class.pmprogateway_stripe.php:1322 +msgid "Card Number" +msgstr "Kartennummer" + +#: classes/gateways/class.pmprogateway_braintree.php:483 pages/billing.php:348 +#: classes/gateways/class.pmprogateway_braintree.php:340 +#: classes/gateways/class.pmprogateway_braintree.php:353 +#: classes/gateways/class.pmprogateway_braintree.php:355 +#: classes/gateways/class.pmprogateway_braintree.php:358 +#: classes/gateways/class.pmprogateway_braintree.php:359 +#: classes/gateways/class.pmprogateway_braintree.php:391 +#: classes/gateways/class.pmprogateway_braintree.php:393 +#: classes/gateways/class.pmprogateway_braintree.php:455 +#: classes/gateways/class.pmprogateway_stripe.php:486 +#: classes/gateways/class.pmprogateway_stripe.php:487 +#: classes/gateways/class.pmprogateway_stripe.php:497 +#: classes/gateways/class.pmprogateway_stripe.php:501 +#: classes/gateways/class.pmprogateway_stripe.php:527 +#: classes/gateways/class.pmprogateway_stripe.php:531 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:535 +#: classes/gateways/class.pmprogateway_stripe.php:553 +#: classes/gateways/class.pmprogateway_stripe.php:564 +#: classes/gateways/class.pmprogateway_stripe.php:602 +#: classes/gateways/class.pmprogateway_stripe.php:629 pages/billing.php:281 +#: pages/billing.php:285 pages/billing.php:294 pages/billing.php:297 +#: pages/billing.php:301 pages/billing.php:343 pages/billing.php:351 +#: pages/billing.php:352 pages/billing.php:354 pages/billing.php:357 +#: pages/billing.php:380 pages/checkout.php:540 pages/checkout.php:556 +#: pages/checkout.php:557 pages/checkout.php:564 pages/checkout.php:585 +#: pages/checkout.php:594 pages/checkout.php:603 pages/checkout.php:605 +#: pages/checkout.php:607 pages/checkout.php:608 pages/checkout.php:612 +#: pages/checkout.php:615 classes/gateways/class.pmprogateway_braintree.php:503 +#: pages/billing.php:410 +msgid "CVV" +msgstr "Kartenprüfwert" + +#: classes/gateways/class.pmprogateway_braintree.php:484 +#: classes/gateways/class.pmprogateway_stripe.php:647 pages/billing.php:349 +#: pages/checkout.php:493 classes/gateways/class.pmprogateway_braintree.php:341 +#: classes/gateways/class.pmprogateway_braintree.php:354 +#: classes/gateways/class.pmprogateway_braintree.php:356 +#: classes/gateways/class.pmprogateway_braintree.php:359 +#: classes/gateways/class.pmprogateway_braintree.php:360 +#: classes/gateways/class.pmprogateway_braintree.php:392 +#: classes/gateways/class.pmprogateway_braintree.php:394 +#: classes/gateways/class.pmprogateway_braintree.php:456 +#: classes/gateways/class.pmprogateway_stripe.php:487 +#: classes/gateways/class.pmprogateway_stripe.php:488 +#: classes/gateways/class.pmprogateway_stripe.php:498 +#: classes/gateways/class.pmprogateway_stripe.php:502 +#: classes/gateways/class.pmprogateway_stripe.php:528 +#: classes/gateways/class.pmprogateway_stripe.php:532 +#: classes/gateways/class.pmprogateway_stripe.php:533 +#: classes/gateways/class.pmprogateway_stripe.php:536 +#: classes/gateways/class.pmprogateway_stripe.php:554 +#: classes/gateways/class.pmprogateway_stripe.php:565 +#: classes/gateways/class.pmprogateway_stripe.php:603 +#: classes/gateways/class.pmprogateway_stripe.php:630 +#: classes/gateways/class.pmprogateway_stripe.php:639 +#: classes/gateways/class.pmprogateway_stripe.php:655 +#: classes/gateways/class.pmprogateway_stripe.php:656 pages/billing.php:282 +#: pages/billing.php:286 pages/billing.php:295 pages/billing.php:298 +#: pages/billing.php:302 pages/billing.php:344 pages/billing.php:352 +#: pages/billing.php:353 pages/billing.php:355 pages/billing.php:358 +#: pages/billing.php:381 pages/checkout.php:541 pages/checkout.php:557 +#: pages/checkout.php:558 pages/checkout.php:565 pages/checkout.php:586 +#: pages/checkout.php:595 pages/checkout.php:604 pages/checkout.php:606 +#: pages/checkout.php:608 pages/checkout.php:609 pages/checkout.php:613 +#: pages/checkout.php:616 classes/gateways/class.pmprogateway_braintree.php:504 +#: pages/billing.php:411 pages/checkout.php:425 +msgid "what's this?" +msgstr "Was ist das?" + +#: classes/gateways/class.pmprogateway_braintree.php:491 +#: classes/gateways/class.pmprogateway_stripe.php:654 pages/checkout.php:78 +#: pages/checkout.php:500 classes/gateways/class.pmprogateway_braintree.php:351 +#: classes/gateways/class.pmprogateway_braintree.php:364 +#: classes/gateways/class.pmprogateway_braintree.php:366 +#: classes/gateways/class.pmprogateway_braintree.php:369 +#: classes/gateways/class.pmprogateway_braintree.php:370 +#: classes/gateways/class.pmprogateway_braintree.php:402 +#: classes/gateways/class.pmprogateway_braintree.php:404 +#: classes/gateways/class.pmprogateway_braintree.php:450 +#: classes/gateways/class.pmprogateway_braintree.php:466 +#: classes/gateways/class.pmprogateway_stripe.php:497 +#: classes/gateways/class.pmprogateway_stripe.php:498 +#: classes/gateways/class.pmprogateway_stripe.php:508 +#: classes/gateways/class.pmprogateway_stripe.php:512 +#: classes/gateways/class.pmprogateway_stripe.php:538 +#: classes/gateways/class.pmprogateway_stripe.php:542 +#: classes/gateways/class.pmprogateway_stripe.php:543 +#: classes/gateways/class.pmprogateway_stripe.php:546 +#: classes/gateways/class.pmprogateway_stripe.php:564 +#: classes/gateways/class.pmprogateway_stripe.php:575 +#: classes/gateways/class.pmprogateway_stripe.php:613 +#: classes/gateways/class.pmprogateway_stripe.php:640 +#: classes/gateways/class.pmprogateway_stripe.php:646 +#: classes/gateways/class.pmprogateway_stripe.php:662 +#: classes/gateways/class.pmprogateway_stripe.php:663 pages/checkout.php:79 +#: pages/checkout.php:80 pages/checkout.php:87 pages/checkout.php:88 +#: pages/checkout.php:95 pages/checkout.php:98 pages/checkout.php:551 +#: pages/checkout.php:567 pages/checkout.php:568 pages/checkout.php:575 +#: pages/checkout.php:596 pages/checkout.php:605 pages/checkout.php:614 +#: pages/checkout.php:618 pages/checkout.php:619 pages/checkout.php:621 +#: pages/checkout.php:624 classes/gateways/class.pmprogateway_braintree.php:511 +#: classes/gateways/class.pmprogateway_stripe.php:1307 pages/checkout.php:107 +#: pages/checkout.php:432 classes/gateways/class.pmprogateway_stripe.php:1319 +#: classes/gateways/class.pmprogateway_stripe.php:1338 +#: classes/gateways/class.pmprogateway_stripe.php:1344 +msgid "Apply" +msgstr "Übernehmen" + +#: classes/gateways/class.pmprogateway_braintree.php:550 +#: classes/gateways/class.pmprogateway_braintree.php:567 +#: classes/gateways/class.pmprogateway_braintree.php:657 +#: classes/gateways/class.pmprogateway_braintree.php:822 +#: classes/gateways/class.pmprogateway_braintree.php:927 +#: classes/gateways/class.pmprogateway_braintree.php:947 +#: classes/gateways/class.pmprogateway_braintree.php:509 +#: classes/gateways/class.pmprogateway_braintree.php:524 +#: classes/gateways/class.pmprogateway_braintree.php:526 +#: classes/gateways/class.pmprogateway_braintree.php:541 +#: classes/gateways/class.pmprogateway_braintree.php:616 +#: classes/gateways/class.pmprogateway_braintree.php:623 +#: classes/gateways/class.pmprogateway_braintree.php:781 +#: classes/gateways/class.pmprogateway_braintree.php:782 +#: classes/gateways/class.pmprogateway_braintree.php:886 +#: classes/gateways/class.pmprogateway_braintree.php:887 +#: classes/gateways/class.pmprogateway_braintree.php:906 +#: classes/gateways/class.pmprogateway_braintree.php:907 +#: classes/gateways/class.pmprogateway_braintree.php:570 +#: classes/gateways/class.pmprogateway_braintree.php:587 +#: classes/gateways/class.pmprogateway_braintree.php:677 +#: classes/gateways/class.pmprogateway_braintree.php:848 +#: classes/gateways/class.pmprogateway_braintree.php:957 +#: classes/gateways/class.pmprogateway_braintree.php:984 +msgid "Payment error: Please contact the webmaster (braintree-load-error)" +msgstr "Fehler bei der Zahlung: Bitte kontaktieren Sie Ihren Webmaster (braintree-load-error)" + +#: classes/gateways/class.pmprogateway_braintree.php:554 +#: classes/gateways/class.pmprogateway_stripe.php:1131 +#: classes/gateways/class.pmprogateway_braintree.php:61 +#: classes/gateways/class.pmprogateway_braintree.php:406 +#: classes/gateways/class.pmprogateway_braintree.php:419 +#: classes/gateways/class.pmprogateway_braintree.php:421 +#: classes/gateways/class.pmprogateway_braintree.php:424 +#: classes/gateways/class.pmprogateway_braintree.php:425 +#: classes/gateways/class.pmprogateway_braintree.php:457 +#: classes/gateways/class.pmprogateway_braintree.php:459 +#: classes/gateways/class.pmprogateway_braintree.php:513 +#: classes/gateways/class.pmprogateway_braintree.php:528 +#: classes/gateways/class.pmprogateway_stripe.php:53 +#: classes/gateways/class.pmprogateway_stripe.php:1011 +#: classes/gateways/class.pmprogateway_stripe.php:1025 +#: classes/gateways/class.pmprogateway_stripe.php:1026 +#: classes/gateways/class.pmprogateway_stripe.php:1036 +#: classes/gateways/class.pmprogateway_stripe.php:1040 +#: classes/gateways/class.pmprogateway_stripe.php:1068 +#: classes/gateways/class.pmprogateway_stripe.php:1072 +#: classes/gateways/class.pmprogateway_stripe.php:1073 +#: classes/gateways/class.pmprogateway_stripe.php:1076 +#: classes/gateways/class.pmprogateway_stripe.php:1094 +#: classes/gateways/class.pmprogateway_stripe.php:1105 +#: classes/gateways/class.pmprogateway_stripe.php:1123 +#: classes/gateways/class.pmprogateway_stripe.php:1139 +#: classes/gateways/class.pmprogateway_stripe.php:1140 +#: classes/gateways/class.pmprogateway_stripe.php:1143 +#: classes/gateways/class.pmprogateway_stripe.php:1176 +#: classes/gateways/class.pmprogateway_braintree.php:574 +msgid "Unknown error: Initial payment failed." +msgstr "Unbekannter Fehler: Einmal-Zahlung fehlgeschlagen." + +#: classes/gateways/class.pmprogateway_braintree.php:630 +#: classes/gateways/class.pmprogateway_braintree.php:120 +#: classes/gateways/class.pmprogateway_braintree.php:465 +#: classes/gateways/class.pmprogateway_braintree.php:478 +#: classes/gateways/class.pmprogateway_braintree.php:480 +#: classes/gateways/class.pmprogateway_braintree.php:483 +#: classes/gateways/class.pmprogateway_braintree.php:484 +#: classes/gateways/class.pmprogateway_braintree.php:516 +#: classes/gateways/class.pmprogateway_braintree.php:518 +#: classes/gateways/class.pmprogateway_braintree.php:589 +#: classes/gateways/class.pmprogateway_braintree.php:596 +#: classes/gateways/class.pmprogateway_braintree.php:650 +msgid "Error during settlement:" +msgstr "Fehler während der Abrechnung:" + +#: classes/gateways/class.pmprogateway_braintree.php:639 +#: classes/gateways/class.pmprogateway_braintree.php:129 +#: classes/gateways/class.pmprogateway_braintree.php:474 +#: classes/gateways/class.pmprogateway_braintree.php:487 +#: classes/gateways/class.pmprogateway_braintree.php:489 +#: classes/gateways/class.pmprogateway_braintree.php:492 +#: classes/gateways/class.pmprogateway_braintree.php:493 +#: classes/gateways/class.pmprogateway_braintree.php:525 +#: classes/gateways/class.pmprogateway_braintree.php:527 +#: classes/gateways/class.pmprogateway_braintree.php:598 +#: classes/gateways/class.pmprogateway_braintree.php:605 +#: classes/gateways/class.pmprogateway_braintree.php:659 +msgid "Error during charge:" +msgstr "Fehler während der Abbuchung:" + +#: classes/gateways/class.pmprogateway_braintree.php:731 +#: classes/gateways/class.pmprogateway_braintree.php:690 +#: classes/gateways/class.pmprogateway_braintree.php:750 +#, php-format +msgid "Failed to update customer: %s" +msgstr "Kunde konnte nicht aktualisiert werden: %s" + +#: classes/gateways/class.pmprogateway_braintree.php:743 +#: classes/gateways/class.pmprogateway_braintree.php:198 +#: classes/gateways/class.pmprogateway_braintree.php:221 +#: classes/gateways/class.pmprogateway_braintree.php:566 +#: classes/gateways/class.pmprogateway_braintree.php:579 +#: classes/gateways/class.pmprogateway_braintree.php:581 +#: classes/gateways/class.pmprogateway_braintree.php:584 +#: classes/gateways/class.pmprogateway_braintree.php:585 +#: classes/gateways/class.pmprogateway_braintree.php:617 +#: classes/gateways/class.pmprogateway_braintree.php:619 +#: classes/gateways/class.pmprogateway_braintree.php:702 +#: classes/gateways/class.pmprogateway_braintree.php:703 +#: classes/gateways/class.pmprogateway_braintree.php:762 +msgid "Failed to update customer." +msgstr "Kunde konnte nicht aktualisiert werden." + +#: classes/gateways/class.pmprogateway_braintree.php:791 +#: classes/gateways/class.pmprogateway_braintree.php:246 +#: classes/gateways/class.pmprogateway_braintree.php:269 +#: classes/gateways/class.pmprogateway_braintree.php:614 +#: classes/gateways/class.pmprogateway_braintree.php:627 +#: classes/gateways/class.pmprogateway_braintree.php:629 +#: classes/gateways/class.pmprogateway_braintree.php:632 +#: classes/gateways/class.pmprogateway_braintree.php:633 +#: classes/gateways/class.pmprogateway_braintree.php:665 +#: classes/gateways/class.pmprogateway_braintree.php:667 +#: classes/gateways/class.pmprogateway_braintree.php:750 +#: classes/gateways/class.pmprogateway_braintree.php:751 +#: classes/gateways/class.pmprogateway_braintree.php:810 +msgid "Failed to create customer." +msgstr "Kunde konnte nicht angelegt werden." + +#: classes/gateways/class.pmprogateway_braintree.php:798 +#: classes/gateways/class.pmprogateway_braintree.php:253 +#: classes/gateways/class.pmprogateway_braintree.php:276 +#: classes/gateways/class.pmprogateway_braintree.php:621 +#: classes/gateways/class.pmprogateway_braintree.php:634 +#: classes/gateways/class.pmprogateway_braintree.php:636 +#: classes/gateways/class.pmprogateway_braintree.php:639 +#: classes/gateways/class.pmprogateway_braintree.php:640 +#: classes/gateways/class.pmprogateway_braintree.php:672 +#: classes/gateways/class.pmprogateway_braintree.php:674 +#: classes/gateways/class.pmprogateway_braintree.php:757 +#: classes/gateways/class.pmprogateway_braintree.php:758 +#: classes/gateways/class.pmprogateway_braintree.php:817 +msgid "Error creating customer record with Braintree:" +msgstr "Braintree meldet einen Fehler bei der Erstellung des Kunden Protokolls:" + +#: classes/gateways/class.pmprogateway_braintree.php:903 +#: classes/gateways/class.pmprogateway_braintree.php:344 +#: classes/gateways/class.pmprogateway_braintree.php:345 +#: classes/gateways/class.pmprogateway_braintree.php:376 +#: classes/gateways/class.pmprogateway_braintree.php:721 +#: classes/gateways/class.pmprogateway_braintree.php:734 +#: classes/gateways/class.pmprogateway_braintree.php:736 +#: classes/gateways/class.pmprogateway_braintree.php:739 +#: classes/gateways/class.pmprogateway_braintree.php:740 +#: classes/gateways/class.pmprogateway_braintree.php:772 +#: classes/gateways/class.pmprogateway_braintree.php:774 +#: classes/gateways/class.pmprogateway_braintree.php:862 +#: classes/gateways/class.pmprogateway_braintree.php:863 +msgid "Error subscribing customer to plan with Braintree:" +msgstr "Braintree meldet einen Fehler beim Einrichten des Abos für den Kunden:" + +#: classes/gateways/class.pmprogateway_braintree.php:918 +#: classes/gateways/class.pmprogateway_braintree.php:359 +#: classes/gateways/class.pmprogateway_braintree.php:360 +#: classes/gateways/class.pmprogateway_braintree.php:391 +#: classes/gateways/class.pmprogateway_braintree.php:736 +#: classes/gateways/class.pmprogateway_braintree.php:749 +#: classes/gateways/class.pmprogateway_braintree.php:751 +#: classes/gateways/class.pmprogateway_braintree.php:754 +#: classes/gateways/class.pmprogateway_braintree.php:755 +#: classes/gateways/class.pmprogateway_braintree.php:787 +#: classes/gateways/class.pmprogateway_braintree.php:789 +#: classes/gateways/class.pmprogateway_braintree.php:877 +#: classes/gateways/class.pmprogateway_braintree.php:878 +msgid "Failed to subscribe with Braintree:" +msgstr "Braintree meldet einen Fehler beim Einrichten des Abos für den Kunden:" + +#: classes/gateways/class.pmprogateway_braintree.php:966 +#: classes/gateways/class.pmprogateway_braintree.php:979 +#: classes/gateways/class.pmprogateway_braintree.php:986 +#: classes/gateways/class.pmprogateway_braintree.php:397 +#: classes/gateways/class.pmprogateway_braintree.php:398 +#: classes/gateways/class.pmprogateway_braintree.php:410 +#: classes/gateways/class.pmprogateway_braintree.php:411 +#: classes/gateways/class.pmprogateway_braintree.php:417 +#: classes/gateways/class.pmprogateway_braintree.php:418 +#: classes/gateways/class.pmprogateway_braintree.php:429 +#: classes/gateways/class.pmprogateway_braintree.php:442 +#: classes/gateways/class.pmprogateway_braintree.php:449 +#: classes/gateways/class.pmprogateway_braintree.php:774 +#: classes/gateways/class.pmprogateway_braintree.php:787 +#: classes/gateways/class.pmprogateway_braintree.php:789 +#: classes/gateways/class.pmprogateway_braintree.php:792 +#: classes/gateways/class.pmprogateway_braintree.php:793 +#: classes/gateways/class.pmprogateway_braintree.php:794 +#: classes/gateways/class.pmprogateway_braintree.php:800 +#: classes/gateways/class.pmprogateway_braintree.php:802 +#: classes/gateways/class.pmprogateway_braintree.php:805 +#: classes/gateways/class.pmprogateway_braintree.php:806 +#: classes/gateways/class.pmprogateway_braintree.php:807 +#: classes/gateways/class.pmprogateway_braintree.php:809 +#: classes/gateways/class.pmprogateway_braintree.php:812 +#: classes/gateways/class.pmprogateway_braintree.php:813 +#: classes/gateways/class.pmprogateway_braintree.php:825 +#: classes/gateways/class.pmprogateway_braintree.php:827 +#: classes/gateways/class.pmprogateway_braintree.php:838 +#: classes/gateways/class.pmprogateway_braintree.php:840 +#: classes/gateways/class.pmprogateway_braintree.php:845 +#: classes/gateways/class.pmprogateway_braintree.php:847 +#: classes/gateways/class.pmprogateway_braintree.php:925 +#: classes/gateways/class.pmprogateway_braintree.php:926 +#: classes/gateways/class.pmprogateway_braintree.php:938 +#: classes/gateways/class.pmprogateway_braintree.php:939 +#: classes/gateways/class.pmprogateway_braintree.php:945 +#: classes/gateways/class.pmprogateway_braintree.php:946 +#: classes/gateways/class.pmprogateway_stripe.php:343 +#: classes/gateways/class.pmprogateway_stripe.php:344 +#: classes/gateways/class.pmprogateway_stripe.php:351 +#: classes/gateways/class.pmprogateway_stripe.php:353 +#: classes/gateways/class.pmprogateway_stripe.php:354 +#: classes/gateways/class.pmprogateway_stripe.php:361 +#: classes/gateways/class.pmprogateway_stripe.php:396 +#: classes/gateways/class.pmprogateway_stripe.php:402 +#: classes/gateways/class.pmprogateway_stripe.php:423 +#: classes/gateways/class.pmprogateway_braintree.php:1036 +msgid "Could not find the subscription." +msgstr "Abonnement konnte nicht gefunden werden." + +#: classes/gateways/class.pmprogateway_check.php:49 +#: paid-memberships-pro.php:130 adminpages/orders.php:399 +#: adminpages/orders.php:449 adminpages/paymentsettings.php:157 +#: adminpages/paymentsettings.php:159 +#: classes/gateways/class.pmprogateway_check.php:48 +#: paid-memberships-pro.php:116 paid-memberships-pro.php:117 +#: paid-memberships-pro.php:124 paid-memberships-pro.php:125 +#: paid-memberships-pro.php:126 paid-memberships-pro.php:127 +#: paid-memberships-pro.php:128 paid-memberships-pro.php:129 +#: paid-memberships-pro.php:136 paid-memberships-pro.php:158 +#: paid-memberships-pro.php:160 +msgid "Pay by Check" +msgstr "Zahlen auf Rechnung" + +#: classes/gateways/class.pmprogateway_check.php:101 +#: classes/gateways/class.pmprogateway_check.php:100 +#: classes/gateways/class.pmprogateway_check.php:102 +msgid "Pay by Check Settings" +msgstr "Zahlen auf Rechnung Einstellungen" + +#: classes/gateways/class.pmprogateway_check.php:106 +#: adminpages/paymentsettings.php:389 adminpages/paymentsettings.php:415 +#: adminpages/paymentsettings.php:420 adminpages/paymentsettings.php:422 +#: classes/gateways/class.pmprogateway_check.php:105 +#: classes/gateways/class.pmprogateway_check.php:107 +msgid "Instructions" +msgstr "Anleitung" + +#: classes/gateways/class.pmprogateway_check.php:110 +#: adminpages/paymentsettings.php:393 adminpages/paymentsettings.php:419 +#: adminpages/paymentsettings.php:424 adminpages/paymentsettings.php:426 +#: classes/gateways/class.pmprogateway_check.php:109 +#: classes/gateways/class.pmprogateway_check.php:111 +msgid "Who to write the check out to. Where to mail it. Shown on checkout, confirmation, and invoice pages." +msgstr "An wen soll der Scheck ausgestellt werden? Wohin soll er geschickt werden? Wird beim Checkout, der Bestätigung und auf Rechnungs-Seiten angezeigt." + +#: classes/gateways/class.pmprogateway_cybersource.php:42 +#: classes/gateways/class.pmprogateway_cybersource.php:36 +msgid "CyberSource" +msgstr "CyberSource" + +#: classes/gateways/class.pmprogateway_cybersource.php:96 +#: classes/gateways/class.pmprogateway_cybersource.php:84 +msgid "CyberSource Settings" +msgstr "CyberSource Einstellungen" + +#: classes/gateways/class.pmprogateway_cybersource.php:101 +#: adminpages/paymentsettings.php:174 +#: classes/gateways/class.pmprogateway_cybersource.php:89 +msgid "This gateway option is in beta. Some functionality may not be available. Please contact Paid Memberships Pro with any issues you run into. Please be sure to upgrade Paid Memberships Pro to the latest versions when available." +msgstr "Diese Option ist im Beta-Statdium. Manche Funktionen sind möglicherweise nicht verfügbar. Kontaktieren Sie bitte Paid Memberships Pro wenn irgendwelche Probleme auftreten. Bitte aktualisieren Sie Paid Memberships Pro falls eine neuere Version verfügbar ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:114 +#: adminpages/paymentsettings.php:372 adminpages/paymentsettings.php:377 +#: classes/gateways/class.pmprogateway_cybersource.php:102 +msgid "Transaction Security Key" +msgstr "Transaktionssicherheitsschlüssel" + +#: classes/gateways/class.pmprogateway_payflowpro.php:39 +msgid "Payflow Pro/PayPal Pro" +msgstr "Payflow Pro/PayPal Pro" + +#: classes/gateways/class.pmprogateway_payflowpro.php:95 +#: classes/gateways/class.pmprogateway_payflowpro.php:96 +msgid "Payflow Pro Settings" +msgstr "Payflow Pro Einstellungen" + +#: classes/gateways/class.pmprogateway_payflowpro.php:100 +#: adminpages/paymentsettings.php:195 adminpages/paymentsettings.php:199 +#: adminpages/paymentsettings.php:204 +#: classes/gateways/class.pmprogateway_payflowpro.php:101 +msgid "Partner" +msgstr "Partner" + +#: classes/gateways/class.pmprogateway_payflowpro.php:108 +#: adminpages/paymentsettings.php:203 adminpages/paymentsettings.php:207 +#: adminpages/paymentsettings.php:212 +#: classes/gateways/class.pmprogateway_payflowpro.php:109 +msgid "Vendor" +msgstr "Anbieter" + +#: classes/gateways/class.pmprogateway_payflowpro.php:124 +#: pages/checkout.php:176 adminpages/paymentsettings.php:219 +#: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:228 +#: pages/checkout.php:177 pages/checkout.php:180 pages/checkout.php:182 +#: pages/checkout.php:189 pages/checkout.php:191 pages/checkout.php:193 +#: pages/checkout.php:200 pages/checkout.php:203 +#: classes/gateways/class.pmprogateway_payflowpro.php:125 +#: pages/checkout.php:143 +msgid "Password" +msgstr "Passwort" + +#: classes/gateways/class.pmprogateway_payflowpro.php:132 +#: classes/gateways/class.pmprogateway_payflowpro.php:133 +msgid "IPN Handler" +msgstr "IPN Handler" + +#: classes/gateways/class.pmprogateway_payflowpro.php:137 +#, php-format +msgid "Payflow does not use IPN. To sync recurring subscriptions, please see this addon." +msgstr "Payflow verwendet kein IPN. Um Abo-Mitgliedschaften zu synchronisieren, siehe dieses Add-On." + +#: classes/gateways/class.pmprogateway_payflowpro.php:194 +#: classes/gateways/class.pmprogateway_paypal.php:302 +#: classes/gateways/class.pmprogateway_payflowpro.php:57 +#: classes/gateways/class.pmprogateway_paypal.php:57 +#: classes/gateways/class.pmprogateway_paypal.php:277 +#: classes/gateways/class.pmprogateway_paypal.php:279 +#: classes/gateways/class.pmprogateway_payflowpro.php:203 +#: classes/gateways/class.pmprogateway_paypal.php:345 +msgid "A partial payment was made that we could not refund. Please contact the site owner immediately to correct this." +msgstr "Es wurde eine Teilzahlung veranlasst, die wir nicht rückerstatten können. Kontaktieren Sie bitte den Betreiber der Seite um das zu klären." + +#: classes/gateways/class.pmprogateway_paypal.php:68 +#: paid-memberships-pro.php:133 +#: classes/gateways/class.pmprogateway_paypal.php:57 +#: paid-memberships-pro.php:119 paid-memberships-pro.php:120 +#: paid-memberships-pro.php:127 paid-memberships-pro.php:128 +#: paid-memberships-pro.php:129 paid-memberships-pro.php:130 +#: paid-memberships-pro.php:131 paid-memberships-pro.php:132 +#: paid-memberships-pro.php:139 paid-memberships-pro.php:161 +#: paid-memberships-pro.php:163 +msgid "PayPal Website Payments Pro" +msgstr "PayPal Website Payments Pro" + +#: classes/gateways/class.pmprogateway_paypal.php:125 +#: classes/gateways/class.pmprogateway_paypalexpress.php:140 +#: classes/gateways/class.pmprogateway_paypalstandard.php:132 +#: classes/gateways/class.pmprogateway_paypal.php:113 +#: classes/gateways/class.pmprogateway_paypalexpress.php:118 +#: classes/gateways/class.pmprogateway_paypalexpress.php:128 +#: classes/gateways/class.pmprogateway_paypalstandard.php:112 +#: classes/gateways/class.pmprogateway_paypal.php:132 +#: classes/gateways/class.pmprogateway_paypalexpress.php:141 +#: classes/gateways/class.pmprogateway_paypalstandard.php:133 +#: classes/gateways/class.pmprogateway_paypalexpress.php:151 +msgid "PayPal Settings" +msgstr "PayPal Einstellungen" + +#: classes/gateways/class.pmprogateway_paypal.php:130 +#: classes/gateways/class.pmprogateway_paypalexpress.php:145 +#: classes/gateways/class.pmprogateway_paypalstandard.php:137 +#: adminpages/paymentsettings.php:179 +#: classes/gateways/class.pmprogateway_paypal.php:118 +#: classes/gateways/class.pmprogateway_paypalexpress.php:123 +#: classes/gateways/class.pmprogateway_paypalexpress.php:133 +#: classes/gateways/class.pmprogateway_paypalstandard.php:117 +msgid "We do not recommend using PayPal Standard. We suggest using PayPal Express, Website Payments Pro (Legacy), or PayPal Pro (Payflow Pro). More information on why can be found here." +msgstr "Wir empfehlen nicht die Verwendung von PayPal Standard. Wir empfehlen PayPal Express, Website Payments Pro (Legacy), oder PayPal Pro (Payflow Pro). Mehr Informationen über die Gründe finden Sie hier." + +#: classes/gateways/class.pmprogateway_paypal.php:135 +#: classes/gateways/class.pmprogateway_paypalexpress.php:150 +#: classes/gateways/class.pmprogateway_paypalstandard.php:142 +#: adminpages/paymentsettings.php:227 adminpages/paymentsettings.php:231 +#: adminpages/paymentsettings.php:236 +#: classes/gateways/class.pmprogateway_paypal.php:123 +#: classes/gateways/class.pmprogateway_paypalexpress.php:128 +#: classes/gateways/class.pmprogateway_paypalexpress.php:138 +#: classes/gateways/class.pmprogateway_paypalstandard.php:122 +#: classes/gateways/class.pmprogateway_paypal.php:153 +#: classes/gateways/class.pmprogateway_paypalexpress.php:162 +#: classes/gateways/class.pmprogateway_paypalstandard.php:154 +#: classes/gateways/class.pmprogateway_paypalexpress.php:172 +msgid "Gateway Account Email" +msgstr "Zahlungsdienstleister Konto E-Mail" + +#: classes/gateways/class.pmprogateway_paypal.php:143 +#: classes/gateways/class.pmprogateway_paypalexpress.php:158 +#: classes/gateways/class.pmprogateway_paypalstandard.php:150 +#: classes/gateways/class.pmprogateway_twocheckout.php:119 +#: adminpages/paymentsettings.php:235 adminpages/paymentsettings.php:239 +#: adminpages/paymentsettings.php:244 adminpages/paymentsettings.php:331 +#: adminpages/paymentsettings.php:336 +#: classes/gateways/class.pmprogateway_paypal.php:131 +#: classes/gateways/class.pmprogateway_paypalexpress.php:136 +#: classes/gateways/class.pmprogateway_paypalexpress.php:146 +#: classes/gateways/class.pmprogateway_paypalstandard.php:130 +#: classes/gateways/class.pmprogateway_twocheckout.php:113 +#: classes/gateways/class.pmprogateway_twocheckout.php:121 +#: classes/gateways/class.pmprogateway_paypal.php:161 +#: classes/gateways/class.pmprogateway_paypalexpress.php:170 +#: classes/gateways/class.pmprogateway_paypalstandard.php:162 +#: classes/gateways/class.pmprogateway_twocheckout.php:120 +#: classes/gateways/class.pmprogateway_paypalexpress.php:180 +msgid "API Username" +msgstr "API Benutzername" + +#: classes/gateways/class.pmprogateway_paypal.php:151 +#: classes/gateways/class.pmprogateway_paypalexpress.php:166 +#: classes/gateways/class.pmprogateway_paypalstandard.php:158 +#: classes/gateways/class.pmprogateway_twocheckout.php:128 +#: adminpages/paymentsettings.php:243 adminpages/paymentsettings.php:247 +#: adminpages/paymentsettings.php:252 adminpages/paymentsettings.php:339 +#: adminpages/paymentsettings.php:344 +#: classes/gateways/class.pmprogateway_paypal.php:139 +#: classes/gateways/class.pmprogateway_paypalexpress.php:144 +#: classes/gateways/class.pmprogateway_paypalexpress.php:154 +#: classes/gateways/class.pmprogateway_paypalstandard.php:138 +#: classes/gateways/class.pmprogateway_twocheckout.php:121 +#: classes/gateways/class.pmprogateway_twocheckout.php:130 +#: classes/gateways/class.pmprogateway_paypal.php:169 +#: classes/gateways/class.pmprogateway_paypalexpress.php:178 +#: classes/gateways/class.pmprogateway_paypalstandard.php:170 +#: classes/gateways/class.pmprogateway_twocheckout.php:129 +#: classes/gateways/class.pmprogateway_paypalexpress.php:188 +msgid "API Password" +msgstr "API Passwort" + +#: classes/gateways/class.pmprogateway_paypal.php:159 +#: classes/gateways/class.pmprogateway_paypalexpress.php:174 +#: classes/gateways/class.pmprogateway_paypalstandard.php:166 +#: adminpages/paymentsettings.php:251 adminpages/paymentsettings.php:255 +#: adminpages/paymentsettings.php:260 +#: classes/gateways/class.pmprogateway_paypal.php:147 +#: classes/gateways/class.pmprogateway_paypalexpress.php:152 +#: classes/gateways/class.pmprogateway_paypalexpress.php:162 +#: classes/gateways/class.pmprogateway_paypalstandard.php:146 +#: classes/gateways/class.pmprogateway_paypal.php:177 +#: classes/gateways/class.pmprogateway_paypalexpress.php:186 +#: classes/gateways/class.pmprogateway_paypalstandard.php:178 +#: classes/gateways/class.pmprogateway_paypalexpress.php:196 +msgid "API Signature" +msgstr "API Signatur" + +#: classes/gateways/class.pmprogateway_paypal.php:167 +#: classes/gateways/class.pmprogateway_paypalexpress.php:182 +#: classes/gateways/class.pmprogateway_paypal.php:185 +#: classes/gateways/class.pmprogateway_paypalexpress.php:194 +#: classes/gateways/class.pmprogateway_paypalexpress.php:204 +msgid "Confirmation Step" +msgstr "Bestätigungsschritt" + +#: classes/gateways/class.pmprogateway_paypal.php:178 +#: classes/gateways/class.pmprogateway_paypalexpress.php:193 +#: classes/gateways/class.pmprogateway_paypalstandard.php:174 +#: adminpages/paymentsettings.php:446 adminpages/paymentsettings.php:479 +#: adminpages/paymentsettings.php:485 adminpages/paymentsettings.php:487 +#: classes/gateways/class.pmprogateway_paypal.php:155 +#: classes/gateways/class.pmprogateway_paypalexpress.php:160 +#: classes/gateways/class.pmprogateway_paypalexpress.php:170 +#: classes/gateways/class.pmprogateway_paypalstandard.php:154 +#: classes/gateways/class.pmprogateway_paypal.php:196 +#: classes/gateways/class.pmprogateway_paypalexpress.php:205 +#: classes/gateways/class.pmprogateway_paypalstandard.php:186 +#: classes/gateways/class.pmprogateway_paypalexpress.php:215 +msgid "IPN Handler URL" +msgstr "IPN Handler URL" + +#: classes/gateways/class.pmprogateway_paypal.php:181 +#: classes/gateways/class.pmprogateway_paypal.php:158 +msgid "This URL is passed to PayPal for all new charges and subscriptions. You SHOULD NOT set this in your PayPal account settings." +msgstr "Diese URL wird an PayPal für alle neuen Zahlungen und Anmeldungen weitergeleitet. Sie sollten dies NICHT ih Ihren PayPal Kontoeinstellungen einstellen." + +#: classes/gateways/class.pmprogateway_paypal.php:201 +#: classes/gateways/class.pmprogateway_paypalexpress.php:444 +#: classes/gateways/class.pmprogateway_paypalstandard.php:229 +#: pages/checkout.php:263 classes/gateways/class.pmprogateway_paypal.php:178 +#: classes/gateways/class.pmprogateway_paypalexpress.php:402 +#: classes/gateways/class.pmprogateway_paypalexpress.php:412 +#: classes/gateways/class.pmprogateway_paypalexpress.php:438 +#: classes/gateways/class.pmprogateway_paypalstandard.php:201 +#: classes/gateways/class.pmprogateway_paypalstandard.php:202 +#: pages/checkout.php:286 pages/checkout.php:288 pages/checkout.php:295 +#: pages/checkout.php:300 pages/checkout.php:302 pages/checkout.php:309 +#: pages/checkout.php:312 pages/checkout.php:675 pages/checkout.php:682 +#: pages/checkout.php:685 pages/checkout.php:701 +#: classes/gateways/class.pmprogateway_paypal.php:281 +#: classes/gateways/class.pmprogateway_paypalexpress.php:488 +#: classes/gateways/class.pmprogateway_paypalstandard.php:241 +#: pages/checkout.php:218 +#: classes/gateways/class.pmprogateway_paypalexpress.php:498 +msgid "Check Out with PayPal" +msgstr "Zahlung mit PayPal abschließen" + +#: classes/gateways/class.pmprogateway_paypal.php:207 +#: classes/gateways/class.pmprogateway_paypalexpress.php:449 +#: classes/gateways/class.pmprogateway_paypalstandard.php:234 +#: pages/checkout.php:598 classes/gateways/class.pmprogateway_paypal.php:184 +#: classes/gateways/class.pmprogateway_paypalexpress.php:408 +#: classes/gateways/class.pmprogateway_paypalexpress.php:418 +#: classes/gateways/class.pmprogateway_paypalexpress.php:443 +#: classes/gateways/class.pmprogateway_paypalstandard.php:206 +#: classes/gateways/class.pmprogateway_paypalstandard.php:208 +#: pages/checkout.php:681 pages/checkout.php:688 pages/checkout.php:691 +#: pages/checkout.php:704 pages/checkout.php:707 pages/checkout.php:713 +#: pages/checkout.php:718 pages/checkout.php:722 pages/checkout.php:724 +#: pages/checkout.php:725 pages/checkout.php:728 pages/checkout.php:729 +#: classes/gateways/class.pmprogateway_paypal.php:287 +#: classes/gateways/class.pmprogateway_paypalexpress.php:493 +#: classes/gateways/class.pmprogateway_paypalstandard.php:246 +#: pages/checkout.php:526 +#: classes/gateways/class.pmprogateway_paypalexpress.php:503 +msgid "Submit and Check Out" +msgstr "Zahlung bestätigen" + +#: classes/gateways/class.pmprogateway_paypal.php:207 +#: classes/gateways/class.pmprogateway_paypalexpress.php:449 +#: classes/gateways/class.pmprogateway_paypalstandard.php:234 +#: classes/gateways/class.pmprogateway_twocheckout.php:203 +#: pages/checkout.php:598 classes/gateways/class.pmprogateway_paypal.php:184 +#: classes/gateways/class.pmprogateway_paypalexpress.php:408 +#: classes/gateways/class.pmprogateway_paypalexpress.php:418 +#: classes/gateways/class.pmprogateway_paypalexpress.php:443 +#: classes/gateways/class.pmprogateway_paypalstandard.php:206 +#: classes/gateways/class.pmprogateway_paypalstandard.php:208 +#: classes/gateways/class.pmprogateway_twocheckout.php:192 +#: classes/gateways/class.pmprogateway_twocheckout.php:214 +#: pages/checkout.php:681 pages/checkout.php:688 pages/checkout.php:691 +#: pages/checkout.php:704 pages/checkout.php:707 pages/checkout.php:713 +#: pages/checkout.php:718 pages/checkout.php:722 pages/checkout.php:724 +#: pages/checkout.php:725 pages/checkout.php:728 pages/checkout.php:729 +#: classes/gateways/class.pmprogateway_paypal.php:287 +#: classes/gateways/class.pmprogateway_paypalexpress.php:493 +#: classes/gateways/class.pmprogateway_paypalstandard.php:246 +#: classes/gateways/class.pmprogateway_twocheckout.php:205 +#: pages/checkout.php:526 +#: classes/gateways/class.pmprogateway_paypalexpress.php:503 +msgid "Submit and Confirm" +msgstr "Senden und Bestätigen" + +#: classes/gateways/class.pmprogateway_paypal.php:631 +#: classes/gateways/class.pmprogateway_paypalexpress.php:783 +#: classes/gateways/class.pmprogateway_paypalstandard.php:575 +#: classes/gateways/class.pmprogateway_paypal.php:385 +#: classes/gateways/class.pmprogateway_paypal.php:605 +#: classes/gateways/class.pmprogateway_paypal.php:607 +#: classes/gateways/class.pmprogateway_paypal.php:608 +#: classes/gateways/class.pmprogateway_paypalexpress.php:301 +#: classes/gateways/class.pmprogateway_paypalexpress.php:303 +#: classes/gateways/class.pmprogateway_paypalexpress.php:305 +#: classes/gateways/class.pmprogateway_paypalexpress.php:731 +#: classes/gateways/class.pmprogateway_paypalexpress.php:740 +#: classes/gateways/class.pmprogateway_paypalexpress.php:750 +#: classes/gateways/class.pmprogateway_paypalexpress.php:752 +#: classes/gateways/class.pmprogateway_paypalexpress.php:777 +#: classes/gateways/class.pmprogateway_paypalstandard.php:216 +#: classes/gateways/class.pmprogateway_paypalstandard.php:220 +#: classes/gateways/class.pmprogateway_paypalstandard.php:230 +#: classes/gateways/class.pmprogateway_paypalstandard.php:231 +#: classes/gateways/class.pmprogateway_paypalstandard.php:464 +#: classes/gateways/class.pmprogateway_paypalstandard.php:466 +#: classes/gateways/class.pmprogateway_paypal.php:716 +#: classes/gateways/class.pmprogateway_paypalexpress.php:831 +#: classes/gateways/class.pmprogateway_paypalstandard.php:588 +#: classes/gateways/class.pmprogateway_paypalexpress.php:841 +msgid "Please contact the site owner or cancel your subscription from within PayPal to make sure you are not charged going forward." +msgstr "Bitte kontaktieren Sie den Betreiber der Seite, wenn Sie Ihr Abonemment über PayPal stornieren, um sicherzugehen, dass Ihr PayPal Konto nicht weiterhin belastet wird." + +#: classes/gateways/class.pmprogateway_paypalexpress.php:84 +#: paid-memberships-pro.php:132 +#: classes/gateways/class.pmprogateway_paypalexpress.php:63 +#: classes/gateways/class.pmprogateway_paypalexpress.php:73 +#: paid-memberships-pro.php:118 paid-memberships-pro.php:119 +#: paid-memberships-pro.php:126 paid-memberships-pro.php:127 +#: paid-memberships-pro.php:128 paid-memberships-pro.php:129 +#: paid-memberships-pro.php:130 paid-memberships-pro.php:131 +#: paid-memberships-pro.php:138 paid-memberships-pro.php:160 +#: paid-memberships-pro.php:162 +#: classes/gateways/class.pmprogateway_paypalexpress.php:94 +msgid "PayPal Express" +msgstr "PayPal Express" + +#: classes/gateways/class.pmprogateway_paypalexpress.php:196 +#: adminpages/paymentsettings.php:449 adminpages/paymentsettings.php:482 +#: adminpages/paymentsettings.php:488 adminpages/paymentsettings.php:490 +#: classes/gateways/class.pmprogateway_paypalexpress.php:163 +#: classes/gateways/class.pmprogateway_paypalexpress.php:173 +#: classes/gateways/class.pmprogateway_paypal.php:199 +#: classes/gateways/class.pmprogateway_paypalexpress.php:208 +#: classes/gateways/class.pmprogateway_paypalexpress.php:218 +msgid "To fully integrate with PayPal, be sure to set your IPN Handler URL to " +msgstr "Um eine vollständige Integration mit PayPal zu erreichen, müssen Sie die URL Ihres IPN-Handlers auf " + +#: classes/gateways/class.pmprogateway_paypalexpress.php:307 +#: classes/gateways/class.pmprogateway_paypalexpress.php:363 +#: classes/gateways/class.pmprogateway_paypalexpress.php:268 +#: classes/gateways/class.pmprogateway_paypalexpress.php:278 +#: classes/gateways/class.pmprogateway_paypalexpress.php:301 +#: classes/gateways/class.pmprogateway_paypalexpress.php:320 +#: classes/gateways/class.pmprogateway_paypalexpress.php:330 +#: classes/gateways/class.pmprogateway_paypalexpress.php:357 +#: preheaders/checkout.php:690 preheaders/checkout.php:697 +#: preheaders/checkout.php:702 preheaders/checkout.php:735 +#: preheaders/checkout.php:750 preheaders/checkout.php:753 +#: preheaders/checkout.php:754 preheaders/checkout.php:757 +#: preheaders/checkout.php:762 preheaders/checkout.php:803 +#: preheaders/checkout.php:822 preheaders/checkout.php:823 +#: classes/gateways/class.pmprogateway_paypalexpress.php:342 +#: classes/gateways/class.pmprogateway_paypalexpress.php:401 +#: classes/gateways/class.pmprogateway_paypalexpress.php:352 +#: classes/gateways/class.pmprogateway_paypalexpress.php:411 +msgid "The PayPal Token was lost." +msgstr "Der PayPal Token ging verloren." + +#: classes/gateways/class.pmprogateway_paypalstandard.php:71 +#: paid-memberships-pro.php:135 +#: classes/gateways/class.pmprogateway_paypalstandard.php:60 +#: paid-memberships-pro.php:121 paid-memberships-pro.php:122 +#: paid-memberships-pro.php:129 paid-memberships-pro.php:130 +#: paid-memberships-pro.php:131 paid-memberships-pro.php:132 +#: paid-memberships-pro.php:133 paid-memberships-pro.php:134 +#: paid-memberships-pro.php:141 paid-memberships-pro.php:163 +#: paid-memberships-pro.php:165 +msgid "PayPal Standard" +msgstr "PayPal Standard" + +#: classes/gateways/class.pmprogateway_paypalstandard.php:177 +#: classes/gateways/class.pmprogateway_paypalstandard.php:157 +#: classes/gateways/class.pmprogateway_paypalstandard.php:189 +msgid "Here is your IPN URL for reference. You SHOULD NOT set this in your PayPal settings." +msgstr "Hier ist Ihre IPN URL als Referenz. Sie sollten diese NICHT in Ihren PayPal-Einstellungen angeben." + +#: classes/gateways/class.pmprogateway_paypalstandard.php:559 +#: classes/gateways/class.pmprogateway_paypalstandard.php:572 +msgid "User requested cancellation" +msgstr "Benutzer verlangte Kündigung" + +#: classes/gateways/class.pmprogateway_stripe.php:201 +#: paid-memberships-pro.php:131 +#: classes/gateways/class.pmprogateway_stripe.php:93 +#: classes/gateways/class.pmprogateway_stripe.php:94 +#: classes/gateways/class.pmprogateway_stripe.php:104 +#: classes/gateways/class.pmprogateway_stripe.php:126 +#: classes/gateways/class.pmprogateway_stripe.php:128 +#: classes/gateways/class.pmprogateway_stripe.php:129 +#: classes/gateways/class.pmprogateway_stripe.php:140 +#: classes/gateways/class.pmprogateway_stripe.php:142 +#: classes/gateways/class.pmprogateway_stripe.php:169 +#: paid-memberships-pro.php:117 paid-memberships-pro.php:118 +#: paid-memberships-pro.php:125 paid-memberships-pro.php:126 +#: paid-memberships-pro.php:127 paid-memberships-pro.php:128 +#: paid-memberships-pro.php:129 paid-memberships-pro.php:130 +#: paid-memberships-pro.php:137 +#: classes/gateways/class.pmprogateway_stripe.php:252 +#: paid-memberships-pro.php:159 paid-memberships-pro.php:161 +#: classes/gateways/class.pmprogateway_stripe.php:258 +msgid "Stripe" +msgstr "Stripe" + +#: classes/gateways/class.pmprogateway_stripe.php:256 +#: classes/gateways/class.pmprogateway_stripe.php:148 +#: classes/gateways/class.pmprogateway_stripe.php:149 +#: classes/gateways/class.pmprogateway_stripe.php:159 +#: classes/gateways/class.pmprogateway_stripe.php:181 +#: classes/gateways/class.pmprogateway_stripe.php:183 +#: classes/gateways/class.pmprogateway_stripe.php:184 +#: classes/gateways/class.pmprogateway_stripe.php:195 +#: classes/gateways/class.pmprogateway_stripe.php:197 +#: classes/gateways/class.pmprogateway_stripe.php:224 +msgid "Stripe Settings" +msgstr "Stripe Einstellungen" + +#: classes/gateways/class.pmprogateway_stripe.php:261 +#: adminpages/paymentsettings.php:285 adminpages/paymentsettings.php:289 +#: adminpages/paymentsettings.php:294 +#: classes/gateways/class.pmprogateway_stripe.php:161 +#: classes/gateways/class.pmprogateway_stripe.php:162 +#: classes/gateways/class.pmprogateway_stripe.php:172 +#: classes/gateways/class.pmprogateway_stripe.php:194 +#: classes/gateways/class.pmprogateway_stripe.php:196 +#: classes/gateways/class.pmprogateway_stripe.php:197 +#: classes/gateways/class.pmprogateway_stripe.php:208 +#: classes/gateways/class.pmprogateway_stripe.php:210 +#: classes/gateways/class.pmprogateway_stripe.php:237 +#: classes/gateways/class.pmprogateway_stripe.php:269 +#: classes/gateways/class.pmprogateway_stripe.php:523 +#: classes/gateways/class.pmprogateway_stripe.php:535 +#: classes/gateways/class.pmprogateway_stripe.php:554 +#: classes/gateways/class.pmprogateway_stripe.php:560 +msgid "Publishable Key" +msgstr "Publishable Key" + +#: classes/gateways/class.pmprogateway_stripe.php:269 +#: classes/gateways/class.pmprogateway_stripe.php:531 +#: classes/gateways/class.pmprogateway_stripe.php:543 +#: classes/gateways/class.pmprogateway_stripe.php:562 +#: classes/gateways/class.pmprogateway_stripe.php:568 +msgid "Your Publishable Key appears incorrect." +msgstr "Ihr veröffentlichbarer Schlüssel scheint falsch zu sein." + +#: classes/gateways/class.pmprogateway_stripe.php:277 +#: adminpages/paymentsettings.php:277 adminpages/paymentsettings.php:281 +#: adminpages/paymentsettings.php:286 +#: classes/gateways/class.pmprogateway_stripe.php:153 +#: classes/gateways/class.pmprogateway_stripe.php:154 +#: classes/gateways/class.pmprogateway_stripe.php:164 +#: classes/gateways/class.pmprogateway_stripe.php:186 +#: classes/gateways/class.pmprogateway_stripe.php:188 +#: classes/gateways/class.pmprogateway_stripe.php:189 +#: classes/gateways/class.pmprogateway_stripe.php:200 +#: classes/gateways/class.pmprogateway_stripe.php:202 +#: classes/gateways/class.pmprogateway_stripe.php:229 +#: classes/gateways/class.pmprogateway_stripe.php:261 +#: classes/gateways/class.pmprogateway_stripe.php:539 +#: classes/gateways/class.pmprogateway_stripe.php:551 +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:576 +msgid "Secret Key" +msgstr "Secret Key" + +#: classes/gateways/class.pmprogateway_stripe.php:285 +#: adminpages/paymentsettings.php:425 adminpages/paymentsettings.php:430 +#: adminpages/paymentsettings.php:432 +#: classes/gateways/class.pmprogateway_stripe.php:169 +#: classes/gateways/class.pmprogateway_stripe.php:170 +#: classes/gateways/class.pmprogateway_stripe.php:180 +#: classes/gateways/class.pmprogateway_stripe.php:202 +#: classes/gateways/class.pmprogateway_stripe.php:204 +#: classes/gateways/class.pmprogateway_stripe.php:205 +#: classes/gateways/class.pmprogateway_stripe.php:216 +#: classes/gateways/class.pmprogateway_stripe.php:218 +#: classes/gateways/class.pmprogateway_stripe.php:245 +#: classes/gateways/class.pmprogateway_stripe.php:277 +#: classes/gateways/class.pmprogateway_stripe.php:293 +#: classes/gateways/class.pmprogateway_stripe.php:294 +#: classes/gateways/class.pmprogateway_stripe.php:598 +#: classes/gateways/class.pmprogateway_stripe.php:610 +#: classes/gateways/class.pmprogateway_stripe.php:629 +#: classes/gateways/class.pmprogateway_stripe.php:635 +msgid "Show Billing Address Fields" +msgstr "Felder für Rechnungsadresse anzeigen" + +#: classes/gateways/class.pmprogateway_stripe.php:292 +#: adminpages/paymentsettings.php:437 adminpages/paymentsettings.php:439 +#: classes/gateways/class.pmprogateway_stripe.php:176 +#: classes/gateways/class.pmprogateway_stripe.php:177 +#: classes/gateways/class.pmprogateway_stripe.php:187 +#: classes/gateways/class.pmprogateway_stripe.php:209 +#: classes/gateways/class.pmprogateway_stripe.php:211 +#: classes/gateways/class.pmprogateway_stripe.php:212 +#: classes/gateways/class.pmprogateway_stripe.php:223 +#: classes/gateways/class.pmprogateway_stripe.php:225 +#: classes/gateways/class.pmprogateway_stripe.php:252 +#: classes/gateways/class.pmprogateway_stripe.php:284 +#: classes/gateways/class.pmprogateway_stripe.php:300 +#: classes/gateways/class.pmprogateway_stripe.php:301 +#: classes/gateways/class.pmprogateway_stripe.php:607 +#: classes/gateways/class.pmprogateway_stripe.php:619 +#: classes/gateways/class.pmprogateway_stripe.php:638 +#: classes/gateways/class.pmprogateway_stripe.php:644 +msgid "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page.
    If No, make sure you disable address verification in the Stripe dashboard settings." +msgstr "Stripe erfordert keine Adressangaben. Wählen Sie 'Nein' um die entsprechenden Felder auf den Checkout-Seiten zu verbergen.
    Wenn Sie Nein auswählen, stellen Sie sicher, dass Sie die Adresen-Verifizierung in den Stripe Dashboard Settings deaktivieren." + +#: classes/gateways/class.pmprogateway_stripe.php:300 +#: adminpages/paymentsettings.php:465 adminpages/paymentsettings.php:506 +#: adminpages/paymentsettings.php:512 adminpages/paymentsettings.php:514 +#: classes/gateways/class.pmprogateway_stripe.php:184 +#: classes/gateways/class.pmprogateway_stripe.php:185 +#: classes/gateways/class.pmprogateway_stripe.php:195 +#: classes/gateways/class.pmprogateway_stripe.php:217 +#: classes/gateways/class.pmprogateway_stripe.php:219 +#: classes/gateways/class.pmprogateway_stripe.php:220 +#: classes/gateways/class.pmprogateway_stripe.php:231 +#: classes/gateways/class.pmprogateway_stripe.php:233 +#: classes/gateways/class.pmprogateway_stripe.php:260 +#: classes/gateways/class.pmprogateway_stripe.php:292 +#: classes/gateways/class.pmprogateway_stripe.php:308 +#: classes/gateways/class.pmprogateway_stripe.php:309 +msgid "To fully integrate with Stripe, be sure to set your Web Hook URL to" +msgstr "Um Stripe vollständig zu integrieren, stellen Sie Ihre Web Hook URL auf " + +#: classes/gateways/class.pmprogateway_stripe.php:646 pages/checkout.php:492 +#: classes/gateways/class.pmprogateway_stripe.php:638 +#: classes/gateways/class.pmprogateway_stripe.php:654 +#: classes/gateways/class.pmprogateway_stripe.php:655 pages/checkout.php:424 +msgid "Security Code (CVC)" +msgstr "Kartenprüfnummer (CVC)" + +#: classes/gateways/class.pmprogateway_stripe.php:718 +#: classes/gateways/class.pmprogateway_stripe.php:703 +#: classes/gateways/class.pmprogateway_stripe.php:710 +#: classes/gateways/class.pmprogateway_stripe.php:726 +#: classes/gateways/class.pmprogateway_stripe.php:727 +#: classes/gateways/class.pmprogateway_stripe.php:1374 +#: classes/gateways/class.pmprogateway_stripe.php:1386 +#: classes/gateways/class.pmprogateway_stripe.php:1405 +#: classes/gateways/class.pmprogateway_stripe.php:1411 +#, php-format +msgid "%1$sNote:%2$s Subscription %3$s%4$s%5$s could not be found at Stripe. It may have been deleted." +msgstr "%1$sHinweis:%2$s Abonnement %3$s%4$s%5$s konnte bei Stripe nicht gefunden werden. Es wurde möglicherweise gelöscht." + +#: classes/gateways/class.pmprogateway_stripe.php:725 +#: classes/gateways/class.pmprogateway_stripe.php:567 +#: classes/gateways/class.pmprogateway_stripe.php:568 +#: classes/gateways/class.pmprogateway_stripe.php:578 +#: classes/gateways/class.pmprogateway_stripe.php:582 +#: classes/gateways/class.pmprogateway_stripe.php:608 +#: classes/gateways/class.pmprogateway_stripe.php:612 +#: classes/gateways/class.pmprogateway_stripe.php:613 +#: classes/gateways/class.pmprogateway_stripe.php:616 +#: classes/gateways/class.pmprogateway_stripe.php:634 +#: classes/gateways/class.pmprogateway_stripe.php:645 +#: classes/gateways/class.pmprogateway_stripe.php:683 +#: classes/gateways/class.pmprogateway_stripe.php:710 +#: classes/gateways/class.pmprogateway_stripe.php:717 +#: classes/gateways/class.pmprogateway_stripe.php:733 +#: classes/gateways/class.pmprogateway_stripe.php:734 +#: classes/gateways/class.pmprogateway_stripe.php:1379 +#: classes/gateways/class.pmprogateway_stripe.php:1391 +#: classes/gateways/class.pmprogateway_stripe.php:1410 +#: classes/gateways/class.pmprogateway_stripe.php:1416 +msgid "Subscription Updates" +msgstr "Abonnement-Updates" + +#: classes/gateways/class.pmprogateway_stripe.php:729 +#: classes/gateways/class.pmprogateway_stripe.php:571 +#: classes/gateways/class.pmprogateway_stripe.php:572 +#: classes/gateways/class.pmprogateway_stripe.php:582 +#: classes/gateways/class.pmprogateway_stripe.php:586 +#: classes/gateways/class.pmprogateway_stripe.php:612 +#: classes/gateways/class.pmprogateway_stripe.php:616 +#: classes/gateways/class.pmprogateway_stripe.php:617 +#: classes/gateways/class.pmprogateway_stripe.php:620 +#: classes/gateways/class.pmprogateway_stripe.php:638 +#: classes/gateways/class.pmprogateway_stripe.php:649 +#: classes/gateways/class.pmprogateway_stripe.php:687 +#: classes/gateways/class.pmprogateway_stripe.php:714 +#: classes/gateways/class.pmprogateway_stripe.php:721 +#: classes/gateways/class.pmprogateway_stripe.php:737 +#: classes/gateways/class.pmprogateway_stripe.php:738 +#: classes/gateways/class.pmprogateway_stripe.php:1383 +#: classes/gateways/class.pmprogateway_stripe.php:1395 +#: classes/gateways/class.pmprogateway_stripe.php:1414 +#: classes/gateways/class.pmprogateway_stripe.php:1420 +msgid "Subscription updates, allow you to change the member's subscription values at predefined times. Be sure to click Update Profile after making changes." +msgstr "Mit Abonnement-Updates können Sie die Abonnementwerte des Mitglieds zu vordefinierten Zeiten ändern. Achten Sie darauf, nach dem Vornehmen von Änderungen auf Profil aktualisieren zu klicken." + +#: classes/gateways/class.pmprogateway_stripe.php:731 +#: classes/gateways/class.pmprogateway_stripe.php:573 +#: classes/gateways/class.pmprogateway_stripe.php:574 +#: classes/gateways/class.pmprogateway_stripe.php:584 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:614 +#: classes/gateways/class.pmprogateway_stripe.php:618 +#: classes/gateways/class.pmprogateway_stripe.php:619 +#: classes/gateways/class.pmprogateway_stripe.php:622 +#: classes/gateways/class.pmprogateway_stripe.php:640 +#: classes/gateways/class.pmprogateway_stripe.php:651 +#: classes/gateways/class.pmprogateway_stripe.php:689 +#: classes/gateways/class.pmprogateway_stripe.php:716 +#: classes/gateways/class.pmprogateway_stripe.php:723 +#: classes/gateways/class.pmprogateway_stripe.php:739 +#: classes/gateways/class.pmprogateway_stripe.php:740 +#: classes/gateways/class.pmprogateway_stripe.php:1385 +#: classes/gateways/class.pmprogateway_stripe.php:1397 +#: classes/gateways/class.pmprogateway_stripe.php:1416 +#: classes/gateways/class.pmprogateway_stripe.php:1422 +msgid "Subscription updates, allow you to change the member's subscription values at predefined times. Be sure to click Update User after making changes." +msgstr "Mit Abonnement-Updates können Sie die Abonnementwerte des Mitglieds zu vordefinierten Zeiten ändern. Vergewissern Sie sich, dass Sie nach der Durchführung von Änderungen auf Benutzer aktualisieren klicken." + +#: classes/gateways/class.pmprogateway_stripe.php:736 pages/billing.php:362 +#: classes/gateways/class.pmprogateway_stripe.php:578 +#: classes/gateways/class.pmprogateway_stripe.php:579 +#: classes/gateways/class.pmprogateway_stripe.php:589 +#: classes/gateways/class.pmprogateway_stripe.php:593 +#: classes/gateways/class.pmprogateway_stripe.php:619 +#: classes/gateways/class.pmprogateway_stripe.php:623 +#: classes/gateways/class.pmprogateway_stripe.php:624 +#: classes/gateways/class.pmprogateway_stripe.php:627 +#: classes/gateways/class.pmprogateway_stripe.php:645 +#: classes/gateways/class.pmprogateway_stripe.php:656 +#: classes/gateways/class.pmprogateway_stripe.php:694 +#: classes/gateways/class.pmprogateway_stripe.php:721 +#: classes/gateways/class.pmprogateway_stripe.php:728 +#: classes/gateways/class.pmprogateway_stripe.php:744 +#: classes/gateways/class.pmprogateway_stripe.php:745 pages/billing.php:294 +#: pages/billing.php:298 pages/billing.php:329 pages/billing.php:338 +#: pages/billing.php:341 pages/billing.php:343 pages/billing.php:347 +#: pages/billing.php:363 pages/billing.php:364 pages/billing.php:370 +#: pages/billing.php:391 pages/billing.php:396 pages/billing.php:400 +#: pages/billing.php:405 classes/gateways/class.pmprogateway_stripe.php:1391 +#: pages/billing.php:425 classes/gateways/class.pmprogateway_stripe.php:1403 +#: classes/gateways/class.pmprogateway_stripe.php:1422 +#: classes/gateways/class.pmprogateway_stripe.php:1428 +msgid "Update" +msgstr "Aktualisieren" + +#: classes/gateways/class.pmprogateway_stripe.php:1127 +#: classes/gateways/class.pmprogateway_stripe.php:1119 +#: classes/gateways/class.pmprogateway_stripe.php:1135 +#: classes/gateways/class.pmprogateway_stripe.php:1136 +#: classes/gateways/class.pmprogateway_stripe.php:1172 +msgid "Payment error: Please contact the webmaster (stripe-load-error)" +msgstr "Zahlungsfehler: Bitte kontaktieren Sie den Webmaster (stripe-load-error)" + +#: classes/gateways/class.pmprogateway_stripe.php:1365 +#: classes/gateways/class.pmprogateway_stripe.php:190 +#: classes/gateways/class.pmprogateway_stripe.php:192 +#: classes/gateways/class.pmprogateway_stripe.php:199 +#: classes/gateways/class.pmprogateway_stripe.php:201 +#: classes/gateways/class.pmprogateway_stripe.php:1187 +#: classes/gateways/class.pmprogateway_stripe.php:1188 +#: classes/gateways/class.pmprogateway_stripe.php:1202 +#: classes/gateways/class.pmprogateway_stripe.php:1203 +#: classes/gateways/class.pmprogateway_stripe.php:1204 +#: classes/gateways/class.pmprogateway_stripe.php:1214 +#: classes/gateways/class.pmprogateway_stripe.php:1218 +#: classes/gateways/class.pmprogateway_stripe.php:1246 +#: classes/gateways/class.pmprogateway_stripe.php:1256 +#: classes/gateways/class.pmprogateway_stripe.php:1260 +#: classes/gateways/class.pmprogateway_stripe.php:1300 +#: classes/gateways/class.pmprogateway_stripe.php:1303 +#: classes/gateways/class.pmprogateway_stripe.php:1325 +#: classes/gateways/class.pmprogateway_stripe.php:1326 +#: classes/gateways/class.pmprogateway_stripe.php:1336 +#: classes/gateways/class.pmprogateway_stripe.php:1357 +#: classes/gateways/class.pmprogateway_stripe.php:1373 +#: classes/gateways/class.pmprogateway_stripe.php:1374 +#: classes/gateways/class.pmprogateway_stripe.php:1410 +#: classes/gateways/class.pmprogateway_stripe.php:2096 +#: classes/gateways/class.pmprogateway_stripe.php:2101 +#: classes/gateways/class.pmprogateway_stripe.php:2106 +#: classes/gateways/class.pmprogateway_stripe.php:2108 +#: classes/gateways/class.pmprogateway_stripe.php:2113 +#: classes/gateways/class.pmprogateway_stripe.php:2118 +#: classes/gateways/class.pmprogateway_stripe.php:2127 +#: classes/gateways/class.pmprogateway_stripe.php:2132 +#: classes/gateways/class.pmprogateway_stripe.php:2137 +#: classes/gateways/class.pmprogateway_stripe.php:2133 +#: classes/gateways/class.pmprogateway_stripe.php:2138 +#: classes/gateways/class.pmprogateway_stripe.php:2143 +msgid "Error creating customer record with Stripe:" +msgstr "Stripe meldet einen Fehler bei der Erstellung des Kunden-Satzes:" + +#: classes/gateways/class.pmprogateway_stripe.php:1424 +#: classes/gateways/class.pmprogateway_stripe.php:1275 +#: classes/gateways/class.pmprogateway_stripe.php:1303 +#: classes/gateways/class.pmprogateway_stripe.php:1313 +#: classes/gateways/class.pmprogateway_stripe.php:1317 +#: classes/gateways/class.pmprogateway_stripe.php:1357 +#: classes/gateways/class.pmprogateway_stripe.php:1360 +#: classes/gateways/class.pmprogateway_stripe.php:1384 +#: classes/gateways/class.pmprogateway_stripe.php:1385 +#: classes/gateways/class.pmprogateway_stripe.php:1395 +#: classes/gateways/class.pmprogateway_stripe.php:1416 +#: classes/gateways/class.pmprogateway_stripe.php:1432 +#: classes/gateways/class.pmprogateway_stripe.php:1433 +#: classes/gateways/class.pmprogateway_stripe.php:1469 +#: classes/gateways/class.pmprogateway_stripe.php:2165 +#: classes/gateways/class.pmprogateway_stripe.php:2170 +#: classes/gateways/class.pmprogateway_stripe.php:2177 +#: classes/gateways/class.pmprogateway_stripe.php:2182 +#: classes/gateways/class.pmprogateway_stripe.php:2196 +#: classes/gateways/class.pmprogateway_stripe.php:2201 +#: classes/gateways/class.pmprogateway_stripe.php:2202 +#: classes/gateways/class.pmprogateway_stripe.php:2207 +msgid "Error getting subscription with Stripe:" +msgstr "Fehler beim Anlegen des Abonnements in Stripe:" + +#: classes/gateways/class.pmprogateway_stripe.php:1580 +#: classes/gateways/class.pmprogateway_stripe.php:278 +#: classes/gateways/class.pmprogateway_stripe.php:279 +#: classes/gateways/class.pmprogateway_stripe.php:286 +#: classes/gateways/class.pmprogateway_stripe.php:302 +#: classes/gateways/class.pmprogateway_stripe.php:308 +#: classes/gateways/class.pmprogateway_stripe.php:311 +#: classes/gateways/class.pmprogateway_stripe.php:1244 +#: classes/gateways/class.pmprogateway_stripe.php:1245 +#: classes/gateways/class.pmprogateway_stripe.php:1259 +#: classes/gateways/class.pmprogateway_stripe.php:1260 +#: classes/gateways/class.pmprogateway_stripe.php:1261 +#: classes/gateways/class.pmprogateway_stripe.php:1271 +#: classes/gateways/class.pmprogateway_stripe.php:1390 +#: classes/gateways/class.pmprogateway_stripe.php:1391 +#: classes/gateways/class.pmprogateway_stripe.php:1409 +#: classes/gateways/class.pmprogateway_stripe.php:1410 +#: classes/gateways/class.pmprogateway_stripe.php:1411 +#: classes/gateways/class.pmprogateway_stripe.php:1421 +#: classes/gateways/class.pmprogateway_stripe.php:1425 +#: classes/gateways/class.pmprogateway_stripe.php:1453 +#: classes/gateways/class.pmprogateway_stripe.php:1463 +#: classes/gateways/class.pmprogateway_stripe.php:1467 +#: classes/gateways/class.pmprogateway_stripe.php:1507 +#: classes/gateways/class.pmprogateway_stripe.php:1510 +#: classes/gateways/class.pmprogateway_stripe.php:1540 +#: classes/gateways/class.pmprogateway_stripe.php:1541 +#: classes/gateways/class.pmprogateway_stripe.php:1551 +#: classes/gateways/class.pmprogateway_stripe.php:1572 +#: classes/gateways/class.pmprogateway_stripe.php:1588 +#: classes/gateways/class.pmprogateway_stripe.php:1589 +#: classes/gateways/class.pmprogateway_stripe.php:1625 +#: classes/gateways/class.pmprogateway_stripe.php:2339 +#: classes/gateways/class.pmprogateway_stripe.php:2344 +#: classes/gateways/class.pmprogateway_stripe.php:2351 +#: classes/gateways/class.pmprogateway_stripe.php:2356 +#: classes/gateways/class.pmprogateway_stripe.php:2373 +#: classes/gateways/class.pmprogateway_stripe.php:2378 +#: classes/gateways/class.pmprogateway_stripe.php:2379 +#: classes/gateways/class.pmprogateway_stripe.php:2384 +msgid "Error creating plan with Stripe:" +msgstr "Fehler beim Erstellen eines Tarifs mit Stripe:" + +#: classes/gateways/class.pmprogateway_stripe.php:1611 +#: classes/gateways/class.pmprogateway_stripe.php:294 +#: classes/gateways/class.pmprogateway_stripe.php:295 +#: classes/gateways/class.pmprogateway_stripe.php:302 +#: classes/gateways/class.pmprogateway_stripe.php:318 +#: classes/gateways/class.pmprogateway_stripe.php:324 +#: classes/gateways/class.pmprogateway_stripe.php:330 +#: classes/gateways/class.pmprogateway_stripe.php:1420 +#: classes/gateways/class.pmprogateway_stripe.php:1421 +#: classes/gateways/class.pmprogateway_stripe.php:1422 +#: classes/gateways/class.pmprogateway_stripe.php:1440 +#: classes/gateways/class.pmprogateway_stripe.php:1441 +#: classes/gateways/class.pmprogateway_stripe.php:1442 +#: classes/gateways/class.pmprogateway_stripe.php:1452 +#: classes/gateways/class.pmprogateway_stripe.php:1456 +#: classes/gateways/class.pmprogateway_stripe.php:1484 +#: classes/gateways/class.pmprogateway_stripe.php:1494 +#: classes/gateways/class.pmprogateway_stripe.php:1498 +#: classes/gateways/class.pmprogateway_stripe.php:1538 +#: classes/gateways/class.pmprogateway_stripe.php:1541 +#: classes/gateways/class.pmprogateway_stripe.php:1571 +#: classes/gateways/class.pmprogateway_stripe.php:1572 +#: classes/gateways/class.pmprogateway_stripe.php:1582 +#: classes/gateways/class.pmprogateway_stripe.php:1603 +#: classes/gateways/class.pmprogateway_stripe.php:1619 +#: classes/gateways/class.pmprogateway_stripe.php:1620 +#: classes/gateways/class.pmprogateway_stripe.php:1656 +#: classes/gateways/class.pmprogateway_stripe.php:2375 +#: classes/gateways/class.pmprogateway_stripe.php:2389 +#: classes/gateways/class.pmprogateway_stripe.php:2387 +#: classes/gateways/class.pmprogateway_stripe.php:2401 +#: classes/gateways/class.pmprogateway_stripe.php:2409 +#: classes/gateways/class.pmprogateway_stripe.php:2423 +#: classes/gateways/class.pmprogateway_stripe.php:2415 +#: classes/gateways/class.pmprogateway_stripe.php:2429 +msgid "Error subscribing customer to plan with Stripe:" +msgstr "Stripe meldet einen Fehler beim Einrichten des Abos für den Kunden:" + +#: classes/gateways/class.pmprogateway_stripe.php:1706 +#: classes/gateways/class.pmprogateway_stripe.php:769 +#: classes/gateways/class.pmprogateway_stripe.php:770 +#: classes/gateways/class.pmprogateway_stripe.php:780 +#: classes/gateways/class.pmprogateway_stripe.php:784 +#: classes/gateways/class.pmprogateway_stripe.php:812 +#: classes/gateways/class.pmprogateway_stripe.php:816 +#: classes/gateways/class.pmprogateway_stripe.php:817 +#: classes/gateways/class.pmprogateway_stripe.php:820 +#: classes/gateways/class.pmprogateway_stripe.php:838 +#: classes/gateways/class.pmprogateway_stripe.php:849 +#: classes/gateways/class.pmprogateway_stripe.php:887 +#: classes/gateways/class.pmprogateway_stripe.php:914 +#: classes/gateways/class.pmprogateway_stripe.php:1698 +#: classes/gateways/class.pmprogateway_stripe.php:1714 +#: classes/gateways/class.pmprogateway_stripe.php:1715 +#: classes/gateways/class.pmprogateway_stripe.php:2480 +#: classes/gateways/class.pmprogateway_stripe.php:2492 +#: classes/gateways/class.pmprogateway_stripe.php:2514 +#: classes/gateways/class.pmprogateway_stripe.php:2520 +msgid "Could not cancel the old subscription. Updates have not been processed." +msgstr "Die alte Mitgliedschaft konnte nicht gekündigt werden. Aktualisierungen wurden nicht durchgeführt." + +#: classes/gateways/class.pmprogateway_stripe.php:1809 +#: classes/gateways/class.pmprogateway_stripe.php:383 +#: classes/gateways/class.pmprogateway_stripe.php:389 +#: classes/gateways/class.pmprogateway_stripe.php:410 +#: classes/gateways/class.pmprogateway_stripe.php:1516 +#: classes/gateways/class.pmprogateway_stripe.php:1517 +#: classes/gateways/class.pmprogateway_stripe.php:1518 +#: classes/gateways/class.pmprogateway_stripe.php:1536 +#: classes/gateways/class.pmprogateway_stripe.php:1537 +#: classes/gateways/class.pmprogateway_stripe.php:1538 +#: classes/gateways/class.pmprogateway_stripe.php:1548 +#: classes/gateways/class.pmprogateway_stripe.php:1552 +#: classes/gateways/class.pmprogateway_stripe.php:1580 +#: classes/gateways/class.pmprogateway_stripe.php:1590 +#: classes/gateways/class.pmprogateway_stripe.php:1594 +#: classes/gateways/class.pmprogateway_stripe.php:1634 +#: classes/gateways/class.pmprogateway_stripe.php:1637 +#: classes/gateways/class.pmprogateway_stripe.php:1667 +#: classes/gateways/class.pmprogateway_stripe.php:1668 +#: classes/gateways/class.pmprogateway_stripe.php:1678 +#: classes/gateways/class.pmprogateway_stripe.php:1716 +#: classes/gateways/class.pmprogateway_stripe.php:1752 +#: classes/gateways/class.pmprogateway_stripe.php:1801 +#: classes/gateways/class.pmprogateway_stripe.php:1817 +#: classes/gateways/class.pmprogateway_stripe.php:1818 +#: classes/gateways/class.pmprogateway_stripe.php:2632 +#: classes/gateways/class.pmprogateway_stripe.php:2644 +#: classes/gateways/class.pmprogateway_stripe.php:2666 +#: classes/gateways/class.pmprogateway_stripe.php:2672 +msgid "Could not cancel old subscription." +msgstr "Das alte Abonnement konnte nicht storniert werden." + +#: classes/gateways/class.pmprogateway_stripe.php:1826 +#: classes/gateways/class.pmprogateway_stripe.php:1533 +#: classes/gateways/class.pmprogateway_stripe.php:1534 +#: classes/gateways/class.pmprogateway_stripe.php:1535 +#: classes/gateways/class.pmprogateway_stripe.php:1553 +#: classes/gateways/class.pmprogateway_stripe.php:1554 +#: classes/gateways/class.pmprogateway_stripe.php:1555 +#: classes/gateways/class.pmprogateway_stripe.php:1565 +#: classes/gateways/class.pmprogateway_stripe.php:1569 +#: classes/gateways/class.pmprogateway_stripe.php:1597 +#: classes/gateways/class.pmprogateway_stripe.php:1607 +#: classes/gateways/class.pmprogateway_stripe.php:1611 +#: classes/gateways/class.pmprogateway_stripe.php:1651 +#: classes/gateways/class.pmprogateway_stripe.php:1654 +#: classes/gateways/class.pmprogateway_stripe.php:1684 +#: classes/gateways/class.pmprogateway_stripe.php:1685 +#: classes/gateways/class.pmprogateway_stripe.php:1695 +#: classes/gateways/class.pmprogateway_stripe.php:1733 +#: classes/gateways/class.pmprogateway_stripe.php:1769 +#: classes/gateways/class.pmprogateway_stripe.php:1818 +#: classes/gateways/class.pmprogateway_stripe.php:1834 +#: classes/gateways/class.pmprogateway_stripe.php:1835 +#: classes/gateways/class.pmprogateway_stripe.php:2648 +#: classes/gateways/class.pmprogateway_stripe.php:2660 +#: classes/gateways/class.pmprogateway_stripe.php:2682 +#: classes/gateways/class.pmprogateway_stripe.php:2688 +msgid "Could not find the customer." +msgstr "Konnte den Kunden nicht finden." + +#: classes/gateways/class.pmprogateway_stripe.php:1986 +#: classes/gateways/class.pmprogateway_stripe.php:1836 +#: classes/gateways/class.pmprogateway_stripe.php:1837 +#: classes/gateways/class.pmprogateway_stripe.php:1847 +#: classes/gateways/class.pmprogateway_stripe.php:1885 +#: classes/gateways/class.pmprogateway_stripe.php:1921 +#: classes/gateways/class.pmprogateway_stripe.php:1978 +#: classes/gateways/class.pmprogateway_stripe.php:1994 +#: classes/gateways/class.pmprogateway_stripe.php:1995 +#: classes/gateways/class.pmprogateway_stripe.php:2816 +#: classes/gateways/class.pmprogateway_stripe.php:2822 +#: classes/gateways/class.pmprogateway_stripe.php:2828 +#: classes/gateways/class.pmprogateway_stripe.php:2834 +#: classes/gateways/class.pmprogateway_stripe.php:2850 +#: classes/gateways/class.pmprogateway_stripe.php:2856 +#: classes/gateways/class.pmprogateway_stripe.php:2862 +msgid "Error: " +msgstr "Fehler:" + +#: classes/gateways/class.pmprogateway_stripe.php:1999 +#: classes/gateways/class.pmprogateway_stripe.php:1849 +#: classes/gateways/class.pmprogateway_stripe.php:1850 +#: classes/gateways/class.pmprogateway_stripe.php:1860 +#: classes/gateways/class.pmprogateway_stripe.php:1898 +#: classes/gateways/class.pmprogateway_stripe.php:1934 +#: classes/gateways/class.pmprogateway_stripe.php:1991 +#: classes/gateways/class.pmprogateway_stripe.php:2007 +#: classes/gateways/class.pmprogateway_stripe.php:2008 +#: classes/gateways/class.pmprogateway_stripe.php:2836 +#: classes/gateways/class.pmprogateway_stripe.php:2848 +#: classes/gateways/class.pmprogateway_stripe.php:2870 +#: classes/gateways/class.pmprogateway_stripe.php:2876 +#, php-format +msgid "Error: Unkown error while refunding charge #%s" +msgstr "Fehler: Unbekannter Fehler bei der Erstattung der Zahlung Nummer%s" + +#: classes/gateways/class.pmprogateway_twocheckout.php:59 +#: paid-memberships-pro.php:138 +#: classes/gateways/class.pmprogateway_twocheckout.php:53 +#: classes/gateways/class.pmprogateway_twocheckout.php:60 +#: paid-memberships-pro.php:124 paid-memberships-pro.php:125 +#: paid-memberships-pro.php:132 paid-memberships-pro.php:133 +#: paid-memberships-pro.php:134 paid-memberships-pro.php:135 +#: paid-memberships-pro.php:136 paid-memberships-pro.php:137 +#: paid-memberships-pro.php:144 +msgid "2Checkout" +msgstr "2Checkout" + +#: classes/gateways/class.pmprogateway_twocheckout.php:114 +#: classes/gateways/class.pmprogateway_twocheckout.php:108 +#: classes/gateways/class.pmprogateway_twocheckout.php:116 +#: classes/gateways/class.pmprogateway_twocheckout.php:115 +msgid "2Checkout Settings" +msgstr "2Checkout Einstellungen" + +#: classes/gateways/class.pmprogateway_twocheckout.php:123 +#: classes/gateways/class.pmprogateway_twocheckout.php:125 +msgid "Go to Account » User Management in 2Checkout and create a user with API Access and API Updating." +msgstr "Gehen Sie zu Konto » Benutzerverwaltung in 2Checkout und erstellen Sie einen Benutzer mit API-Zugang und API-Aktualisierung." + +#: classes/gateways/class.pmprogateway_twocheckout.php:132 +#: classes/gateways/class.pmprogateway_twocheckout.php:134 +#: classes/gateways/class.pmprogateway_twocheckout.php:133 +msgid "Password for the API user created." +msgstr "Passwort für den erstellten API-Benutzer." + +#: classes/gateways/class.pmprogateway_twocheckout.php:141 +#: classes/gateways/class.pmprogateway_twocheckout.php:152 +#: classes/gateways/class.pmprogateway_twocheckout.php:142 +msgid "Click on the profile icon in 2Checkout to find your Account Number." +msgstr "Klicken Sie auf das Profilsymbol in 2Checkout, um Ihre Kontonummer zu finden." + +#: classes/gateways/class.pmprogateway_twocheckout.php:146 +#: adminpages/paymentsettings.php:355 adminpages/paymentsettings.php:360 +#: classes/gateways/class.pmprogateway_twocheckout.php:137 +#: classes/gateways/class.pmprogateway_twocheckout.php:157 +#: classes/gateways/class.pmprogateway_twocheckout.php:147 +msgid "Secret Word" +msgstr "Geheimwort" + +#: classes/gateways/class.pmprogateway_twocheckout.php:150 +#: classes/gateways/class.pmprogateway_twocheckout.php:161 +#: classes/gateways/class.pmprogateway_twocheckout.php:151 +msgid "Go to Account » Site Management. Look under Checkout Options to find the Secret Word." +msgstr "Gehen Sie zu Konto » Site Management. Suchen Sie unter Checkout-Optionen nach dem Geheimwort." + +#: classes/gateways/class.pmprogateway_twocheckout.php:155 +#: adminpages/paymentsettings.php:487 adminpages/paymentsettings.php:493 +#: adminpages/paymentsettings.php:495 +#: classes/gateways/class.pmprogateway_twocheckout.php:145 +#: classes/gateways/class.pmprogateway_twocheckout.php:166 +#: classes/gateways/class.pmprogateway_twocheckout.php:156 +msgid "TwoCheckout INS URL" +msgstr "TwoCheckout INS URL" + +#: classes/gateways/class.pmprogateway_twocheckout.php:158 +#: classes/gateways/class.pmprogateway_twocheckout.php:169 +#: classes/gateways/class.pmprogateway_twocheckout.php:159 +msgid "To fully integrate with 2Checkout, be sure to use the following for your INS URL and Approved URL" +msgstr "Um eine vollständige Integration mit 2Checkout zu erreichen, müssen Sie für Ihre INS-URL und Ihre genehmigte URL Folgendes verwenden" + +#: classes/gateways/class.pmprogateway_twocheckout.php:203 +#: classes/gateways/class.pmprogateway_twocheckout.php:192 +#: classes/gateways/class.pmprogateway_twocheckout.php:214 +#: classes/gateways/class.pmprogateway_twocheckout.php:205 +msgid "Check Out with 2Checkout" +msgstr "Mit 2Checkout bezahlen" + +#: includes/addons.php:225 includes/addons.php:222 includes/addons.php:241 +msgid "Important: This plugin requires a valid PMPro Plus license key to update." +msgstr "Wichtig: Für die Aktualisierung dieses Plugins ist ein gültiger PMPro Plus-Lizenzschlüssel erforderlich." + +#: includes/addons.php:278 includes/addons.php:274 includes/addons.php:294 +msgid "You must have a valid PMPro Plus License Key to update PMPro Plus add ons. The following plugins will not be updated:" +msgstr "Sie müssen einen gültigen PMPro Plus-Lizenzschlüssel haben, um PMPro Plus-Add-Ons zu aktualisieren. Die folgenden Plugins werden nicht aktualisiert:" + +#: includes/addons.php:296 includes/addons.php:292 +msgid "Update Plugin" +msgstr "Plugin aktualisieren" + +#: includes/addons.php:298 includes/addons.php:294 includes/addons.php:314 +msgid "You must have a valid PMPro Plus License Key to update PMPro Plus add ons." +msgstr "Sie müssen einen gültigen PMPro Plus-Lizenzschlüssel haben, um PMPro Plus-Add-Ons zu aktualisieren." + +#: includes/addons.php:301 includes/addons.php:297 includes/addons.php:317 +msgid "Return to the PMPro Add Ons page" +msgstr "Zurück zur PMPro Add Ons Seite" + +#: includes/addons.php:320 includes/addons.php:316 includes/addons.php:336 +msgid "You must enter a valid PMPro Plus License Key under Settings > PMPro License to update this add on." +msgstr "Sie müssen einen gültigen PMPro Plus-Lizenzschlüssel unter Einstellungen > PMPro-Lizenz eingeben, um dieses Add-on zu aktualisieren." + +#: includes/adminpages.php:48 includes/adminpages.php:9 +#: includes/adminpages.php:39 includes/adminpages.php:47 +#: includes/adminpages.php:93 includes/adminpages.php:100 +msgid "Memberships" +msgstr "Mitgliedschaften" + +#: includes/adminpages.php:49 includes/adminpages.php:123 +#: includes/adminpages.php:10 includes/adminpages.php:48 +#: includes/adminpages.php:107 includes/adminpages.php:114 +#: includes/adminpages.php:118 adminpages/admin_header.php:261 +#: adminpages/pagesettings.php:149 includes/adminpages.php:69 +msgid "Page Settings" +msgstr "Seiten Einstellungen" + +#: includes/adminpages.php:50 includes/adminpages.php:130 +#: includes/adminpages.php:11 includes/adminpages.php:49 +#: includes/adminpages.php:54 includes/adminpages.php:114 +#: includes/adminpages.php:121 includes/adminpages.php:125 +#: includes/adminpages.php:70 +msgid "Payment Settings" +msgstr "Zahlungs-Einstellungen" + +#: includes/adminpages.php:55 includes/adminpages.php:165 +#: includes/adminpages.php:16 includes/adminpages.php:54 +#: includes/adminpages.php:79 includes/adminpages.php:149 +#: includes/adminpages.php:156 includes/adminpages.php:160 +#: adminpages/admin_header.php:234 includes/adminpages.php:182 +msgid "Reports" +msgstr "Berichte" + +#: includes/adminpages.php:57 includes/adminpages.php:179 +#: includes/adminpages.php:18 includes/adminpages.php:56 +#: includes/adminpages.php:89 includes/adminpages.php:163 +#: includes/adminpages.php:170 includes/adminpages.php:174 +#: adminpages/admin_header.php:257 includes/adminpages.php:68 +msgid "Discount Codes" +msgstr "Gutscheincodes" + +#: includes/adminpages.php:61 includes/adminpages.php:79 +msgid "Updates Required" +msgstr "Aktualisierung benötigt" + +#: includes/adminpages.php:109 includes/adminpages.php:100 +#: includes/adminpages.php:104 includes/adminpages.php:135 +msgid "Memberships" +msgstr "Mitgliedschaften" + +#: includes/adminpages.php:274 includes/adminpages.php:261 +#: includes/adminpages.php:265 includes/adminpages.php:414 +msgid "Docs" +msgstr "Dokumentationen" + +#: includes/adminpages.php:274 includes/adminpages.php:261 +#: includes/adminpages.php:265 includes/adminpages.php:414 +msgid "View PMPro Documentation" +msgstr "PMPro-Dokumentation anzeigen" + +#: includes/adminpages.php:275 includes/adminpages.php:262 +#: includes/adminpages.php:266 includes/adminpages.php:415 +msgid "Support" +msgstr "Support" + +#: includes/adminpages.php:275 includes/adminpages.php:262 +#: includes/adminpages.php:266 includes/adminpages.php:415 +msgid "Visit Customer Support Forum" +msgstr "Support Forum besuchen" + +#: includes/countries.php:7 +msgid "Andorra" +msgstr "Andorra" + +#: includes/countries.php:8 +msgid "United Arab Emirates" +msgstr "Vereinigte Arabische Emirate" + +#: includes/countries.php:9 +msgid "Afghanistan" +msgstr "Afghanistan" + +#: includes/countries.php:10 +msgid "Antigua and Barbuda" +msgstr "Antigua und Barbuda" + +#: includes/countries.php:11 +msgid "Anguilla" +msgstr "Anguilla" + +#: includes/countries.php:12 +msgid "Albania" +msgstr "Albanien" + +#: includes/countries.php:13 +msgid "Armenia" +msgstr "Armenien" + +#: includes/countries.php:14 +msgid "Netherlands Antilles" +msgstr "Niederländische Antillen" + +#: includes/countries.php:15 +msgid "Angola" +msgstr "Angola" + +#: includes/countries.php:16 +msgid "Antarctica" +msgstr "Antarktis" + +#: includes/countries.php:17 +msgid "Argentina" +msgstr "Argentinien" + +#: includes/countries.php:18 +msgid "American Samoa" +msgstr "Amerikanisch Samoa" + +#: includes/countries.php:19 +msgid "Austria" +msgstr "Österreich" + +#: includes/countries.php:20 +msgid "Australia" +msgstr "Australien" + +#: includes/countries.php:21 +msgid "Aruba" +msgstr "Aruba" + +#: includes/countries.php:22 +msgid "Aland Islands" +msgstr "Åland Inseln" + +#: includes/countries.php:23 +msgid "Azerbaijan" +msgstr "Aserbaidschan" + +#: includes/countries.php:24 +msgid "Bosnia and Herzegovina" +msgstr "Bosnien und Herzegowina" + +#: includes/countries.php:25 +msgid "Barbados" +msgstr "Barbados" + +#: includes/countries.php:26 +msgid "Bangladesh" +msgstr "Bangladesch" + +#: includes/countries.php:27 +msgid "Belgium" +msgstr "Belgien" + +#: includes/countries.php:28 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#: includes/countries.php:29 +msgid "Bulgaria" +msgstr "Bulgarien" + +#: includes/countries.php:30 +msgid "Bahrain" +msgstr "Bahrain" + +#: includes/countries.php:31 +msgid "Burundi" +msgstr "Burundi" + +#: includes/countries.php:32 +msgid "Benin" +msgstr "Benin" + +#: includes/countries.php:33 +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + +#: includes/countries.php:34 +msgid "Bermuda" +msgstr "Bermuda" + +#: includes/countries.php:35 +msgid "Brunei" +msgstr "Brunei" + +#: includes/countries.php:36 +msgid "Bolivia" +msgstr "Bolivien" + +#: includes/countries.php:37 +msgid "Brazil" +msgstr "Brasilien" + +#: includes/countries.php:38 +msgid "Bahamas" +msgstr "Bahamas" + +#: includes/countries.php:39 +msgid "Bhutan" +msgstr "Bhutan" + +#: includes/countries.php:40 +msgid "Bouvet Island" +msgstr "Bouvetinsel" + +#: includes/countries.php:41 +msgid "Botswana" +msgstr "Botswana" + +#: includes/countries.php:42 +msgid "Belarus" +msgstr "Belarus" + +#: includes/countries.php:43 +msgid "Belize" +msgstr "Belize" + +#: includes/countries.php:44 +msgid "Canada" +msgstr "Kanada" + +#: includes/countries.php:45 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosinseln" + +#: includes/countries.php:46 +msgid "Congo (Kinshasa)" +msgstr "Kongo (Kinshasa)" + +#: includes/countries.php:47 +msgid "Central African Republic" +msgstr "Zentralafrikanische Republik" + +#: includes/countries.php:48 +msgid "Congo (Brazzaville)" +msgstr "Kongo (Brazzaville)" + +#: includes/countries.php:49 +msgid "Switzerland" +msgstr "Schweiz" + +#: includes/countries.php:50 +msgid "Ivory Coast" +msgstr "Elfenbeinküste" + +#: includes/countries.php:51 +msgid "Cook Islands" +msgstr "Cook-Inseln" + +#: includes/countries.php:52 +msgid "Chile" +msgstr "Chile" + +#: includes/countries.php:53 +msgid "Cameroon" +msgstr "Kamerun" + +#: includes/countries.php:54 +msgid "China" +msgstr "China" + +#: includes/countries.php:55 +msgid "Colombia" +msgstr "Kolumbien" + +#: includes/countries.php:56 +msgid "Costa Rica" +msgstr "Costa Rica" + +#: includes/countries.php:57 +msgid "Cuba" +msgstr "Kuba" + +#: includes/countries.php:58 +msgid "Cape Verde" +msgstr "Kapverdische Inseln" + +#: includes/countries.php:59 +msgid "Christmas Island" +msgstr "Weihnachtsinsel" + +#: includes/countries.php:60 +msgid "Cyprus" +msgstr "Zypern" + +#: includes/countries.php:61 +msgid "Czech Republic" +msgstr "Tschechische Republik" + +#: includes/countries.php:62 +msgid "Germany" +msgstr "Deutschland" + +#: includes/countries.php:63 +msgid "Djibouti" +msgstr "Dschibuti" + +#: includes/countries.php:64 +msgid "Denmark" +msgstr "Dänemark" + +#: includes/countries.php:65 +msgid "Dominica" +msgstr "Dominica" + +#: includes/countries.php:66 +msgid "Dominican Republic" +msgstr "Dominikanische Republik" + +#: includes/countries.php:67 +msgid "Algeria" +msgstr "Algerien" + +#: includes/countries.php:68 +msgid "Ecuador" +msgstr "Ecuador" + +#: includes/countries.php:69 +msgid "Estonia" +msgstr "Estland" + +#: includes/countries.php:70 +msgid "Egypt" +msgstr "Ägypten" + +#: includes/countries.php:71 +msgid "Western Sahara" +msgstr "Westliche Sahara" + +#: includes/countries.php:72 +msgid "Eritrea" +msgstr "Eritrea" + +#: includes/countries.php:73 +msgid "Spain" +msgstr "Spanien" + +#: includes/countries.php:74 +msgid "Ethiopia" +msgstr "Äthiopien" + +#: includes/countries.php:75 +msgid "Finland" +msgstr "Finnland" + +#: includes/countries.php:76 +msgid "Fiji" +msgstr "Fidschi" + +#: includes/countries.php:77 +msgid "Falkland Islands" +msgstr "Falkland-Inseln" + +#: includes/countries.php:78 +msgid "Micronesia" +msgstr "Mikronesien" + +#: includes/countries.php:79 +msgid "Faroe Islands" +msgstr "Färöer-Inseln" + +#: includes/countries.php:80 +msgid "France" +msgstr "Frankreich" + +#: includes/countries.php:81 +msgid "Gabon" +msgstr "Gabun" + +#: includes/countries.php:82 +msgid "United Kingdom" +msgstr "Vereinigtes Königreich" + +#: includes/countries.php:83 +msgid "Grenada" +msgstr "Grenada" + +#: includes/countries.php:84 +msgid "Georgia" +msgstr "Georgien" + +#: includes/countries.php:85 +msgid "French Guiana" +msgstr "Französisch-Guayana" + +#: includes/countries.php:86 +msgid "Guernsey" +msgstr "Guernsey" + +#: includes/countries.php:87 +msgid "Ghana" +msgstr "Ghana" + +#: includes/countries.php:88 +msgid "Gibraltar" +msgstr "Gibraltar" + +#: includes/countries.php:89 +msgid "Greenland" +msgstr "Grönland" + +#: includes/countries.php:90 +msgid "Gambia" +msgstr "Gambia" + +#: includes/countries.php:91 +msgid "Guinea" +msgstr "Guinea" + +#: includes/countries.php:92 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#: includes/countries.php:93 +msgid "Equatorial Guinea" +msgstr "Äquatorial-Guinea" + +#: includes/countries.php:94 +msgid "Greece" +msgstr "Griechenland" + +#: includes/countries.php:95 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Südgeorgien und die Südlichen Sandwichinseln" + +#: includes/countries.php:96 +msgid "Guatemala" +msgstr "Guatemala" + +#: includes/countries.php:97 +msgid "Guam" +msgstr "Guam" + +#: includes/countries.php:98 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#: includes/countries.php:99 +msgid "Guyana" +msgstr "Guyana" + +#: includes/countries.php:100 +msgid "Hong Kong S.A.R., China" +msgstr "Hong Kong S.A.R., China" + +#: includes/countries.php:101 +msgid "Heard Island and McDonald Islands" +msgstr "Heard und McDonaldinseln" + +#: includes/countries.php:102 +msgid "Honduras" +msgstr "Honduras" + +#: includes/countries.php:103 +msgid "Croatia" +msgstr "Kroatien" + +#: includes/countries.php:104 +msgid "Haiti" +msgstr "Haiti" + +#: includes/countries.php:105 +msgid "Hungary" +msgstr "Ungarn" + +#: includes/countries.php:106 +msgid "Indonesia" +msgstr "Indonesien" + +#: includes/countries.php:107 +msgid "Ireland" +msgstr "Irland" + +#: includes/countries.php:108 +msgid "Israel" +msgstr "Israel" + +#: includes/countries.php:109 +msgid "Isle of Man" +msgstr "Isle of Man" + +#: includes/countries.php:110 +msgid "India" +msgstr "Indien" + +#: includes/countries.php:111 +msgid "British Indian Ocean Territory" +msgstr "Britisches Territorium im Indischen Ozean" + +#: includes/countries.php:112 +msgid "Iraq" +msgstr "Irak" + +#: includes/countries.php:113 +msgid "Iran" +msgstr "Iran" + +#: includes/countries.php:114 +msgid "Iceland" +msgstr "Island" + +#: includes/countries.php:115 +msgid "Italy" +msgstr "Italien" + +#: includes/countries.php:116 +msgid "Jersey" +msgstr "Jersey" + +#: includes/countries.php:117 +msgid "Jamaica" +msgstr "Jamaika" + +#: includes/countries.php:118 +msgid "Jordan" +msgstr "Jordanien" + +#: includes/countries.php:119 +msgid "Japan" +msgstr "Japan" + +#: includes/countries.php:120 +msgid "Kenya" +msgstr "Kenia" + +#: includes/countries.php:121 +msgid "Kyrgyzstan" +msgstr "Kirgisistan" + +#: includes/countries.php:122 +msgid "Cambodia" +msgstr "Kambodscha" + +#: includes/countries.php:123 +msgid "Kiribati" +msgstr "Kiribati" + +#: includes/countries.php:124 +msgid "Comoros" +msgstr "Komoren" + +#: includes/countries.php:125 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts und Nevis" + +#: includes/countries.php:126 +msgid "North Korea" +msgstr "Nordkorea" + +#: includes/countries.php:127 +msgid "South Korea" +msgstr "Südkorea" + +#: includes/countries.php:128 +msgid "Kuwait" +msgstr "Kuwait" + +#: includes/countries.php:129 +msgid "Cayman Islands" +msgstr "Kaiman-Inseln" + +#: includes/countries.php:130 +msgid "Kazakhstan" +msgstr "Kasachstan" + +#: includes/countries.php:131 +msgid "Laos" +msgstr "Laos" + +#: includes/countries.php:132 +msgid "Lebanon" +msgstr "Libanon" + +#: includes/countries.php:133 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#: includes/countries.php:134 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#: includes/countries.php:135 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#: includes/countries.php:136 +msgid "Liberia" +msgstr "Liberia" + +#: includes/countries.php:137 +msgid "Lesotho" +msgstr "Lesotho" + +#: includes/countries.php:138 +msgid "Lithuania" +msgstr "Litauen" + +#: includes/countries.php:139 +msgid "Luxembourg" +msgstr "Luxemburg" + +#: includes/countries.php:140 +msgid "Latvia" +msgstr "Lettland" + +#: includes/countries.php:141 +msgid "Libya" +msgstr "Libyen" + +#: includes/countries.php:142 +msgid "Morocco" +msgstr "Marokko" + +#: includes/countries.php:143 +msgid "Monaco" +msgstr "Monaco" + +#: includes/countries.php:144 +msgid "Moldova" +msgstr "Moldawien" + +#: includes/countries.php:145 +msgid "Montenegro" +msgstr "Montenegro" + +#: includes/countries.php:146 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (französischer Teil)" + +#: includes/countries.php:147 +msgid "Madagascar" +msgstr "Madagaskar" + +#: includes/countries.php:148 +msgid "Marshall Islands" +msgstr "Marshall-Inseln" + +#: includes/countries.php:149 +msgid "Macedonia" +msgstr "Mazedonien" + +#: includes/countries.php:150 +msgid "Mali" +msgstr "Mali" + +#: includes/countries.php:151 +msgid "Myanmar" +msgstr "Myanmar" + +#: includes/countries.php:152 +msgid "Mongolia" +msgstr "Mongolei" + +#: includes/countries.php:153 +msgid "Macao S.A.R., China" +msgstr "Macao, China" + +#: includes/countries.php:154 +msgid "Northern Mariana Islands" +msgstr "Nördliche Marianen" + +#: includes/countries.php:155 +msgid "Martinique" +msgstr "Martinique" + +#: includes/countries.php:156 +msgid "Mauritania" +msgstr "Mauretanien" + +#: includes/countries.php:157 +msgid "Montserrat" +msgstr "Montserrat" + +#: includes/countries.php:158 +msgid "Malta" +msgstr "Malta" + +#: includes/countries.php:159 +msgid "Mauritius" +msgstr "Mauritius" + +#: includes/countries.php:160 +msgid "Maldives" +msgstr "Malediven" + +#: includes/countries.php:161 +msgid "Malawi" +msgstr "Malawi" + +#: includes/countries.php:162 +msgid "Mexico" +msgstr "Mexiko" + +#: includes/countries.php:163 +msgid "Malaysia" +msgstr "Malaysia" + +#: includes/countries.php:164 +msgid "Mozambique" +msgstr "Mosambik" + +#: includes/countries.php:165 +msgid "Namibia" +msgstr "Namibia" + +#: includes/countries.php:166 +msgid "New Caledonia" +msgstr "Neu-Kaledonien" + +#: includes/countries.php:167 +msgid "Niger" +msgstr "Niger" + +#: includes/countries.php:168 +msgid "Norfolk Island" +msgstr "Norfolk Inseln" + +#: includes/countries.php:169 +msgid "Nigeria" +msgstr "Nigeria" + +#: includes/countries.php:170 +msgid "Nicaragua" +msgstr "Nicaragua" + +#: includes/countries.php:171 +msgid "Netherlands" +msgstr "Niederlande" + +#: includes/countries.php:172 +msgid "Norway" +msgstr "Norwegen" + +#: includes/countries.php:173 +msgid "Nepal" +msgstr "Nepal" + +#: includes/countries.php:174 +msgid "Nauru" +msgstr "Nauru" + +#: includes/countries.php:175 +msgid "Niue" +msgstr "Niue" + +#: includes/countries.php:176 +msgid "New Zealand" +msgstr "Neuseeland" + +#: includes/countries.php:177 +msgid "Oman" +msgstr "Oman" + +#: includes/countries.php:178 +msgid "Panama" +msgstr "Panama" + +#: includes/countries.php:179 +msgid "Peru" +msgstr "Peru" + +#: includes/countries.php:180 +msgid "French Polynesia" +msgstr "Französisch-Polynesien" + +#: includes/countries.php:181 +msgid "Papua New Guinea" +msgstr "Papua-Neu-Guinea" + +#: includes/countries.php:182 +msgid "Philippines" +msgstr "Philippinen" + +#: includes/countries.php:183 +msgid "Pakistan" +msgstr "Pakistan" + +#: includes/countries.php:184 +msgid "Poland" +msgstr "Polen" + +#: includes/countries.php:185 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre und Miquelon" + +#: includes/countries.php:186 +msgid "Pitcairn" +msgstr "Pitcairn" + +#: includes/countries.php:187 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#: includes/countries.php:188 +msgid "Palestinian Territory" +msgstr "Palästinische Gebiete" + +#: includes/countries.php:189 +msgid "Portugal" +msgstr "Portugal" + +#: includes/countries.php:190 +msgid "Palau" +msgstr "Palau" + +#: includes/countries.php:191 +msgid "Paraguay" +msgstr "Paraguay" + +#: includes/countries.php:192 +msgid "Qatar" +msgstr "Katar" + +#: includes/countries.php:193 +msgid "Reunion" +msgstr "Réunion" + +#: includes/countries.php:194 +msgid "Romania" +msgstr "Rumänien" + +#: includes/countries.php:195 +msgid "Serbia" +msgstr "Serbien" + +#: includes/countries.php:196 +msgid "Russia" +msgstr "Russland" + +#: includes/countries.php:197 +msgid "Rwanda" +msgstr "Ruanda" + +#: includes/countries.php:198 +msgid "Saudi Arabia" +msgstr "Saudi-Arabien" + +#: includes/countries.php:199 +msgid "Solomon Islands" +msgstr "Solomon-Inseln" + +#: includes/countries.php:200 +msgid "Seychelles" +msgstr "Seychellen" + +#: includes/countries.php:201 +msgid "Sudan" +msgstr "Sudan" + +#: includes/countries.php:202 +msgid "Sweden" +msgstr "Schweden" + +#: includes/countries.php:203 +msgid "Singapore" +msgstr "Singapur" + +#: includes/countries.php:204 +msgid "Saint Helena" +msgstr "Sankt-Helena" + +#: includes/countries.php:205 +msgid "Slovenia" +msgstr "Slowenien" + +#: includes/countries.php:206 +msgid "Svalbard and Jan Mayen" +msgstr "Spitzbergen und Jan Mayen" + +#: includes/countries.php:207 +msgid "Slovakia" +msgstr "Slowakei" + +#: includes/countries.php:208 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#: includes/countries.php:209 +msgid "San Marino" +msgstr "San Marino" + +#: includes/countries.php:210 +msgid "Senegal" +msgstr "Senegal" + +#: includes/countries.php:211 +msgid "Somalia" +msgstr "Somalia" + +#: includes/countries.php:212 +msgid "Suriname" +msgstr "Surinam" + +#: includes/countries.php:213 +msgid "Sao Tome and Principe" +msgstr "Sao Tome und Principe" + +#: includes/countries.php:214 +msgid "El Salvador" +msgstr "El Salvador" + +#: includes/countries.php:215 +msgid "Syria" +msgstr "Syrien" + +#: includes/countries.php:216 +msgid "Swaziland" +msgstr "Swasiland" + +#: includes/countries.php:217 +msgid "Turks and Caicos Islands" +msgstr "Turks- und Caicosinseln" + +#: includes/countries.php:218 +msgid "Chad" +msgstr "Tschad" + +#: includes/countries.php:219 +msgid "French Southern Territories" +msgstr "Französische Süd- und Antarktisgebiete" + +#: includes/countries.php:220 +msgid "Togo" +msgstr "Togo" + +#: includes/countries.php:221 +msgid "Thailand" +msgstr "Thailand" + +#: includes/countries.php:222 +msgid "Tajikistan" +msgstr "Tadschikistan" + +#: includes/countries.php:223 +msgid "Tokelau" +msgstr "Tokelau" + +#: includes/countries.php:224 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#: includes/countries.php:225 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#: includes/countries.php:226 +msgid "Tunisia" +msgstr "Tunesien" + +#: includes/countries.php:227 +msgid "Tonga" +msgstr "Tonga" + +#: includes/countries.php:228 +msgid "Turkey" +msgstr "Türkei" + +#: includes/countries.php:229 +msgid "Trinidad and Tobago" +msgstr "Trinidad und Tobago" + +#: includes/countries.php:230 +msgid "Tuvalu" +msgstr "Tuvalu" + +#: includes/countries.php:231 +msgid "Taiwan" +msgstr "Taiwan" + +#: includes/countries.php:232 +msgid "Tanzania" +msgstr "Tansania" + +#: includes/countries.php:233 +msgid "Ukraine" +msgstr "Ukraine" + +#: includes/countries.php:234 +msgid "Uganda" +msgstr "Uganda" + +#: includes/countries.php:235 +msgid "United States Minor Outlying Islands" +msgstr "United States Minor Outlying Islands" + +#: includes/countries.php:236 +msgid "United States" +msgstr "Vereinigte Staaten von Amerika" + +#: includes/countries.php:237 +msgid "Uruguay" +msgstr "Uruguay" + +#: includes/countries.php:238 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#: includes/countries.php:239 +msgid "Vatican" +msgstr "Vatikan" + +#: includes/countries.php:240 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint-Vincent und die Grenadinen" + +#: includes/countries.php:241 includes/countries.php:254 +msgid "Venezuela" +msgstr "Venezuela" + +#: includes/countries.php:242 +msgid "British Virgin Islands" +msgstr "Britische Jungfraueninseln" + +#: includes/countries.php:243 +msgid "U.S. Virgin Islands" +msgstr "Amerikanische Jungfraueninseln" + +#: includes/countries.php:244 +msgid "Vietnam" +msgstr "Vietnam" + +#: includes/countries.php:245 +msgid "Vanuatu" +msgstr "Vanuatu" + +#: includes/countries.php:246 +msgid "Wallis and Futuna" +msgstr "Wallis und Futuna" + +#: includes/countries.php:247 +msgid "Samoa" +msgstr "Samoa" + +#: includes/countries.php:248 +msgid "Yemen" +msgstr "Jemen" + +#: includes/countries.php:249 +msgid "Mayotte" +msgstr "Mayotte" + +#: includes/countries.php:250 +msgid "South Africa" +msgstr "Südafrika" + +#: includes/countries.php:251 +msgid "Zambia" +msgstr "Sambia" + +#: includes/countries.php:252 +msgid "Zimbabwe" +msgstr "Simbabwe" + +#: includes/countries.php:253 +msgid "US Armed Forces" +msgstr "US-Streitkräfte" + +#: includes/currencies.php:17 includes/currencies.php:99 +#: includes/currencies.php:7 includes/currencies.php:37 +#: includes/currencies.php:44 includes/currencies.php:64 +#: includes/currencies.php:68 includes/currencies.php:75 +#: includes/currencies.php:85 includes/currencies.php:87 +#: includes/currencies.php:94 includes/currencies.php:121 +#: includes/currencies.php:148 +msgid "US Dollars ($)" +msgstr "US Dollar (&Nummer36;)" + +#: includes/currencies.php:19 includes/currencies.php:102 +#: includes/currencies.php:8 includes/currencies.php:9 +#: includes/currencies.php:40 includes/currencies.php:47 +#: includes/currencies.php:67 includes/currencies.php:71 +#: includes/currencies.php:78 includes/currencies.php:88 +#: includes/currencies.php:90 includes/currencies.php:97 +#: includes/currencies.php:124 +msgid "Euros (€)" +msgstr "Euro (€)" + +#: includes/currencies.php:24 includes/currencies.php:101 +#: includes/currencies.php:9 includes/currencies.php:14 +#: includes/currencies.php:39 includes/currencies.php:46 +#: includes/currencies.php:66 includes/currencies.php:70 +#: includes/currencies.php:77 includes/currencies.php:87 +#: includes/currencies.php:89 includes/currencies.php:96 +#: includes/currencies.php:123 +msgid "Pounds Sterling (£)" +msgstr "Britische Pfund (£)" + +#: includes/currencies.php:28 includes/currencies.php:18 +msgid "Argentine Peso ($)" +msgstr "Argentinischer Peso ($)" + +#: includes/currencies.php:29 includes/currencies.php:10 +#: includes/currencies.php:18 includes/currencies.php:28 +#: includes/currencies.php:19 +msgid "Australian Dollars ($)" +msgstr "Australische Dollar ($)" + +#: includes/currencies.php:31 includes/currencies.php:20 +#: includes/currencies.php:30 includes/currencies.php:21 +msgid "Brazilian Real (R$)" +msgstr "Brasilianischer Real (R$)" + +#: includes/currencies.php:35 includes/currencies.php:100 +#: includes/currencies.php:12 includes/currencies.php:24 +#: includes/currencies.php:34 includes/currencies.php:38 +#: includes/currencies.php:45 includes/currencies.php:65 +#: includes/currencies.php:69 includes/currencies.php:76 +#: includes/currencies.php:86 includes/currencies.php:88 +#: includes/currencies.php:95 includes/currencies.php:25 +#: includes/currencies.php:122 +msgid "Canadian Dollars ($)" +msgstr "Kanadische Dollar ($)" + +#: includes/currencies.php:36 includes/currencies.php:13 +#: includes/currencies.php:25 includes/currencies.php:35 +#: includes/currencies.php:26 +msgid "Chinese Yuan" +msgstr "Chinesische Yuan" + +#: includes/currencies.php:38 includes/currencies.php:13 +#: includes/currencies.php:14 includes/currencies.php:26 +#: includes/currencies.php:27 includes/currencies.php:37 +#: includes/currencies.php:28 +msgid "Czech Koruna" +msgstr "Tschechische Krone" + +#: includes/currencies.php:45 includes/currencies.php:14 +#: includes/currencies.php:15 includes/currencies.php:27 +#: includes/currencies.php:34 includes/currencies.php:44 +#: includes/currencies.php:36 +msgid "Danish Krone" +msgstr "Dänsiche Krone" + +#: includes/currencies.php:46 includes/currencies.php:15 +#: includes/currencies.php:16 includes/currencies.php:28 +#: includes/currencies.php:35 includes/currencies.php:45 +#: includes/currencies.php:48 +msgid "Hong Kong Dollar ($)" +msgstr "Hong Kong Dollar ($)" + +#: includes/currencies.php:47 includes/currencies.php:16 +#: includes/currencies.php:17 includes/currencies.php:29 +#: includes/currencies.php:36 includes/currencies.php:46 +#: includes/currencies.php:49 +msgid "Hungarian Forint" +msgstr "Ungarische Forint" + +#: includes/currencies.php:48 includes/currencies.php:18 +#: includes/currencies.php:30 includes/currencies.php:37 +#: includes/currencies.php:47 includes/currencies.php:50 +msgid "Indian Rupee" +msgstr "Indische Rupie" + +#: includes/currencies.php:49 includes/currencies.php:19 +#: includes/currencies.php:31 includes/currencies.php:38 +#: includes/currencies.php:48 includes/currencies.php:51 +msgid "Indonesia Rupiah" +msgstr "Indonesischer Rupiah" + +#: includes/currencies.php:50 includes/currencies.php:17 +#: includes/currencies.php:20 includes/currencies.php:32 +#: includes/currencies.php:39 includes/currencies.php:49 +#: includes/currencies.php:52 +msgid "Israeli Shekel" +msgstr "Israelische Shekel" + +#: includes/currencies.php:52 includes/currencies.php:18 +#: includes/currencies.php:21 includes/currencies.php:34 +#: includes/currencies.php:41 includes/currencies.php:51 +#: includes/currencies.php:54 +msgid "Japanese Yen (¥)" +msgstr "Japanische Yen (¥)" + +#: includes/currencies.php:57 includes/currencies.php:19 +#: includes/currencies.php:22 includes/currencies.php:38 +#: includes/currencies.php:45 includes/currencies.php:55 +#: includes/currencies.php:56 includes/currencies.php:60 +msgid "Malaysian Ringgits" +msgstr "Malayische Ringgit" + +#: includes/currencies.php:58 includes/currencies.php:20 +#: includes/currencies.php:23 includes/currencies.php:39 +#: includes/currencies.php:46 includes/currencies.php:56 +#: includes/currencies.php:57 includes/currencies.php:61 +msgid "Mexican Peso ($)" +msgstr "Mexikanische Peso ($)" + +#: includes/currencies.php:59 includes/currencies.php:58 +#: includes/currencies.php:62 +msgid "Nigerian Naira (₦)" +msgstr "Nigerianische Naira (₦)" + +#: includes/currencies.php:60 includes/currencies.php:21 +#: includes/currencies.php:24 includes/currencies.php:40 +#: includes/currencies.php:47 includes/currencies.php:57 +#: includes/currencies.php:59 includes/currencies.php:63 +msgid "New Zealand Dollar ($)" +msgstr "Neuseeland Dollar ($)" + +#: includes/currencies.php:61 includes/currencies.php:22 +#: includes/currencies.php:25 includes/currencies.php:41 +#: includes/currencies.php:48 includes/currencies.php:58 +#: includes/currencies.php:60 includes/currencies.php:64 +msgid "Norwegian Krone" +msgstr "Norwegische Krone" + +#: includes/currencies.php:62 includes/currencies.php:23 +#: includes/currencies.php:26 includes/currencies.php:42 +#: includes/currencies.php:49 includes/currencies.php:59 +#: includes/currencies.php:61 includes/currencies.php:65 +msgid "Philippine Pesos" +msgstr "Philippinische Pesos" + +#: includes/currencies.php:63 includes/currencies.php:24 +#: includes/currencies.php:27 includes/currencies.php:43 +#: includes/currencies.php:50 includes/currencies.php:60 +#: includes/currencies.php:62 includes/currencies.php:66 +msgid "Polish Zloty" +msgstr "Polnische Zloty" + +#: includes/currencies.php:65 includes/currencies.php:76 +msgid "Russian Ruble (₽)" +msgstr "Russischer Rubel (₽)" + +#: includes/currencies.php:70 includes/currencies.php:25 +#: includes/currencies.php:28 includes/currencies.php:45 +#: includes/currencies.php:52 includes/currencies.php:62 +#: includes/currencies.php:64 includes/currencies.php:65 +#: includes/currencies.php:84 +msgid "Singapore Dollar ($)" +msgstr "Singapur Dollar ($)" + +#: includes/currencies.php:75 includes/currencies.php:50 +#: includes/currencies.php:57 includes/currencies.php:67 +#: includes/currencies.php:69 includes/currencies.php:70 +#: includes/currencies.php:89 +msgid "South African Rand (R)" +msgstr "Südafrikanischer Rand (R)" + +#: includes/currencies.php:80 includes/currencies.php:30 +#: includes/currencies.php:50 includes/currencies.php:54 +#: includes/currencies.php:61 includes/currencies.php:71 +#: includes/currencies.php:73 includes/currencies.php:75 +#: includes/currencies.php:94 +msgid "South Korean Won" +msgstr "Südkoreanische Won" + +#: includes/currencies.php:83 includes/currencies.php:26 +#: includes/currencies.php:31 includes/currencies.php:51 +#: includes/currencies.php:55 includes/currencies.php:62 +#: includes/currencies.php:72 includes/currencies.php:74 +#: includes/currencies.php:78 includes/currencies.php:97 +msgid "Swedish Krona" +msgstr "Schwedische Krone" + +#: includes/currencies.php:84 includes/currencies.php:27 +#: includes/currencies.php:32 includes/currencies.php:52 +#: includes/currencies.php:56 includes/currencies.php:63 +#: includes/currencies.php:73 includes/currencies.php:75 +#: includes/currencies.php:79 includes/currencies.php:98 +msgid "Swiss Franc" +msgstr "Schweizer Franken" + +#: includes/currencies.php:85 includes/currencies.php:28 +#: includes/currencies.php:33 includes/currencies.php:53 +#: includes/currencies.php:57 includes/currencies.php:64 +#: includes/currencies.php:74 includes/currencies.php:76 +#: includes/currencies.php:80 includes/currencies.php:99 +msgid "Taiwan New Dollars" +msgstr "Taiwanesischer Neuer Dollar" + +#: includes/currencies.php:86 includes/currencies.php:29 +#: includes/currencies.php:34 includes/currencies.php:54 +#: includes/currencies.php:58 includes/currencies.php:65 +#: includes/currencies.php:75 includes/currencies.php:77 +#: includes/currencies.php:81 includes/currencies.php:100 +msgid "Thai Baht" +msgstr "Thailändische Baht" + +#: includes/currencies.php:87 includes/currencies.php:35 +#: includes/currencies.php:55 includes/currencies.php:59 +#: includes/currencies.php:66 includes/currencies.php:76 +#: includes/currencies.php:78 includes/currencies.php:82 +#: includes/currencies.php:101 +msgid "Turkish Lira" +msgstr "Türkische Lira" + +#: includes/currencies.php:89 includes/currencies.php:36 +#: includes/currencies.php:56 includes/currencies.php:60 +#: includes/currencies.php:67 includes/currencies.php:77 +#: includes/currencies.php:79 includes/currencies.php:84 +#: includes/currencies.php:111 +msgid "Vietnamese Dong" +msgstr "Vietnamesische Dong" + +#: includes/filters.php:224 includes/filters.php:217 +msgid "There was a potential issue while setting the 'Profile Start Date' for a user's subscription at checkout. PayPal does not allow one to set a Profile Start Date further than 1 year out. Typically, this is not an issue, but sometimes a combination of custom code or add ons for PMPro (e.g. the Prorating or Auto-renewal Checkbox add ons) will try to set a Profile Start Date out past 1 year in order to respect an existing user's original expiration date before they checked out. The user's information is below. PMPro has allowed the checkout and simply restricted the Profile Start Date to 1 year out with a possible additional free Trial of up to 1 year. You should double check this information to determine if maybe the user has overpaid or otherwise needs to be addressed. If you get many of these emails, you should consider adjusting your custom code to avoid these situations." +msgstr "Es gab ein mögliches Problem bei der Einstellung des „Profil-Startdatums“ für das Abonnement eines Benutzers an der Kasse. PayPal erlaubt es nicht, ein Profil-Startdatum weiter als 1 Jahr im Voraus festzulegen. Normalerweise ist dies kein Problem, aber manchmal versucht eine Kombination aus benutzerdefiniertem Code oder Add-Ons für PMPro (z. B. die Add-Ons „Prorating“ oder „Auto-renewal Checkbox“), ein Profil-Startdatum über 1 Jahr hinaus festzulegen, um das ursprüngliche Ablaufdatum eines bestehenden Benutzers zu respektieren, bevor dieser ausgecheckt hat. Die Informationen des Benutzers sind unten aufgeführt. PMPro hat die Abmeldung zugelassen und lediglich das Profil-Startdatum auf 1 Jahr mit einer möglichen zusätzlichen kostenlosen Testphase von bis zu 1 Jahr beschränkt. Sie sollten diese Informationen noch einmal überprüfen, um festzustellen, ob der Benutzer vielleicht zu viel bezahlt hat oder anderweitig angesprochen werden muss. Wenn Sie viele dieser E-Mails erhalten, sollten Sie erwägen, Ihren benutzerdefinierten Code anzupassen, um solche Situationen zu vermeiden." + +#: includes/filters.php:225 +#, php-format +msgid "User: %1$s
    Email: %2$s
    Membership Level: %3$s
    Order #: %4$s
    Original Profile Start Date: %5$s
    Adjusted Profile Start Date: %6$s
    Trial Period: %7$s
    Trial Frequency: %8$s
    " +msgstr "Benutzer: %1$s
    E-Mail: %2$s
    Mitgliedschafts-Paket: %3$s
    Auftragsnummer: %4$s
    Ursprüngliches Profil-Startdatum: %5$s
    Angepasstes Profil-Startdatum: %6$s
    Testzeitraum: %7$s
    Testfrequenz: %8$s
    " + +#: includes/filters.php:227 includes/filters.php:220 +#, php-format +msgid "Profile Start Date Issue Detected and Fixed at %s" +msgstr "Profil-Startdatum-Problem erkannt und behoben bei %s" + +#: includes/functions.php:321 includes/functions.php:433 +#: includes/functions.php:160 includes/functions.php:196 +#: includes/functions.php:200 includes/functions.php:202 +#: includes/functions.php:203 includes/functions.php:204 +#: includes/functions.php:207 includes/functions.php:243 +#: includes/functions.php:309 includes/functions.php:315 +#: includes/functions.php:320 includes/functions.php:329 +#: includes/functions.php:455 includes/functions.php:464 +#: includes/functions.php:393 includes/functions.php:509 +#, php-format +msgid "The price for membership is %s now" +msgstr "Der Preis für den Zugang beträgt %s" + +#: includes/functions.php:323 includes/functions.php:435 +#: includes/functions.php:202 includes/functions.php:204 +#: includes/functions.php:205 includes/functions.php:206 +#: includes/functions.php:209 includes/functions.php:245 +#: includes/functions.php:311 includes/functions.php:317 +#: includes/functions.php:322 includes/functions.php:331 +#: includes/functions.php:457 includes/functions.php:466 +#: includes/functions.php:398 includes/functions.php:511 +#, php-format +msgid "%s now" +msgstr "%s jetzt" + +#: includes/functions.php:330 includes/functions.php:406 +#, php-format +msgid " and then %1$s per %2$s for %3$d more %4$s." +msgstr " und dann %1$s pro %2$s für %3$d weitere %4$s." + +#: includes/functions.php:332 includes/functions.php:408 +#, php-format +msgid " and then %1$s every %2$d %3$s for %4$d more payments." +msgstr " und dann %1$s jede(n) %2$d %3$s für %4$d weitere Zahlungen." + +#: includes/functions.php:335 includes/functions.php:411 +#, php-format +msgid " and then %1$s after %2$d %3$s." +msgstr " und dann %1$s nach %2$d %3$s." + +#: includes/functions.php:340 includes/functions.php:416 +#, php-format +msgid "The price for membership is %1$s per %2$s." +msgstr "Der Preis für den Zugang beträgt %1$s pro %2$s." + +#: includes/functions.php:342 includes/functions.php:418 +#, php-format +msgid "%1$s per %2$s." +msgstr "%1$s pro %2$s." + +#: includes/functions.php:346 includes/functions.php:422 +#, php-format +msgid "The price for membership is %1$s every %2$d %3$s." +msgstr "Der Preis für den Zugang beträgt %1$s jede(n) %2$d %3$s." + +#: includes/functions.php:348 includes/functions.php:424 +#, php-format +msgid "%1$s every %2$d %3$s." +msgstr "%1$s jede(n) %2$d %3$s." + +#: includes/functions.php:353 includes/functions.php:429 +#, php-format +msgid " and then %1$s per %2$s." +msgstr " und dann %1$s pro %2$s." + +#: includes/functions.php:355 includes/functions.php:431 +#, php-format +msgid " and then %1$s every %2$d %3$s." +msgstr " und dann %1$s jede(n) %2$d %3$s." + +#: includes/functions.php:370 includes/functions.php:202 +#: includes/functions.php:238 includes/functions.php:249 +#: includes/functions.php:260 includes/functions.php:261 +#: includes/functions.php:262 includes/functions.php:264 +#: includes/functions.php:267 includes/functions.php:271 +#: includes/functions.php:307 includes/functions.php:373 +#: includes/functions.php:379 includes/functions.php:384 +#: includes/functions.php:393 pages/levels.php:82 includes/functions.php:446 +msgid "After your initial payment, your first payment is Free." +msgstr "Nach Ihrer Erst-Zahlung ist die nächste Zahlung kostenlos." + +#: includes/functions.php:372 includes/functions.php:206 +#: includes/functions.php:242 includes/functions.php:253 +#: includes/functions.php:264 includes/functions.php:265 +#: includes/functions.php:266 includes/functions.php:268 +#: includes/functions.php:271 includes/functions.php:275 +#: includes/functions.php:311 includes/functions.php:377 +#: includes/functions.php:383 includes/functions.php:388 +#: includes/functions.php:397 pages/levels.php:86 includes/functions.php:448 +#, php-format +msgid "After your initial payment, your first %d payments are Free." +msgstr "Nach Ihrer Erst-Zahlung ist die nächste %d Zahlung kostenlos." + +#: includes/functions.php:376 includes/functions.php:213 +#: includes/functions.php:249 includes/functions.php:260 +#: includes/functions.php:271 includes/functions.php:272 +#: includes/functions.php:273 includes/functions.php:275 +#: includes/functions.php:278 includes/functions.php:282 +#: includes/functions.php:318 includes/functions.php:384 +#: includes/functions.php:390 includes/functions.php:395 +#: includes/functions.php:404 pages/levels.php:93 includes/functions.php:452 +#, php-format +msgid "After your initial payment, your first payment will cost %s." +msgstr "Nach Ihrer Erst-Zahlung wird die nächste Zahlung %s betragen." + +#: includes/functions.php:378 includes/functions.php:454 +#, php-format +msgid "After your initial payment, your first %1$d payments will cost %2$s." +msgstr "Nach Ihrer Erst-Zahlung werden die ersten %1$d Zahlungen %2$s betragen." + +#: includes/functions.php:388 includes/functions.php:489 +#: includes/functions.php:464 includes/functions.php:565 +#, php-format +msgid "Customers in %1$s will be charged %2$s%% tax." +msgstr "Kunden aus %1$s werden zusätzlich %2$s%% Steuern berechnet." + +#: includes/functions.php:446 includes/functions.php:522 +#, php-format +msgid "%1$s per %2$s for %3$d more %4$s" +msgstr "%1$s pro %2$s für %3$d weitere %4$s" + +#: includes/functions.php:448 includes/functions.php:524 +#, php-format +msgid "%1$s every %2$d %3$s for %4$d more payments" +msgstr "%1$s jede(n) %2$d %3$s für %4$d weitere Zahlungen" + +#: includes/functions.php:451 includes/functions.php:527 +#, php-format +msgid "%1$s after %2$d %3$s" +msgstr "%1$s nach %2$d %3$s" + +#: includes/functions.php:454 includes/functions.php:530 +#, php-format +msgid "%1$s every %2$s" +msgstr "%1$s jede(n) %2$s" + +#: includes/functions.php:456 includes/functions.php:532 +#, php-format +msgid "%1$s every %2$d %3$s" +msgstr "%1$s jede(n) %2$d %3$s" + +#: includes/functions.php:478 includes/functions.php:511 +#: includes/functions.php:520 +msgid "Trial pricing has been applied to the first payment." +msgstr "Für die erste Zahlung wurde ein Testpreis festgelegt." + +#: includes/functions.php:480 includes/functions.php:513 +#: includes/functions.php:522 +#, php-format +msgid "Trial pricing has been applied to the first %d payments." +msgstr "Für die ersten %d-Zahlungen wurde ein Testpreis festgelegt." + +#: includes/functions.php:505 includes/functions.php:582 +#, php-format +msgid "Membership expires after %1$d %2$s." +msgstr "Zugang endet nach %1$d %2$s." + +#: includes/functions.php:524 includes/functions.php:601 +#, php-format +msgid "%1$s membership expires after %2$d %3$s" +msgstr "%1$s Mitgliedschaft läuft nach %2$d %3$s aus" + +#: includes/functions.php:877 includes/functions.php:491 +#: includes/functions.php:514 includes/functions.php:525 +#: includes/functions.php:536 includes/functions.php:537 +#: includes/functions.php:538 includes/functions.php:545 +#: includes/functions.php:569 includes/functions.php:570 +#: includes/functions.php:576 includes/functions.php:592 +#: includes/functions.php:615 includes/functions.php:694 +#: includes/functions.php:760 includes/functions.php:766 +#: includes/functions.php:945 includes/functions.php:947 +#: includes/functions.php:956 includes/functions.php:979 +msgid "User ID not found." +msgstr "Benutzer ID nicht gefunden." + +#: includes/functions.php:889 includes/functions.php:997 +msgid "No membership_id specified in pmpro_changeMembershipLevel." +msgstr "Keine membership_id in pmpro_changeMembershipLevel angegeben." + +#: includes/functions.php:895 includes/functions.php:903 +#: includes/functions.php:508 includes/functions.php:531 +#: includes/functions.php:542 includes/functions.php:553 +#: includes/functions.php:554 includes/functions.php:555 +#: includes/functions.php:562 includes/functions.php:586 +#: includes/functions.php:587 includes/functions.php:589 +#: includes/functions.php:596 includes/functions.php:612 +#: includes/functions.php:635 includes/functions.php:714 +#: includes/functions.php:780 includes/functions.php:786 +#: includes/functions.php:965 includes/functions.php:967 +#: includes/functions.php:976 includes/functions.php:1003 +#: includes/functions.php:1011 +msgid "Invalid level." +msgstr "Ungültiges Paket." + +#: includes/functions.php:914 includes/functions.php:520 +#: includes/functions.php:542 includes/functions.php:553 +#: includes/functions.php:564 includes/functions.php:565 +#: includes/functions.php:566 includes/functions.php:573 +#: includes/functions.php:597 includes/functions.php:598 +#: includes/functions.php:600 includes/functions.php:607 +#: includes/functions.php:623 includes/functions.php:646 +#: includes/functions.php:725 includes/functions.php:791 +#: includes/functions.php:797 includes/functions.php:976 +#: includes/functions.php:978 includes/functions.php:987 +msgid "not changing?" +msgstr "nicht ändern?" + +#: includes/functions.php:970 includes/functions.php:537 +#: includes/functions.php:559 includes/functions.php:570 +#: includes/functions.php:581 includes/functions.php:582 +#: includes/functions.php:583 includes/functions.php:590 +#: includes/functions.php:592 includes/functions.php:605 +#: includes/functions.php:614 includes/functions.php:615 +#: includes/functions.php:617 includes/functions.php:624 +#: includes/functions.php:626 includes/functions.php:628 +#: includes/functions.php:631 includes/functions.php:632 +#: includes/functions.php:633 includes/functions.php:637 +#: includes/functions.php:640 includes/functions.php:649 +#: includes/functions.php:656 includes/functions.php:657 +#: includes/functions.php:663 includes/functions.php:673 +#: includes/functions.php:674 includes/functions.php:676 +#: includes/functions.php:683 includes/functions.php:697 +#: includes/functions.php:698 includes/functions.php:699 +#: includes/functions.php:700 includes/functions.php:707 +#: includes/functions.php:722 includes/functions.php:723 +#: includes/functions.php:742 includes/functions.php:746 +#: includes/functions.php:808 includes/functions.php:814 +#: includes/functions.php:815 includes/functions.php:839 +#: includes/functions.php:881 includes/functions.php:887 +#: includes/functions.php:905 includes/functions.php:911 +#: includes/functions.php:1017 includes/functions.php:1037 +#: includes/functions.php:1046 includes/functions.php:1085 +msgid "Error interacting with database" +msgstr "Fehler bei der Datenbank-Abfrage." + +#: includes/functions.php:1067 includes/functions.php:907 +#: includes/functions.php:1123 includes/functions.php:1127 +#: includes/functions.php:1129 includes/functions.php:1138 +#: includes/functions.php:1191 +#, php-format +msgid "Error interacting with database: %s" +msgstr "Fehler bei Datenbankverbindung: %s" + +#: includes/functions.php:1141 includes/functions.php:1179 +#: includes/functions.php:629 includes/functions.php:651 +#: includes/functions.php:667 includes/functions.php:668 +#: includes/functions.php:678 includes/functions.php:681 +#: includes/functions.php:690 includes/functions.php:697 +#: includes/functions.php:698 includes/functions.php:706 +#: includes/functions.php:714 includes/functions.php:717 +#: includes/functions.php:720 includes/functions.php:736 +#: includes/functions.php:737 includes/functions.php:738 +#: includes/functions.php:739 includes/functions.php:741 +#: includes/functions.php:748 includes/functions.php:753 +#: includes/functions.php:764 includes/functions.php:777 +#: includes/functions.php:778 includes/functions.php:780 +#: includes/functions.php:787 includes/functions.php:803 +#: includes/functions.php:826 includes/functions.php:881 +#: includes/functions.php:920 includes/functions.php:947 +#: includes/functions.php:948 includes/functions.php:953 +#: includes/functions.php:986 includes/functions.php:987 +#: includes/functions.php:992 includes/functions.php:1198 +#: includes/functions.php:1202 includes/functions.php:1204 +#: includes/functions.php:1213 includes/functions.php:1237 +#: includes/functions.php:1241 includes/functions.php:1243 +#: includes/functions.php:1252 includes/functions.php:1304 +#: includes/functions.php:1342 +msgid "Membership level not found." +msgstr "Paket nicht gefunden." + +#: includes/functions.php:1533 includes/functions.php:1100 +#: includes/functions.php:1101 includes/functions.php:1118 +#: includes/functions.php:1142 includes/functions.php:1143 +#: includes/functions.php:1150 includes/functions.php:1157 +#: includes/functions.php:1173 includes/functions.php:1196 +#: includes/functions.php:1290 includes/functions.php:1356 +#: includes/functions.php:1357 includes/functions.php:1362 +#: includes/functions.php:1605 includes/functions.php:1609 +#: includes/functions.php:1611 includes/functions.php:1620 +#: includes/functions.php:1722 +msgid "No code was given to check." +msgstr "Kein Code zur Überprüfung eingegeben." + +#: includes/functions.php:1542 includes/functions.php:1050 +#: includes/functions.php:1072 includes/functions.php:1088 +#: includes/functions.php:1099 includes/functions.php:1102 +#: includes/functions.php:1109 includes/functions.php:1110 +#: includes/functions.php:1112 includes/functions.php:1113 +#: includes/functions.php:1127 includes/functions.php:1151 +#: includes/functions.php:1152 includes/functions.php:1159 +#: includes/functions.php:1166 includes/functions.php:1182 +#: includes/functions.php:1205 includes/functions.php:1299 +#: includes/functions.php:1365 includes/functions.php:1366 +#: includes/functions.php:1371 includes/functions.php:1614 +#: includes/functions.php:1618 includes/functions.php:1620 +#: includes/functions.php:1629 includes/functions.php:1731 +msgid "The discount code could not be found." +msgstr "Der Gutscheincode konnte nicht gefunden werden." + +#: includes/functions.php:1557 includes/functions.php:1066 +#: includes/functions.php:1088 includes/functions.php:1104 +#: includes/functions.php:1115 includes/functions.php:1118 +#: includes/functions.php:1124 includes/functions.php:1125 +#: includes/functions.php:1128 includes/functions.php:1129 +#: includes/functions.php:1142 includes/functions.php:1166 +#: includes/functions.php:1167 includes/functions.php:1174 +#: includes/functions.php:1181 includes/functions.php:1197 +#: includes/functions.php:1220 includes/functions.php:1314 +#: includes/functions.php:1380 includes/functions.php:1381 +#: includes/functions.php:1386 includes/functions.php:1629 +#: includes/functions.php:1633 includes/functions.php:1635 +#: includes/functions.php:1644 includes/functions.php:1746 +#, php-format +msgid "This discount code goes into effect on %s." +msgstr "Dieser Gutscheincode gilt ab %s." + +#: includes/functions.php:1564 includes/functions.php:1075 +#: includes/functions.php:1097 includes/functions.php:1113 +#: includes/functions.php:1124 includes/functions.php:1127 +#: includes/functions.php:1131 includes/functions.php:1132 +#: includes/functions.php:1137 includes/functions.php:1138 +#: includes/functions.php:1149 includes/functions.php:1173 +#: includes/functions.php:1174 includes/functions.php:1181 +#: includes/functions.php:1188 includes/functions.php:1204 +#: includes/functions.php:1227 includes/functions.php:1321 +#: includes/functions.php:1387 includes/functions.php:1388 +#: includes/functions.php:1393 includes/functions.php:1636 +#: includes/functions.php:1640 includes/functions.php:1642 +#: includes/functions.php:1651 includes/functions.php:1753 +#, php-format +msgid "This discount code expired on %s." +msgstr "Dieser Gutscheincode läuft am %s ab." + +#: includes/functions.php:1573 includes/functions.php:1087 +#: includes/functions.php:1109 includes/functions.php:1125 +#: includes/functions.php:1136 includes/functions.php:1139 +#: includes/functions.php:1141 includes/functions.php:1142 +#: includes/functions.php:1149 includes/functions.php:1150 +#: includes/functions.php:1159 includes/functions.php:1183 +#: includes/functions.php:1184 includes/functions.php:1191 +#: includes/functions.php:1198 includes/functions.php:1214 +#: includes/functions.php:1237 includes/functions.php:1331 +#: includes/functions.php:1397 includes/functions.php:1398 +#: includes/functions.php:1403 includes/functions.php:1646 +#: includes/functions.php:1650 includes/functions.php:1652 +#: includes/functions.php:1661 includes/functions.php:1762 +msgid "This discount code is no longer valid." +msgstr "Dieser Gutscheincode ist nicht mehr gültig." + +#: includes/functions.php:1592 includes/functions.php:1102 +#: includes/functions.php:1124 includes/functions.php:1140 +#: includes/functions.php:1151 includes/functions.php:1154 +#: includes/functions.php:1155 includes/functions.php:1164 +#: includes/functions.php:1165 includes/functions.php:1172 +#: includes/functions.php:1196 includes/functions.php:1197 +#: includes/functions.php:1204 includes/functions.php:1211 +#: includes/functions.php:1227 includes/functions.php:1250 +#: includes/functions.php:1344 includes/functions.php:1410 +#: includes/functions.php:1411 includes/functions.php:1416 +#: includes/functions.php:1666 includes/functions.php:1670 +#: includes/functions.php:1672 includes/functions.php:1681 +#: includes/functions.php:1781 +msgid "This discount code does not apply to this membership level." +msgstr "Dieser Gutscheincode kann für dieses Mitgliedschafts-Paket nicht angewendet werden." + +#: includes/functions.php:1630 includes/functions.php:1110 +#: includes/functions.php:1132 includes/functions.php:1148 +#: includes/functions.php:1159 includes/functions.php:1162 +#: includes/functions.php:1172 includes/functions.php:1180 +#: includes/functions.php:1181 includes/functions.php:1182 +#: includes/functions.php:1198 includes/functions.php:1222 +#: includes/functions.php:1223 includes/functions.php:1230 +#: includes/functions.php:1237 includes/functions.php:1253 +#: includes/functions.php:1276 includes/functions.php:1370 +#: includes/functions.php:1436 includes/functions.php:1442 +#: includes/functions.php:1448 includes/functions.php:1703 +#: includes/functions.php:1707 includes/functions.php:1709 +#: includes/functions.php:1718 includes/functions.php:1819 +msgid "This discount code is okay." +msgstr "Dieser Gutscheincode ist in Ordnung." + +#: includes/functions.php:1658 includes/functions.php:1134 +#: includes/functions.php:1156 includes/functions.php:1172 +#: includes/functions.php:1183 includes/functions.php:1186 +#: includes/functions.php:1196 includes/functions.php:1205 +#: includes/functions.php:1206 includes/functions.php:1223 +#: includes/functions.php:1247 includes/functions.php:1248 +#: includes/functions.php:1255 includes/functions.php:1262 +#: includes/functions.php:1278 includes/functions.php:1301 +#: includes/functions.php:1395 includes/functions.php:1397 +#: includes/functions.php:1463 includes/functions.php:1469 +#: includes/functions.php:1475 includes/functions.php:1730 +#: includes/functions.php:1734 includes/functions.php:1736 +#: includes/functions.php:1745 includes/functions.php:1847 +msgid "and" +msgstr "und" + +#: includes/functions.php:1977 includes/functions.php:1319 +#: includes/functions.php:1341 includes/functions.php:1361 +#: includes/functions.php:1372 includes/functions.php:1375 +#: includes/functions.php:1385 includes/functions.php:1394 +#: includes/functions.php:1395 includes/functions.php:1412 +#: includes/functions.php:1436 includes/functions.php:1437 +#: includes/functions.php:1450 includes/functions.php:1457 +#: includes/functions.php:1473 includes/functions.php:1496 +#: includes/functions.php:1501 includes/functions.php:1620 +#: includes/functions.php:1624 includes/functions.php:1691 +#: includes/functions.php:1697 includes/functions.php:1703 +#: includes/functions.php:2015 includes/functions.php:2019 +#: includes/functions.php:2022 includes/functions.php:2024 +#: includes/functions.php:2033 includes/functions.php:2034 +#: includes/functions.php:2409 +msgid "Sign Up for !!name!! Now" +msgstr "Jetzt für !!name!! registrieren" + +#: includes/functions.php:1985 includes/functions.php:1325 +#: includes/functions.php:1347 includes/functions.php:1367 +#: includes/functions.php:1378 includes/functions.php:1381 +#: includes/functions.php:1391 includes/functions.php:1400 +#: includes/functions.php:1401 includes/functions.php:1418 +#: includes/functions.php:1442 includes/functions.php:1443 +#: includes/functions.php:1456 includes/functions.php:1463 +#: includes/functions.php:1479 includes/functions.php:1502 +#: includes/functions.php:1507 includes/functions.php:1626 +#: includes/functions.php:1630 includes/functions.php:1697 +#: includes/functions.php:1703 includes/functions.php:1709 +#: includes/functions.php:2021 includes/functions.php:2025 +#: includes/functions.php:2028 includes/functions.php:2030 +#: includes/functions.php:2039 includes/functions.php:2040 +msgid "Please specify a level id." +msgstr "BItte geben Sie eine Paket ID an." + +#: includes/functions.php:1991 includes/functions.php:2046 +#: includes/functions.php:2047 +#, php-format +msgid "Level #%s not found." +msgstr "Paket Nummer%s nicht gefunden" + +#: includes/license.php:54 includes/license.php:51 adminpages/license.php:19 +msgid "Your license key has been validated." +msgstr "Ihr Lizenzschlüssel wurde bestätigt." + +#: includes/license.php:84 includes/license.php:81 adminpages/license.php:43 +#: adminpages/license.php:33 +msgid "Paid Memberships Pro Support License" +msgstr "Paid Memberships Pro Support Lizenz" + +#: includes/license.php:89 includes/license.php:86 +msgid "License Key" +msgstr "Lizenzschlüssel" + +#: includes/license.php:92 +msgid "Enter your support license key. Your license key can be found in your membership email receipt or in your Membership Account." +msgstr "Geben Sie Ihren Support-Lizenzschlüssel ein. Sie finden Ihren Lizenzschlüssel in Ihrer E-Mail-Bestätigung für die Mitgliedschaft oder in Ihrem Mitgliedskonto." + +#: includes/license.php:94 +msgid "Visit the PMPro Membership Account page to confirm that your account is active and to find your license key." +msgstr "Besuchen Sie die PMPro Mitgliedskonto Seite, um zu bestätigen, dass Ihr Konto aktiv ist und um Ihren Lizenzschlüssel zu finden." + +#: includes/license.php:94 includes/license.php:91 adminpages/dashboard.php:174 +#: adminpages/license.php:49 adminpages/dashboard.php:178 +#: adminpages/license.php:41 +msgid "Your license is invalid or expired." +msgstr "Ihre Lizenz ist ungültig oder abgelaufen." + +#: includes/license.php:96 includes/license.php:93 +#, php-format +msgid "

    Thank you! A valid %s license key has been used to activate your support license on this site.

    " +msgstr "

    Danke! Ein gültiger %s Lizenzschlüssel wurde verwenet um Ihre Supportlizenz auf dieser Seite zu aktivieren.

    " + +#: includes/license.php:103 includes/license.php:100 adminpages/license.php:59 +#: adminpages/license.php:51 +msgid "Enter license key here..." +msgstr "Lizenzschlüssel hier eingeben..." + +#: includes/license.php:105 includes/license.php:102 +msgid "Verify Key" +msgstr "Schlüssel bestätigen" + +#: includes/license.php:298 includes/license.php:273 includes/license.php:278 +#: includes/license.php:288 includes/license.php:291 +msgid "Invalid PMPro License Key." +msgstr "Ungültiger PMPro Lizenzschlüssel." + +#: includes/license.php:301 includes/license.php:273 includes/license.php:278 +#: includes/license.php:288 includes/license.php:291 +msgid "If you're running Paid Memberships Pro on a production website, we recommend an annual support license." +msgstr "Wenn Sie Paid Memberships Pro auf einer öffentlichen Webseite verwenden, empfehlen wir eine jährliche Supportlizenz." + +#: includes/license.php:302 includes/updates/upgrade_1_9_4.php:27 +#: includes/license.php:274 includes/license.php:279 includes/license.php:289 +#: includes/license.php:292 +msgid "Dismiss" +msgstr "Ablehnen" + +#: includes/license.php:302 includes/license.php:274 includes/license.php:279 +#: includes/license.php:289 includes/license.php:292 +msgid "More Info" +msgstr "Weitere Informationen" + +#: includes/localization.php:33 includes/localization.php:23 +#: includes/localization.php:26 includes/localization.php:36 +msgid "Day" +msgstr "Tag" + +#: includes/localization.php:35 includes/localization.php:25 +#: includes/localization.php:28 includes/localization.php:38 +msgid "Week" +msgstr "Woche" + +#: includes/localization.php:37 includes/localization.php:27 +#: includes/localization.php:30 includes/localization.php:40 +msgid "Month" +msgstr "Monat" + +#: includes/localization.php:39 includes/localization.php:29 +#: includes/localization.php:32 includes/localization.php:42 +msgid "Year" +msgstr "Jahr" + +#: includes/localization.php:44 includes/localization.php:37 +#: includes/localization.php:49 +msgid "Days" +msgstr "Tage" + +#: includes/localization.php:46 includes/localization.php:39 +#: includes/localization.php:51 +msgid "Weeks" +msgstr "Wochen" + +#: includes/localization.php:48 includes/localization.php:41 +#: includes/localization.php:53 +msgid "Months" +msgstr "Monate" + +#: includes/localization.php:50 includes/localization.php:43 +#: includes/localization.php:55 +msgid "Years" +msgstr "Jahre" + +#: includes/metaboxes.php:40 includes/metaboxes.php:38 +#: includes/metaboxes.php:39 +msgid "This post is already protected for this level because it is within a category that requires membership." +msgstr "Dieser Artikel ist für dieses Paket bereits geschützt, weil er in einer Kategorie liegt, die Mitgliedschaft erfordert." + +#: includes/metaboxes.php:105 includes/metaboxes.php:106 +#: includes/metaboxes.php:99 includes/metaboxes.php:100 +#: includes/metaboxes.php:104 includes/metaboxes.php:107 +#: includes/metaboxes.php:108 blocks/membership/block.js:89 +#: blocks/membership/block.js:101 js/blocks.build.js:1625 +#: js/blocks.build.js:1634 +msgid "Require Membership" +msgstr "Mitgliedschaft erforderlich" + +#: includes/metaboxes.php:136 includes/metaboxes.php:130 +#: includes/metaboxes.php:135 +msgid "Only members of these levels will be able to view posts in this category." +msgstr "Nur Mitglieder dieses Pakets werden in der Lage sein, diese Posts in dieser Kategorie zu sehen." + +#: includes/privacy.php:19 +msgid "Data Collected to Manage Your Membership" +msgstr "Erfasste Daten zur Verwaltung Ihrer Mitgliedschaft" + +#: includes/privacy.php:20 +msgid "At checkout, we will collect your name, email address, username, and password. This information is used to setup your account for our site. If you are redirected to an offsite payment gateway to complete your payment, we may store this information in a temporary session variable to setup your account when you return to our site." +msgstr "An der Kasse erfassen wir Ihren Namen, Ihre E-Mail-Adresse, Ihren Benutzernamen und Ihr Passwort. Diese Informationen werden verwendet, um Ihr Konto für unsere Website einzurichten. Wenn Sie zum Abschluss Ihrer Zahlung an ein externes Zahlungsgateway weitergeleitet werden, können wir diese Informationen in einer temporären Sitzungsvariablen speichern, um Ihr Konto einzurichten, wenn Sie zu unserer Website zurückkehren." + +#: includes/privacy.php:21 +msgid "At checkout, we may also collect your billing address and phone number. This information is used to confirm your credit card. The billing address and phone number are saved by our site to prepopulate the checkout form for future purchases and so we can get in touch with you if needed to discuss your order." +msgstr "An der Kasse können wir auch Ihre Rechnungsadresse und Telefonnummer erfragen. Diese Informationen werden verwendet, um Ihre Kreditkarte zu bestätigen. Die Rechnungsadresse und die Telefonnummer werden auf unserer Website gespeichert, um das Kassenformular für zukünftige Einkäufe auszufüllen und damit wir uns bei Bedarf mit Ihnen in Verbindung setzen können, um Ihre Bestellung zu besprechen." + +#: includes/privacy.php:22 +msgid "At checkout, we may also collect your credit card number, expiration date, and security code. This information is passed to our payment gateway to process your purchase. The last 4 digits of your credit card number and the expiration date are saved by our site to use for reference and to send you an email if your credit card will expire before the next recurring payment." +msgstr "An der Kasse können wir auch Ihre Kreditkartennummer, das Ablaufdatum und den Sicherheitscode erfassen. Diese Informationen werden an unser Zahlungs-Gateway weitergeleitet, um Ihren Einkauf zu bearbeiten. Die letzten 4 Ziffern Ihrer Kreditkartennummer und das Ablaufdatum werden von unserer Website gespeichert, um sie als Referenz zu verwenden und Ihnen eine E-Mail zu senden, wenn Ihre Kreditkarte vor der nächsten wiederkehrenden Zahlung abläuft." + +#: includes/privacy.php:23 +msgid "When logged in, we use cookies to track some of your activity on our site including logins, visits, and page views." +msgstr "Wenn Sie eingeloggt sind, verwenden wir Cookies, um einige Ihrer Aktivitäten auf unserer Website zu verfolgen, einschließlich Logins, Besuche und Seitenaufrufe." + +#: includes/privacy.php:35 includes/privacy.php:109 +msgid "Paid Memberships Pro Data" +msgstr "Paid Memberships Pro Daten" + +#: includes/privacy.php:81 +msgid "1 PMPro order was retained for business records." +msgstr "1 PMPro-Auftrag wurde für die Geschäftsunterlagen aufbewahrt." + +#: includes/privacy.php:83 +#, php-format +msgid "%d PMPro orders were retained for business records." +msgstr "%d PMPro-Aufträge wurden für Geschäftsunterlagen aufbewahrt." + +#: includes/privacy.php:88 +msgid "Please note that data erasure will not cancel a user's membership level or any active subscriptions. Please edit or delete the user through the WordPress dashboard." +msgstr "Bitte beachten Sie, dass durch das Löschen von Daten weder die Mitgliedschaft eines Benutzers noch aktive Abonnements gelöscht werden. Bitte bearbeiten oder löschen Sie den Benutzer über das WordPress-Dashboard." + +#: includes/privacy.php:160 +msgid "Paid Memberships Pro User Data" +msgstr "Paid Memberships Pro Benutzerdaten" + +#: includes/privacy.php:175 adminpages/memberslist.php:184 +#: adminpages/memberslist.php:212 adminpages/advancedsettings.php:316 +#: includes/profile.php:509 includes/profile.php:515 +msgid "Never" +msgstr "Nie" + +#: includes/privacy.php:182 includes/profile.php:425 includes/profile.php:493 +#: includes/profile.php:499 +msgid "Level ID" +msgstr "Paket-ID" + +#: includes/privacy.php:190 includes/profile.php:496 includes/profile.php:502 +msgid "Date Modified" +msgstr "Änderungsdatum" + +#: includes/privacy.php:194 includes/profile.php:497 includes/profile.php:503 +msgid "End Date" +msgstr "End-Datum" + +#: includes/privacy.php:198 includes/profile.php:498 includes/profile.php:504 +msgid "Level Cost" +msgstr "Paket-Preis" + +#: includes/privacy.php:209 +msgid "Paid Memberships Pro Membership History" +msgstr "Paid Memberships Pro Mitgliedschafts-Historie" + +#: includes/privacy.php:229 +msgid "Order ID" +msgstr "Bestell-ID" + +#: includes/privacy.php:233 +msgid "Order Code" +msgstr "Bestell-Code" + +#: includes/privacy.php:237 +msgid "Order Date" +msgstr "Bestelldatum" + +#: includes/privacy.php:241 pages/billing.php:41 pages/cancel.php:61 +#: pages/invoice.php:102 pages/levels.php:35 shortcodes/pmpro_account.php:44 +#: shortcodes/pmpro_account.php:128 pages/account.php:12 pages/account.php:18 +#: pages/account.php:92 pages/billing.php:16 pages/billing.php:25 +#: pages/billing.php:27 pages/billing.php:28 pages/billing.php:30 +#: pages/billing.php:44 pages/billing.php:45 pages/cancel.php:52 +#: pages/cancel.php:60 pages/invoice.php:89 pages/invoice.php:109 +#: pages/levels.php:13 shortcodes/pmpro_account.php:43 +#: shortcodes/pmpro_account.php:123 shortcodes/pmpro_account.php:125 +#: shortcodes/pmpro_account.php:126 adminpages/dashboard.php:220 +#: adminpages/dashboard.php:288 adminpages/orders.php:1337 +#: adminpages/reports/login.php:182 includes/profile.php:424 +#: includes/profile.php:494 pages/billing.php:70 pages/cancel.php:70 +#: pages/invoice.php:124 pages/levels.php:27 shortcodes/pmpro_account.php:42 +#: shortcodes/pmpro_account.php:224 blocks/checkout-button/inspector.js:39 +#: js/blocks.build.js:900 adminpages/dashboard.php:224 +#: adminpages/dashboard.php:292 adminpages/orders.php:1343 +#: includes/profile.php:500 +msgid "Level" +msgstr "Paket" + +#: includes/privacy.php:333 +msgid "Paid Memberships Pro Order History" +msgstr "Paid Memberships Pro Bestellverlauf" + +#: includes/privacy.php:354 +msgid "Billing First Name" +msgstr "Vorname" + +#: includes/privacy.php:355 +msgid "Billing Last Name" +msgstr "Name" + +#: includes/privacy.php:356 +msgid "Billing Address 1" +msgstr "Adresse 1" + +#: includes/privacy.php:357 +msgid "Billing Address 2" +msgstr "Adresse 2" + +#: includes/privacy.php:359 +msgid "Billing State/Province" +msgstr "Bundesland" + +#: includes/privacy.php:361 +msgid "Billing Phone Number" +msgstr "Telefon" + +#: includes/privacy.php:363 adminpages/emailtemplates.php:170 +msgid "Credit Card Type" +msgstr "Kartentyp" + +#: includes/privacy.php:364 +msgid "Credit Card Account Number" +msgstr "Kreditkartennummer" + +#: includes/privacy.php:365 +msgid "Credit Card Expiration Month" +msgstr "Ablaufdatum Monat" + +#: includes/privacy.php:366 +msgid "Credit Card Expiration Year" +msgstr "Ablaufdatum Jahr" + +#: includes/privacy.php:367 +msgid "Login Data" +msgstr "Login-Daten" + +#: includes/privacy.php:368 +msgid "Visits Data" +msgstr "Besuche" + +#: includes/privacy.php:369 +msgid "Views Data" +msgstr "Ansichten" + +#: includes/privacy.php:507 +#, php-format +msgid "%s agreed to %s (ID #%d, last modified %s) on %s." +msgstr "%s hat %s (ID Nummer%d, zuletzt modifiziert %s) am %s zugestimmt." + +#: includes/privacy.php:515 includes/privacy.php:520 +msgid "That post has since been updated." +msgstr "Dieser Eintrag wurde seither geändert." + +#: includes/profile.php:45 includes/profile.php:34 includes/profile.php:36 +#: includes/profile.php:39 includes/profile.php:31 +msgid "Current Level" +msgstr "Aktuelles Paket" + +#: includes/profile.php:74 includes/profile.php:221 includes/profile.php:268 +#: includes/profile.php:54 includes/profile.php:60 includes/profile.php:65 +#: includes/profile.php:68 includes/profile.php:195 includes/profile.php:242 +#: includes/profile.php:208 includes/profile.php:255 +msgid "Not paying." +msgstr "Nicht bezahlen." + +#: includes/profile.php:82 includes/profile.php:64 includes/profile.php:68 +#: includes/profile.php:73 includes/profile.php:76 +msgid "This will not change the subscription at the gateway unless the 'Cancel' checkbox is selected below." +msgstr "Dadurch wird das Abonnement am Gateway nicht geändert, es sei denn, das Kontrollkästchen „Abbrechen“ wird unten aktiviert." + +#: includes/profile.php:156 includes/profile.php:138 +msgid "Send the user an email about this change." +msgstr "Senden Sie dem Benutzer eine E-Mail über diese Änderung." + +#: includes/profile.php:162 includes/profile.php:144 +msgid "Cancel this user's subscription at the gateway." +msgstr "Das Abonnement dieses Benutzers am Gateway kündigen." + +#: includes/profile.php:176 includes/profile.php:158 +msgid "TOS Consent History" +msgstr "Verlauf der Kartenprüfnummern-Zustimmung" + +#: includes/updates.php:110 includes/updates.php:97 includes/updates.php:109 +msgid "Paid Memberships Pro Data Update Required" +msgstr "Paid Memberships Pro Daten-Update benötigt" + +#: includes/updates.php:111 includes/updates.php:110 +#, php-format +msgid "(1) Backup your WordPress database and then (2) click here to start the update." +msgstr "(1) Sichern Sie Ihre WordPress Datenbank und dann (2) klicken Sie hier um die Aktualisierung zu starten." + +#: includes/updates.php:132 includes/updates.php:123 includes/updates.php:136 +#: includes/updates.php:130 +msgid "All Paid Memberships Pro updates have finished." +msgstr "Alle Paid Memberships Pro Aktualisierungen wurden abgeschlossen." + +#: includes/updates/upgrade_1.php:7 includes/upgradecheck.php:401 +#: includes/upgradecheck.php:410 includes/upgradecheck.php:422 +#: includes/upgradecheck.php:442 includes/upgradecheck.php:542 +#: includes/upgradecheck.php:561 includes/upgradecheck.php:563 +#, php-format +msgid "This content is for !!levels!! members only.
    Register" +msgstr "Dieser Inhalt ist nur für !!levels!! Mitglieder.
    Hier registrieren" + +#: includes/updates/upgrade_1.php:10 includes/upgradecheck.php:404 +#: includes/upgradecheck.php:413 includes/upgradecheck.php:425 +#: includes/upgradecheck.php:445 includes/upgradecheck.php:545 +#: includes/upgradecheck.php:564 includes/upgradecheck.php:566 +#, php-format +msgid "This content is for !!levels!! members only.
    Log In Register" +msgstr "Dieser Inhalt ist nur für !!levels!! Mitglieder abrufbar.
    Einloggen Registrieren" + +#: includes/updates/upgrade_1.php:14 includes/upgradecheck.php:408 +#: includes/upgradecheck.php:417 includes/upgradecheck.php:429 +#: includes/upgradecheck.php:449 includes/upgradecheck.php:549 +#: includes/upgradecheck.php:568 includes/upgradecheck.php:570 +msgid "This content is for !!levels!! members only. Visit the site and log in/register to read." +msgstr "Diese Inhalte sind nur für !!levels!! Mitglieder sichtbar. Bitte melden Sie sich an oder registrieren Sie sich, um die Inhalte zu sehen." + +#: includes/updates/upgrade_1_9_4.php:26 +msgid "We have detected that you are using a custom checkout page template for Paid Memberships Pro. This was recently changed and may need to be updated in order to display correctly." +msgstr "Wir haben festgestellt, dass Sie eine benutzerdefinierte Kassenseitenvorlage für Paid Memberships Pro verwenden. Diese wurde vor kurzem geändert und muss möglicherweise aktualisiert werden, um korrekt angezeigt zu werden." + +#: includes/updates/upgrade_1_9_4.php:27 +msgid "If you notice UI issues after upgrading, see this free add on to temporarily roll back to the table-based layout while you resolve the issues." +msgstr "Wenn Sie nach dem Upgrade Probleme mit der Benutzeroberfläche feststellen, sehen Sie sich dieses kostenlose Add-on an, um vorübergehend zum tabellenbasierten Layout zurückzukehren, während Sie die Probleme beheben." + +#: pages/billing.php:23 pages/billing.php:14 pages/billing.php:25 +#: pages/billing.php:26 pages/billing.php:27 pages/billing.php:28 +#: pages/billing.php:46 +#, php-format +msgid "Logged in as %s." +msgstr "Eingeloggt als %s." + +#: pages/billing.php:23 pages/billing.php:14 pages/billing.php:25 +#: pages/billing.php:26 pages/billing.php:27 pages/billing.php:28 +#: pages/billing.php:46 +msgid "logout" +msgstr "Ausloggen" + +#: pages/billing.php:43 pages/account.php:14 pages/billing.php:18 +#: pages/billing.php:27 pages/billing.php:29 pages/billing.php:30 +#: pages/billing.php:32 pages/billing.php:46 pages/billing.php:47 +#: pages/billing.php:72 +msgid "Membership Fee" +msgstr "Gebühr" + +#: pages/billing.php:47 pages/account.php:18 pages/billing.php:22 +#: pages/billing.php:31 pages/billing.php:33 pages/billing.php:34 +#: pages/billing.php:36 pages/billing.php:50 pages/billing.php:51 +#: pages/levels.php:70 pages/billing.php:76 +#, php-format +msgid "%s every %d %s." +msgstr "%s jede(n) %d %s." + +#: pages/billing.php:49 pages/account.php:20 pages/billing.php:24 +#: pages/billing.php:33 pages/billing.php:35 pages/billing.php:36 +#: pages/billing.php:38 pages/billing.php:52 pages/billing.php:53 +#: pages/levels.php:66 pages/billing.php:78 +#, php-format +msgid "%s per %s." +msgstr "%s pro %s." + +#: pages/billing.php:59 pages/account.php:25 pages/account.php:29 +#: pages/billing.php:29 pages/billing.php:33 pages/billing.php:42 +#: pages/billing.php:44 pages/billing.php:45 pages/billing.php:47 +#: pages/billing.php:62 pages/billing.php:63 pages/billing.php:89 +msgid "Duration" +msgstr "Zeitraum" + +#: pages/billing.php:77 pages/billing.php:39 pages/billing.php:43 +#: pages/billing.php:52 pages/billing.php:54 pages/billing.php:55 +#: pages/billing.php:57 pages/billing.php:80 pages/billing.php:81 +#: pages/billing.php:128 +msgid "Your payment subscription is managed by PayPal. Please login to PayPal here to update your billing information." +msgstr "Ihre Zahlungen werden von PayPal abgewickelt. Sie können sich hier bei PayPal einloggen um Ihre Zahlungsinformationen zu aktualisieren." + +#: pages/billing.php:104 pages/checkout.php:279 pages/billing.php:65 +#: pages/billing.php:69 pages/billing.php:78 pages/billing.php:81 +#: pages/billing.php:83 pages/billing.php:84 pages/billing.php:87 +#: pages/billing.php:107 pages/billing.php:108 pages/billing.php:110 +#: pages/checkout.php:305 pages/checkout.php:307 pages/checkout.php:309 +#: pages/checkout.php:318 pages/checkout.php:321 pages/checkout.php:324 +#: pages/checkout.php:326 pages/checkout.php:328 pages/checkout.php:333 +#: pages/checkout.php:336 includes/profile.php:747 pages/billing.php:164 +#: pages/checkout.php:234 includes/profile.php:759 +msgid "First Name" +msgstr "Vorname" + +#: pages/billing.php:108 pages/checkout.php:283 pages/billing.php:69 +#: pages/billing.php:73 pages/billing.php:82 pages/billing.php:85 +#: pages/billing.php:87 pages/billing.php:88 pages/billing.php:91 +#: pages/billing.php:111 pages/billing.php:112 pages/billing.php:114 +#: pages/checkout.php:309 pages/checkout.php:311 pages/checkout.php:313 +#: pages/checkout.php:322 pages/checkout.php:325 pages/checkout.php:328 +#: pages/checkout.php:330 pages/checkout.php:332 pages/checkout.php:337 +#: pages/checkout.php:340 includes/profile.php:748 pages/billing.php:168 +#: pages/checkout.php:238 includes/profile.php:760 +msgid "Last Name" +msgstr "Nachname" + +#: pages/billing.php:112 pages/checkout.php:287 pages/billing.php:73 +#: pages/billing.php:77 pages/billing.php:86 pages/billing.php:89 +#: pages/billing.php:91 pages/billing.php:92 pages/billing.php:95 +#: pages/billing.php:115 pages/billing.php:116 pages/billing.php:118 +#: pages/checkout.php:313 pages/checkout.php:315 pages/checkout.php:317 +#: pages/checkout.php:326 pages/checkout.php:329 pages/checkout.php:332 +#: pages/checkout.php:334 pages/checkout.php:336 pages/checkout.php:341 +#: pages/checkout.php:344 pages/billing.php:174 pages/checkout.php:242 +msgid "Address 1" +msgstr "Adresse 1" + +#: pages/billing.php:116 pages/checkout.php:291 pages/billing.php:77 +#: pages/billing.php:81 pages/billing.php:90 pages/billing.php:93 +#: pages/billing.php:95 pages/billing.php:96 pages/billing.php:99 +#: pages/billing.php:119 pages/billing.php:120 pages/billing.php:122 +#: pages/checkout.php:317 pages/checkout.php:319 pages/checkout.php:321 +#: pages/checkout.php:330 pages/checkout.php:333 pages/checkout.php:336 +#: pages/checkout.php:338 pages/checkout.php:340 pages/checkout.php:345 +#: pages/checkout.php:348 pages/billing.php:178 pages/checkout.php:246 +msgid "Address 2" +msgstr "Adresse 2" + +#: pages/billing.php:126 pages/checkout.php:298 pages/billing.php:87 +#: pages/billing.php:91 pages/billing.php:100 pages/billing.php:103 +#: pages/billing.php:105 pages/billing.php:106 pages/billing.php:109 +#: pages/billing.php:129 pages/billing.php:130 pages/billing.php:132 +#: pages/checkout.php:327 pages/checkout.php:329 pages/checkout.php:331 +#: pages/checkout.php:340 pages/checkout.php:343 pages/checkout.php:346 +#: pages/checkout.php:348 pages/checkout.php:350 pages/checkout.php:355 +#: pages/checkout.php:358 pages/billing.php:188 pages/checkout.php:253 +msgid "City" +msgstr "Ort" + +#: pages/billing.php:130 pages/checkout.php:302 pages/billing.php:91 +#: pages/billing.php:95 pages/billing.php:104 pages/billing.php:107 +#: pages/billing.php:109 pages/billing.php:110 pages/billing.php:113 +#: pages/billing.php:133 pages/billing.php:134 pages/billing.php:136 +#: pages/checkout.php:331 pages/checkout.php:333 pages/checkout.php:335 +#: pages/checkout.php:344 pages/checkout.php:347 pages/checkout.php:350 +#: pages/checkout.php:352 pages/checkout.php:354 pages/checkout.php:359 +#: pages/checkout.php:362 pages/billing.php:192 pages/checkout.php:257 +msgid "State" +msgstr "Bundesland" + +#: pages/billing.php:134 pages/checkout.php:306 pages/billing.php:95 +#: pages/billing.php:99 pages/billing.php:108 pages/billing.php:111 +#: pages/billing.php:113 pages/billing.php:114 pages/billing.php:117 +#: pages/billing.php:137 pages/billing.php:138 pages/billing.php:140 +#: pages/checkout.php:335 pages/checkout.php:337 pages/checkout.php:339 +#: pages/checkout.php:348 pages/checkout.php:351 pages/checkout.php:354 +#: pages/checkout.php:356 pages/checkout.php:358 pages/checkout.php:363 +#: pages/checkout.php:366 pages/billing.php:196 pages/checkout.php:261 +msgid "Postal Code" +msgstr "Postleitzahl" + +#: pages/billing.php:143 pages/checkout.php:311 pages/billing.php:104 +#: pages/billing.php:108 pages/billing.php:117 pages/billing.php:120 +#: pages/billing.php:122 pages/billing.php:123 pages/billing.php:126 +#: pages/billing.php:146 pages/billing.php:147 pages/billing.php:149 +#: pages/checkout.php:344 pages/checkout.php:346 pages/checkout.php:348 +#: pages/checkout.php:357 pages/checkout.php:360 pages/checkout.php:363 +#: pages/checkout.php:365 pages/checkout.php:367 pages/checkout.php:372 +#: pages/checkout.php:375 pages/billing.php:205 pages/checkout.php:266 +msgid "City, State Zip" +msgstr "Ort, Bundesland" + +#: pages/billing.php:196 pages/checkout.php:348 pages/billing.php:157 +#: pages/billing.php:161 pages/billing.php:170 pages/billing.php:173 +#: pages/billing.php:175 pages/billing.php:176 pages/billing.php:179 +#: pages/billing.php:199 pages/billing.php:200 pages/billing.php:202 +#: pages/checkout.php:397 pages/checkout.php:399 pages/checkout.php:401 +#: pages/checkout.php:410 pages/checkout.php:413 pages/checkout.php:416 +#: pages/checkout.php:418 pages/checkout.php:420 pages/checkout.php:425 +#: pages/checkout.php:428 pages/billing.php:258 pages/checkout.php:303 +msgid "Country" +msgstr "Land" + +#: pages/billing.php:221 pages/checkout.php:364 pages/billing.php:182 +#: pages/billing.php:186 pages/billing.php:195 pages/billing.php:198 +#: pages/billing.php:200 pages/billing.php:201 pages/billing.php:204 +#: pages/billing.php:224 pages/billing.php:225 pages/billing.php:227 +#: pages/checkout.php:422 pages/checkout.php:424 pages/checkout.php:426 +#: pages/checkout.php:435 pages/checkout.php:438 pages/checkout.php:441 +#: pages/checkout.php:443 pages/checkout.php:445 pages/checkout.php:450 +#: pages/checkout.php:453 pages/billing.php:283 pages/checkout.php:319 +msgid "Phone" +msgstr "Telefon" + +#: pages/billing.php:232 pages/checkout.php:197 pages/checkout.php:379 +#: pages/billing.php:193 pages/billing.php:197 pages/billing.php:206 +#: pages/billing.php:209 pages/billing.php:211 pages/billing.php:212 +#: pages/billing.php:215 pages/billing.php:235 pages/billing.php:236 +#: pages/billing.php:238 pages/checkout.php:204 pages/checkout.php:207 +#: pages/checkout.php:209 pages/checkout.php:216 pages/checkout.php:218 +#: pages/checkout.php:220 pages/checkout.php:227 pages/checkout.php:230 +#: pages/checkout.php:436 pages/checkout.php:438 pages/checkout.php:440 +#: pages/checkout.php:449 pages/checkout.php:453 pages/checkout.php:455 +#: pages/checkout.php:457 pages/checkout.php:460 pages/checkout.php:464 +#: pages/checkout.php:467 pages/billing.php:294 pages/checkout.php:164 +#: pages/checkout.php:334 +msgid "Email Address" +msgstr "E-Mail Adresse" + +#: pages/billing.php:236 pages/checkout.php:386 pages/billing.php:197 +#: pages/billing.php:201 pages/billing.php:210 pages/billing.php:213 +#: pages/billing.php:215 pages/billing.php:216 pages/billing.php:219 +#: pages/billing.php:239 pages/billing.php:240 pages/billing.php:242 +#: pages/checkout.php:445 pages/checkout.php:447 pages/checkout.php:449 +#: pages/checkout.php:458 pages/checkout.php:462 pages/checkout.php:464 +#: pages/checkout.php:466 pages/checkout.php:469 pages/checkout.php:473 +#: pages/checkout.php:476 pages/billing.php:298 pages/checkout.php:341 +msgid "Confirm Email" +msgstr "E-Mail bestätigen" + +#: pages/billing.php:259 pages/billing.php:217 pages/billing.php:221 +#: pages/billing.php:230 pages/billing.php:231 pages/billing.php:234 +#: pages/billing.php:238 pages/billing.php:244 pages/billing.php:247 +#: pages/billing.php:262 pages/billing.php:263 pages/billing.php:270 +#: pages/billing.php:321 +msgid "Credit Card Information" +msgstr "Kreditkarten Informationen" + +#: pages/billing.php:260 pages/billing.php:217 pages/billing.php:221 +#: pages/billing.php:230 pages/billing.php:232 pages/billing.php:235 +#: pages/billing.php:239 pages/billing.php:245 pages/billing.php:248 +#: pages/billing.php:263 pages/billing.php:264 pages/billing.php:271 +#: pages/billing.php:322 +#, php-format +msgid "We accept %s" +msgstr "Wir aktzeptieren %s" + +#: pages/billing.php:378 pages/billing.php:309 pages/billing.php:313 +#: pages/billing.php:344 pages/billing.php:353 pages/billing.php:356 +#: pages/billing.php:360 pages/billing.php:364 pages/billing.php:380 +#: pages/billing.php:381 pages/billing.php:385 pages/billing.php:387 +#: pages/billing.php:408 pages/billing.php:413 pages/billing.php:417 +#: pages/billing.php:422 pages/billing.php:467 +msgid "This subscription is not recurring. So you don't need to update your billing information." +msgstr "Keine weiteren Zahlungen erforderlich. Ihre Zahlungsinformationen müssen daher nicht aktualisiert werden." + +#: pages/cancel.php:34 pages/cancel.php:14 pages/cancel.php:26 +#: pages/cancel.php:33 pages/cancel.php:44 +msgid "Are you sure you want to cancel your membership?" +msgstr "Sind Sie sicher, dass Sie Ihren Konto löschen wollen?" + +#: pages/cancel.php:41 pages/cancel.php:32 pages/cancel.php:40 +#: pages/cancel.php:51 +#, php-format +msgid "Are you sure you want to cancel your %s membership?" +msgid_plural "Are you sure you want to cancel your %s memberships?" +msgstr[0] "Sind Sie sicher, dass Sie Ihre Mitgliedschaft bei %s kündigen möchten?" +msgstr[1] "Sind Sie sicher, dass Sie Ihre Mitgliedschaften bei %s kündigen möchten?" + +#: pages/cancel.php:46 pages/cancel.php:45 pages/cancel.php:56 +msgid "Yes, cancel this membership" +msgstr "Ja, Mitgliedschaft kündigen" + +#: pages/cancel.php:47 pages/cancel.php:46 pages/cancel.php:57 +msgid "No, keep this membership" +msgstr "Nein, diese Mitgliedschaft behalten." + +#: pages/cancel.php:57 shortcodes/pmpro_account.php:40 pages/account.php:14 +#: pages/cancel.php:48 pages/cancel.php:56 shortcodes/pmpro_account.php:39 +#: pages/cancel.php:66 shortcodes/pmpro_account.php:38 +msgid "My Memberships" +msgstr "Meine Mitgliedschaften" + +#: pages/cancel.php:93 pages/cancel.php:77 pages/cancel.php:92 +#: pages/cancel.php:105 +msgid "Cancel All Memberships" +msgstr "Alle Mitgliedschaften kündigen" + +#: pages/cancel.php:102 pages/cancel.php:22 pages/cancel.php:86 +#: pages/cancel.php:101 pages/cancel.php:114 +msgid "Click here to go to the home page." +msgstr "Klicken Sie hier, um zur Startseite zu gelangen." + +#: pages/checkout.php:30 pages/checkout.php:26 pages/checkout.php:27 +#: pages/checkout.php:28 pages/checkout.php:35 pages/checkout.php:38 +#: pages/checkout.php:54 +msgid "Almost done. Review the membership information and pricing below then click the \"Complete Payment\" button to finish your order." +msgstr "Fast fertig. Kontrollieren Sie bitte die untenstehenden Informationen und klicken Sie auf \"Zahlung abschließen\" um Ihre Bestellung abzuschließen." + +#: pages/checkout.php:35 pages/checkout.php:33 pages/checkout.php:34 +#: pages/checkout.php:42 pages/checkout.php:43 pages/checkout.php:46 +#: pages/checkout.php:64 +msgid "change" +msgstr "ändern" + +#: pages/checkout.php:39 pages/checkout.php:41 pages/checkout.php:42 +#: pages/checkout.php:43 pages/checkout.php:50 pages/checkout.php:51 +#: pages/checkout.php:54 pages/checkout.php:68 +#, php-format +msgid "You have selected the %s membership level." +msgstr "Sie haben das Paket %s gewählt." + +#: pages/checkout.php:56 pages/checkout.php:51 pages/checkout.php:53 +#: pages/checkout.php:60 pages/checkout.php:61 pages/checkout.php:68 +#: pages/checkout.php:71 +#, php-format +msgid "

    The %s code has been applied to your order.

    " +msgstr "

    Der %s Code wurde für Ihre Bestellung übernommen.

    " + +#: pages/checkout.php:66 services/applydiscountcode.php:92 +#: pages/checkout.php:62 pages/checkout.php:63 pages/checkout.php:64 +#: pages/checkout.php:71 pages/checkout.php:72 pages/checkout.php:79 +#: pages/checkout.php:82 services/applydiscountcode.php:74 +#: services/applydiscountcode.php:75 services/applydiscountcode.php:78 +#: services/applydiscountcode.php:89 services/applydiscountcode.php:127 +msgid "Click here to change your discount code" +msgstr "Klicken Sie hier, um Ihren Gutscheincode ändern" + +#: pages/checkout.php:68 pages/checkout.php:64 pages/checkout.php:65 +#: pages/checkout.php:66 pages/checkout.php:73 pages/checkout.php:74 +#: pages/checkout.php:81 pages/checkout.php:84 pages/checkout.php:97 +msgid "Click here to enter your discount code" +msgstr "Klicken Sie hier, um Ihren Gutscheincode einzugeben" + +#: pages/checkout.php:68 pages/checkout.php:64 pages/checkout.php:65 +#: pages/checkout.php:66 pages/checkout.php:73 pages/checkout.php:74 +#: pages/checkout.php:81 pages/checkout.php:84 pages/checkout.php:97 +msgid "Do you have a discount code?" +msgstr "Haben Sie einen Gutscheincode?" + +#: pages/checkout.php:162 pages/checkout.php:160 pages/checkout.php:163 +#: pages/checkout.php:165 pages/checkout.php:172 pages/checkout.php:173 +#: pages/checkout.php:175 pages/checkout.php:182 pages/checkout.php:185 +#: pages/checkout.php:129 +msgid "Account Information" +msgstr "Konto Informationen" + +#: pages/checkout.php:163 pages/checkout.php:160 pages/checkout.php:165 +#: pages/checkout.php:172 pages/checkout.php:174 pages/checkout.php:176 +#: pages/checkout.php:183 pages/checkout.php:186 pages/checkout.php:130 +msgid "Already have an account?" +msgstr "Sie haben schon einen Konto?" + +#: pages/checkout.php:163 pages/checkout.php:160 pages/checkout.php:165 +#: pages/checkout.php:172 pages/checkout.php:174 pages/checkout.php:176 +#: pages/checkout.php:183 pages/checkout.php:186 pages/checkout.php:130 +msgid "Log in here" +msgstr "Hier einloggen" + +#: pages/checkout.php:184 pages/checkout.php:186 pages/checkout.php:189 +#: pages/checkout.php:191 pages/checkout.php:198 pages/checkout.php:200 +#: pages/checkout.php:202 pages/checkout.php:209 pages/checkout.php:212 +#: pages/checkout.php:151 +msgid "Confirm Password" +msgstr "Passwort bestätigen" + +#: pages/checkout.php:205 pages/checkout.php:213 pages/checkout.php:216 +#: pages/checkout.php:218 pages/checkout.php:225 pages/checkout.php:227 +#: pages/checkout.php:229 pages/checkout.php:236 pages/checkout.php:239 +#: pages/checkout.php:172 +msgid "Confirm Email Address" +msgstr "E-Mail Adresse bestätigen" + +#: pages/checkout.php:218 pages/checkout.php:232 pages/checkout.php:235 +#: pages/checkout.php:237 pages/checkout.php:244 pages/checkout.php:246 +#: pages/checkout.php:248 pages/checkout.php:255 pages/checkout.php:258 +#: pages/checkout.php:185 +msgid "Full Name" +msgstr "Vollständiger Name" + +#: pages/checkout.php:219 pages/checkout.php:233 pages/checkout.php:236 +#: pages/checkout.php:238 pages/checkout.php:245 pages/checkout.php:247 +#: pages/checkout.php:249 pages/checkout.php:256 pages/checkout.php:259 +#: pages/checkout.php:186 +msgid "LEAVE THIS BLANK" +msgstr "DIESES FELD LEER LASSEN" + +#: pages/checkout.php:238 pages/checkout.php:257 pages/checkout.php:260 +#: pages/checkout.php:262 pages/checkout.php:269 pages/checkout.php:271 +#: pages/checkout.php:273 pages/checkout.php:280 pages/checkout.php:283 +#: pages/checkout.php:193 +#, php-format +msgid "You are logged in as %s. If you would like to use a different account for this membership, log out now." +msgstr "Sie sind eingeloggt als %s. Wenn Sie für diese Mitgliedschaft einen anderen Konto verwenden wollen, ausloggen." + +#: pages/checkout.php:254 pages/checkout.php:276 pages/checkout.php:278 +#: pages/checkout.php:285 pages/checkout.php:287 pages/checkout.php:289 +#: pages/checkout.php:292 pages/checkout.php:296 pages/checkout.php:299 +#: pages/checkout.php:209 +msgid "Choose your Payment Method" +msgstr "Wählen Sie Ihre Zahlungsmethode" + +#: pages/checkout.php:259 pages/checkout.php:284 pages/checkout.php:286 +#: pages/checkout.php:293 pages/checkout.php:296 pages/checkout.php:298 +#: pages/checkout.php:300 pages/checkout.php:305 pages/checkout.php:307 +#: pages/checkout.php:308 pages/checkout.php:214 +msgid "Check Out with a Credit Card Here" +msgstr "Mit Kreditkarte bezahlen" + +#: pages/checkout.php:567 pages/checkout.php:277 pages/checkout.php:284 +#: pages/checkout.php:657 pages/checkout.php:672 pages/checkout.php:673 +#: pages/checkout.php:681 pages/checkout.php:686 pages/checkout.php:690 +#: pages/checkout.php:692 pages/checkout.php:693 pages/checkout.php:696 +#: pages/checkout.php:697 pages/checkout.php:476 +#, php-format +msgid "I agree to the %s" +msgstr "Ich stimme der %s zu" + +#: pages/checkout.php:586 pages/checkout.php:667 pages/checkout.php:674 +#: pages/checkout.php:677 pages/checkout.php:692 pages/checkout.php:693 +#: pages/checkout.php:701 pages/checkout.php:706 pages/checkout.php:710 +#: pages/checkout.php:712 pages/checkout.php:713 pages/checkout.php:716 +#: pages/checkout.php:717 pages/checkout.php:514 +msgid "Complete Payment" +msgstr "Zahlung abschließen" + +#: pages/checkout.php:608 pages/checkout.php:687 pages/checkout.php:694 +#: pages/checkout.php:697 pages/checkout.php:713 pages/checkout.php:714 +#: pages/checkout.php:723 pages/checkout.php:728 pages/checkout.php:732 +#: pages/checkout.php:734 pages/checkout.php:735 pages/checkout.php:738 +#: pages/checkout.php:739 pages/checkout.php:536 +msgid "Processing..." +msgstr "wird bearbeitet..." + +#: pages/confirmation.php:12 pages/confirmation.php:25 +msgid "Your payment has been submitted. Your membership will be activated shortly." +msgstr "Ihre Zahlung wurde übermittelt. Ihre Mitgliedschaft wird in Kürze aktiviert." + +#: pages/confirmation.php:14 pages/confirmation.php:27 +#, php-format +msgid "Thank you for your membership to %s. Your %s membership is now active." +msgstr "Vielen Dank für Ihre Anmeldung bei %s. Ihr Paket %s ist nun aktiv." + +#: pages/confirmation.php:28 pages/confirmation.php:41 +#, php-format +msgid "Below are details about your membership account and a receipt for your initial membership invoice. A welcome email with a copy of your initial membership invoice has been sent to %s." +msgstr "Untenstehend finden Sie Informationen zu Ihrem Konto und eine Rechnung für Ihre Zahlung. Eine Willkommens-email wurde an %s gesendet." + +#: pages/confirmation.php:47 pages/invoice.php:22 pages/confirmation.php:41 +#: pages/confirmation.php:59 pages/invoice.php:33 +#, php-format +msgid "Invoice #%s on %s" +msgstr "Rechnungs-Nr. %s vom %s" + +#: pages/confirmation.php:49 pages/invoice.php:24 pages/confirmation.php:43 +#: adminpages/orders.php:384 adminpages/orders.php:1377 +#: includes/profile.php:446 pages/confirmation.php:61 pages/invoice.php:34 +#: adminpages/orders.php:390 adminpages/orders.php:1431 +#: adminpages/orders.php:1441 +msgid "Print" +msgstr "Drucken" + +#: pages/confirmation.php:52 pages/confirmation.php:123 pages/invoice.php:27 +#: pages/confirmation.php:45 pages/confirmation.php:46 +#: pages/confirmation.php:102 pages/confirmation.php:104 +#: pages/confirmation.php:112 pages/confirmation.php:115 pages/invoice.php:26 +#: pages/confirmation.php:64 pages/confirmation.php:137 pages/invoice.php:37 +msgid "Account" +msgstr "Konto" + +#: pages/confirmation.php:55 pages/invoice.php:30 pages/account.php:29 +#: pages/account.php:33 pages/confirmation.php:48 pages/confirmation.php:49 +#: pages/invoice.php:29 pages/confirmation.php:67 +msgid "Membership Expires" +msgstr "Zugang endet am" + +#: pages/confirmation.php:79 pages/invoice.php:61 pages/account.php:105 +#: pages/account.php:109 pages/confirmation.php:61 pages/confirmation.php:63 +#: pages/confirmation.php:69 pages/confirmation.php:82 pages/invoice.php:48 +#: pages/invoice.php:50 pages/billing.php:96 pages/confirmation.php:95 +#: pages/invoice.php:85 +msgid "Payment Method" +msgstr "Zahlungsmethode" + +#: pages/confirmation.php:80 pages/invoice.php:62 pages/confirmation.php:82 +#: pages/confirmation.php:83 pages/confirmation.php:88 pages/invoice.php:67 +#: pages/invoice.php:69 pages/billing.php:98 pages/confirmation.php:97 +#: pages/invoice.php:87 +msgid "ending in" +msgstr "endet: " + +#: pages/confirmation.php:88 pages/invoice.php:70 pages/invoice.php:103 +#: pages/confirmation.php:61 pages/confirmation.php:63 +#: pages/confirmation.php:65 pages/confirmation.php:71 pages/invoice.php:50 +#: pages/invoice.php:52 pages/invoice.php:90 pages/invoice.php:107 +#: pages/invoice.php:109 pages/invoice.php:110 includes/profile.php:426 +#: pages/confirmation.php:107 pages/invoice.php:97 pages/invoice.php:125 +msgid "Total Billed" +msgstr "Summe" + +#: pages/confirmation.php:94 pages/invoice.php:76 pages/invoice.php:80 +#: pages/invoice.php:82 includes/functions.php:2857 +msgid "Coupon" +msgstr "Gutschein" + +#: pages/confirmation.php:111 pages/confirmation.php:97 +#: pages/confirmation.php:100 pages/confirmation.php:103 +#: pages/confirmation.php:125 +#, php-format +msgid "Below are details about your membership account. A welcome email has been sent to %s." +msgstr "Unten finden Sie Details zu Ihrem Mitgliedskonto. Eine Wilkommens-E-Mail wurde an %s gesendet." + +#: pages/confirmation.php:124 pages/confirmation.php:103 +#: pages/confirmation.php:105 pages/confirmation.php:113 +#: pages/confirmation.php:116 pages/confirmation.php:138 +#: shortcodes/pmpro_account.php:247 +msgid "Pending" +msgstr "Ausstehend" + +#: pages/confirmation.php:132 pages/invoice.php:134 pages/confirmation.php:111 +#: pages/confirmation.php:113 pages/confirmation.php:121 +#: pages/confirmation.php:124 pages/invoice.php:121 pages/invoice.php:139 +#: pages/invoice.php:141 pages/billing.php:125 pages/billing.php:131 +#: pages/confirmation.php:149 pages/invoice.php:155 +msgid "View Your Membership Account →" +msgstr "Ihr Mitgliedskonto anzeigen →" + +#: pages/confirmation.php:134 pages/confirmation.php:113 +#: pages/confirmation.php:115 pages/confirmation.php:123 +#: pages/confirmation.php:126 pages/confirmation.php:151 +msgid "If your account is not activated within a few minutes, please contact the site owner." +msgstr "Wenn Ihr Konto nicht innerhalb der nächsten Minuten aktiviert wird, kontaktieren Sie bitte den Betreiber der Seite." + +#: pages/invoice.php:101 pages/invoice.php:88 pages/invoice.php:106 +#: pages/invoice.php:108 pages/invoice.php:123 +msgid "Invoice #" +msgstr "Rechnungs-Nr." + +#: pages/invoice.php:127 pages/invoice.php:114 pages/invoice.php:132 +#: pages/invoice.php:134 pages/invoice.php:149 +msgid "No invoices found." +msgstr "Keine Rechnungen gefunden." + +#: pages/invoice.php:138 pages/invoice.php:125 pages/invoice.php:143 +#: pages/invoice.php:145 pages/invoice.php:157 +msgid "← View All Invoices" +msgstr "← alle Rechnungen anzeigen" + +#: pages/levels.php:55 pages/levels.php:33 pages/levels.php:43 +#: includes/functions.php:396 +msgid "Free" +msgstr "Kostenlos" + +#: pages/levels.php:69 pages/levels.php:71 pages/levels.php:47 +#: pages/levels.php:49 pages/levels.php:113 pages/levels.php:115 +#: pages/levels.php:58 +msgid "Select" +msgstr "Auswählen" + +#: pages/levels.php:78 shortcodes/pmpro_account.php:60 pages/account.php:33 +#: pages/levels.php:57 pages/levels.php:123 shortcodes/pmpro_account.php:59 +#: shortcodes/pmpro_account.php:61 pages/levels.php:64 +#: shortcodes/pmpro_account.php:94 +msgid "Renew" +msgstr "Erneuern" + +#: pages/levels.php:82 pages/levels.php:63 pages/levels.php:117 +#: pages/levels.php:129 pages/levels.php:68 +msgid "Your Level" +msgstr "Ihr Paket" + +#: pages/levels.php:98 pages/levels.php:79 pages/levels.php:129 +#: pages/levels.php:145 pages/levels.php:82 +msgid "← Return to Your Account" +msgstr "← zurück zu Ihrem Konto" + +#: pages/levels.php:100 pages/levels.php:81 pages/levels.php:131 +#: pages/levels.php:147 pages/levels.php:84 +msgid "← Return to Home" +msgstr "← zurück zur Startseite" + +#: paid-memberships-pro.php:129 adminpages/orders.php:398 +#: adminpages/orders.php:448 paid-memberships-pro.php:115 +#: paid-memberships-pro.php:116 paid-memberships-pro.php:123 +#: paid-memberships-pro.php:124 paid-memberships-pro.php:125 +#: paid-memberships-pro.php:126 paid-memberships-pro.php:127 +#: paid-memberships-pro.php:128 paid-memberships-pro.php:135 +#: paid-memberships-pro.php:157 paid-memberships-pro.php:159 +msgid "Testing Only" +msgstr "Nur Test" + +#: paid-memberships-pro.php:134 paid-memberships-pro.php:120 +#: paid-memberships-pro.php:121 paid-memberships-pro.php:128 +#: paid-memberships-pro.php:129 paid-memberships-pro.php:130 +#: paid-memberships-pro.php:131 paid-memberships-pro.php:132 +#: paid-memberships-pro.php:133 paid-memberships-pro.php:140 +#: paid-memberships-pro.php:162 paid-memberships-pro.php:164 +msgid "PayPal Payflow Pro/PayPal Pro" +msgstr "PayPal Payflow Pro/PayPal Pro" + +#: paid-memberships-pro.php:139 paid-memberships-pro.php:125 +#: paid-memberships-pro.php:126 paid-memberships-pro.php:133 +#: paid-memberships-pro.php:134 paid-memberships-pro.php:135 +#: paid-memberships-pro.php:136 paid-memberships-pro.php:137 +#: paid-memberships-pro.php:138 paid-memberships-pro.php:145 +#: paid-memberships-pro.php:166 paid-memberships-pro.php:168 +msgid "Cybersource" +msgstr "Cybersource" + +#: paid-memberships-pro.php:160 paid-memberships-pro.php:156 +#: paid-memberships-pro.php:157 paid-memberships-pro.php:158 +#: paid-memberships-pro.php:159 paid-memberships-pro.php:166 +#: paid-memberships-pro.php:194 +msgid "Once a month" +msgstr "Einmal monatlich" + +#: preheaders/account.php:10 preheaders/levels.php:22 preheaders/account.php:7 +#: preheaders/account.php:9 preheaders/levels.php:19 preheaders/levels.php:21 +#: preheaders/account.php:21 +msgid "Your membership status has been updated - Thank you!" +msgstr "Ihr Mitglieds-Status wurde aktualisiert. Vielen Dank!" + +#: preheaders/account.php:12 preheaders/levels.php:24 preheaders/account.php:11 +#: preheaders/levels.php:23 preheaders/account.php:23 +msgid "Sorry, your request could not be completed - please try again in a few moments." +msgstr "Leider konnte Ihre Anfrage nicht durchgeführt werden. Bitte versuchen Sie es in einigen Momenten erneut." + +#: preheaders/billing.php:151 preheaders/checkout.php:322 +#: preheaders/billing.php:145 preheaders/billing.php:147 +#: preheaders/billing.php:258 preheaders/billing.php:265 +#: preheaders/billing.php:266 preheaders/billing.php:270 +#: preheaders/billing.php:273 preheaders/billing.php:279 +#: preheaders/checkout.php:332 preheaders/checkout.php:336 +#: preheaders/checkout.php:364 preheaders/checkout.php:458 +#: preheaders/checkout.php:464 preheaders/checkout.php:465 +#: preheaders/checkout.php:470 preheaders/checkout.php:481 +#: preheaders/checkout.php:482 preheaders/billing.php:162 +msgid "Please complete all required fields." +msgstr "Füllen Sie bitte alle erforderlichen Felder aus." + +#: preheaders/billing.php:154 preheaders/checkout.php:330 +#: preheaders/billing.php:148 preheaders/billing.php:150 +#: preheaders/billing.php:263 preheaders/billing.php:268 +#: preheaders/billing.php:269 preheaders/billing.php:273 +#: preheaders/billing.php:276 preheaders/billing.php:284 +#: preheaders/checkout.php:340 preheaders/checkout.php:344 +#: preheaders/checkout.php:372 preheaders/checkout.php:466 +#: preheaders/checkout.php:473 preheaders/checkout.php:474 +#: preheaders/checkout.php:478 preheaders/checkout.php:491 +#: preheaders/checkout.php:492 preheaders/billing.php:165 +msgid "Your email addresses do not match. Please try again." +msgstr "Ihre E-Mail Adressen stimmen nicht überein. Bitte versuchen Sie es erneut." + +#: preheaders/billing.php:157 preheaders/checkout.php:335 +#: preheaders/billing.php:151 preheaders/billing.php:153 +#: preheaders/billing.php:268 preheaders/billing.php:271 +#: preheaders/billing.php:272 preheaders/billing.php:276 +#: preheaders/billing.php:279 preheaders/billing.php:289 +#: preheaders/checkout.php:345 preheaders/checkout.php:349 +#: preheaders/checkout.php:377 preheaders/checkout.php:471 +#: preheaders/checkout.php:478 preheaders/checkout.php:480 +#: preheaders/checkout.php:483 preheaders/checkout.php:497 +#: preheaders/checkout.php:498 preheaders/billing.php:168 +msgid "The email address entered is in an invalid format. Please try again." +msgstr "Ihre eingegebene E-Mail Adresse ist ungültig. Bitte versuchen Sie es erneut." + +#: preheaders/billing.php:161 preheaders/billing.php:155 +#: preheaders/billing.php:157 preheaders/billing.php:274 +#: preheaders/billing.php:275 preheaders/billing.php:276 +#: preheaders/billing.php:280 preheaders/billing.php:283 +#: preheaders/billing.php:295 preheaders/billing.php:172 +msgid "All good!" +msgstr "Alles erledigt!" + +#: preheaders/billing.php:228 preheaders/billing.php:222 +#: preheaders/billing.php:224 preheaders/billing.php:340 +#: preheaders/billing.php:345 preheaders/billing.php:346 +#: preheaders/billing.php:350 preheaders/billing.php:353 +#: preheaders/billing.php:370 preheaders/billing.php:239 +#, php-format +msgid "Information updated. « back to my account" +msgstr "Informationen aktualisiert. « zurück zu meinem Konto" + +#: preheaders/billing.php:234 preheaders/billing.php:228 +#: preheaders/billing.php:230 preheaders/billing.php:347 +#: preheaders/billing.php:351 preheaders/billing.php:352 +#: preheaders/billing.php:356 preheaders/billing.php:359 +#: preheaders/billing.php:378 preheaders/billing.php:380 +#: preheaders/billing.php:245 +msgid "Error updating billing information." +msgstr "Fehler beim aktualisieren der Zahlungsinformationen." + +#: preheaders/cancel.php:60 preheaders/cancel.php:24 preheaders/cancel.php:25 +#: preheaders/cancel.php:28 preheaders/cancel.php:59 +#: classes/class.pmproemail.php:895 includes/email.php:427 +#: preheaders/cancel.php:77 includes/email.php:452 +#: classes/class.pmproemail.php:907 includes/email.php:459 +msgid "Your membership has been cancelled." +msgstr "Ihre Mitgliedschaft wurde storniert." + +#: preheaders/checkout.php:34 preheaders/checkout.php:344 +#: preheaders/checkout.php:28 preheaders/checkout.php:30 +#: preheaders/checkout.php:31 preheaders/checkout.php:32 +#: preheaders/checkout.php:354 preheaders/checkout.php:358 +#: preheaders/checkout.php:386 preheaders/checkout.php:480 +#: preheaders/checkout.php:487 preheaders/checkout.php:491 +#: preheaders/checkout.php:492 preheaders/checkout.php:508 +#: preheaders/checkout.php:509 preheaders/checkout.php:37 +msgid "Invalid gateway." +msgstr "Ungültiger Zugang." + +#: preheaders/checkout.php:54 preheaders/checkout.php:88 +#: preheaders/checkout.php:89 preheaders/checkout.php:91 +#: preheaders/checkout.php:95 preheaders/checkout.php:96 +#: preheaders/checkout.php:72 +msgid "Checkout: Payment Information" +msgstr "Checkout: Zahlungs-Informationen" + +#: preheaders/checkout.php:59 preheaders/checkout.php:100 +#: preheaders/checkout.php:101 preheaders/checkout.php:77 +msgid "Set Up Your Account" +msgstr "Konto einrichten" + +#: preheaders/checkout.php:289 preheaders/checkout.php:300 +#: preheaders/checkout.php:304 preheaders/checkout.php:331 +#: preheaders/checkout.php:416 preheaders/checkout.php:421 +#: preheaders/checkout.php:301 +msgid "There are JavaScript errors on the page. Please contact the webmaster." +msgstr "Es gibt JavaScript-Fehler auf der Seite. Bitte kontaktieren Sie den Seiteninhaber." + +#: preheaders/checkout.php:325 preheaders/checkout.php:335 +#: preheaders/checkout.php:339 preheaders/checkout.php:367 +#: preheaders/checkout.php:461 preheaders/checkout.php:468 +#: preheaders/checkout.php:473 preheaders/checkout.php:485 +#: preheaders/checkout.php:486 +msgid "Your passwords do not match. Please try again." +msgstr "Die Passwörter stimmen nicht überein. Bitte versuchen Sie es erneut." + +#: preheaders/checkout.php:340 preheaders/checkout.php:350 +#: preheaders/checkout.php:354 preheaders/checkout.php:382 +#: preheaders/checkout.php:476 preheaders/checkout.php:483 +#: preheaders/checkout.php:486 preheaders/checkout.php:488 +#: preheaders/checkout.php:503 preheaders/checkout.php:504 +#, php-format +msgid "Please check the box to agree to the %s." +msgstr "Bestätigen Sie bitte, dass Sie mit der %s einverstanden sind." + +#: preheaders/checkout.php:347 preheaders/checkout.php:357 +#: preheaders/checkout.php:361 preheaders/checkout.php:389 +#: preheaders/checkout.php:483 preheaders/checkout.php:490 +#: preheaders/checkout.php:495 preheaders/checkout.php:512 +#: preheaders/checkout.php:513 +msgid "Are you a spammer?" +msgstr "Sind Sie ein Spammer?" + +#: preheaders/checkout.php:368 preheaders/checkout.php:377 +#: preheaders/checkout.php:381 preheaders/checkout.php:410 +#: preheaders/checkout.php:503 preheaders/checkout.php:510 +#: preheaders/checkout.php:515 preheaders/checkout.php:518 +#: preheaders/checkout.php:535 preheaders/checkout.php:536 +#: preheaders/checkout.php:382 +msgid "That username is already taken. Please try another." +msgstr "Dieser Benutzername wird bereits verwendet. Bitte versuchen Sie einen anderen." + +#: preheaders/checkout.php:373 preheaders/checkout.php:387 +msgid "That email address is already in use. Please log in, or use a different email address." +msgstr "Diese E-Mail Adresse wird bereits verwendet. Bitte loggen Sie sich damit ein oder verrsuchen Sie es mit einer anderen." + +#: preheaders/checkout.php:404 preheaders/checkout.php:397 +#: preheaders/checkout.php:399 preheaders/checkout.php:416 +#: preheaders/checkout.php:420 preheaders/checkout.php:446 +#: preheaders/checkout.php:525 preheaders/checkout.php:532 +#: preheaders/checkout.php:537 preheaders/checkout.php:544 +#: preheaders/checkout.php:561 preheaders/checkout.php:562 +#: preheaders/checkout.php:419 +#, php-format +msgid "reCAPTCHA failed. (%s) Please try again." +msgstr "reCAPTCHA fehlgeschlagen. (%s) Bitte versuchen Sie es erneut." + +#: preheaders/checkout.php:491 preheaders/checkout.php:482 +#: preheaders/checkout.php:484 preheaders/checkout.php:501 +#: preheaders/checkout.php:505 preheaders/checkout.php:533 +#: preheaders/checkout.php:647 preheaders/checkout.php:654 +#: preheaders/checkout.php:659 preheaders/checkout.php:683 +#: preheaders/checkout.php:701 preheaders/checkout.php:702 +#: preheaders/checkout.php:445 +msgid "Payment accepted." +msgstr "Zahlung erfolgreich." + +#: preheaders/checkout.php:497 preheaders/checkout.php:490 +#: preheaders/checkout.php:492 preheaders/checkout.php:509 +#: preheaders/checkout.php:513 preheaders/checkout.php:539 +#: preheaders/checkout.php:653 preheaders/checkout.php:660 +#: preheaders/checkout.php:665 preheaders/checkout.php:691 +#: preheaders/checkout.php:709 preheaders/checkout.php:710 +#: preheaders/checkout.php:451 +msgid "Unknown error generating account. Please contact us to set up your membership." +msgstr "Unbekannter Fehler beim Erstellen des Kontos. Bitte kontaktieren Sie uns um Ihren Konto einzurichten." + +#: preheaders/checkout.php:572 preheaders/checkout.php:550 +#: preheaders/checkout.php:552 preheaders/checkout.php:569 +#: preheaders/checkout.php:571 preheaders/checkout.php:575 +#: preheaders/checkout.php:581 preheaders/checkout.php:614 +#: preheaders/checkout.php:785 preheaders/checkout.php:792 +#: preheaders/checkout.php:797 preheaders/checkout.php:825 +#: preheaders/checkout.php:844 preheaders/checkout.php:859 +#: preheaders/checkout.php:860 preheaders/checkout.php:537 +msgid "Your payment was accepted, but there was an error setting up your account. Please contact us." +msgstr "Ihre Zahlung war erfolgreich, aber es gab leider einen Fehler beim Einrichten Ihres Kontos. Bitte kontaktieren Sie uns." + +#: preheaders/checkout.php:802 preheaders/checkout.php:691 +#: preheaders/checkout.php:693 preheaders/checkout.php:710 +#: preheaders/checkout.php:712 preheaders/checkout.php:722 +#: preheaders/checkout.php:730 preheaders/checkout.php:754 +#: preheaders/checkout.php:826 preheaders/checkout.php:953 +#: preheaders/checkout.php:960 preheaders/checkout.php:970 +#: preheaders/checkout.php:983 preheaders/checkout.php:1030 +#: preheaders/checkout.php:1045 preheaders/checkout.php:1046 +#: preheaders/checkout.php:792 preheaders/checkout.php:811 +msgid "IMPORTANT: Something went wrong during membership creation. Your credit card authorized, but we cancelled the order immediately. You should not try to submit this form again. Please contact the site owner to fix this issue." +msgstr "WICHTIG: Bei der Anmeldung gab es leider einen Fehler. Ihre Kreditkarte wurde verifiziert, aber der Vorgang wurde von uns abgebrochen. Versuchen Sie bitte nicht erneut, das Formular abzusenden und kontaktieren Sie den Betreiber dieser Seite um den Fehler zu korrigieren." + +#: preheaders/checkout.php:805 preheaders/checkout.php:694 +#: preheaders/checkout.php:696 preheaders/checkout.php:713 +#: preheaders/checkout.php:715 preheaders/checkout.php:725 +#: preheaders/checkout.php:733 preheaders/checkout.php:757 +#: preheaders/checkout.php:829 preheaders/checkout.php:956 +#: preheaders/checkout.php:963 preheaders/checkout.php:973 +#: preheaders/checkout.php:988 preheaders/checkout.php:1035 +#: preheaders/checkout.php:1050 preheaders/checkout.php:1051 +#: preheaders/checkout.php:795 preheaders/checkout.php:814 +msgid "IMPORTANT: Something went wrong during membership creation. Your credit card was charged, but we couldn't assign your membership. You should not submit this form again. Please contact the site owner to fix this issue." +msgstr "WICHTIG: Bei der Anmeldung gab es leider einen Fehler. Ihre Kreditkarte wurde belastet, aber wir konnten Ihre Mitgliedschaft nicht einrichten. Bitte senden Sie das Formular nicht erneut und kontaktieren Sie den Betreiber dieser Seite um dieses Problem zu lösen." + +#: preheaders/checkout.php:816 preheaders/checkout.php:705 +#: preheaders/checkout.php:707 preheaders/checkout.php:724 +#: preheaders/checkout.php:726 preheaders/checkout.php:736 +#: preheaders/checkout.php:744 preheaders/checkout.php:768 +#: preheaders/checkout.php:840 preheaders/checkout.php:967 +#: preheaders/checkout.php:974 preheaders/checkout.php:984 +#: preheaders/checkout.php:1001 preheaders/checkout.php:1048 +#: preheaders/checkout.php:1063 preheaders/checkout.php:1064 +#: preheaders/checkout.php:806 preheaders/checkout.php:825 +#, php-format +msgid "You must set up a Payment Gateway before any payments will be processed." +msgstr "Sie müssen einen Zahlungsdienstleister auswählen damit Zahlungen durchgeführt werden können." + +#: preheaders/checkout.php:818 preheaders/checkout.php:707 +#: preheaders/checkout.php:709 preheaders/checkout.php:726 +#: preheaders/checkout.php:728 preheaders/checkout.php:738 +#: preheaders/checkout.php:746 preheaders/checkout.php:770 +#: preheaders/checkout.php:842 preheaders/checkout.php:969 +#: preheaders/checkout.php:976 preheaders/checkout.php:986 +#: preheaders/checkout.php:1003 preheaders/checkout.php:1050 +#: preheaders/checkout.php:1065 preheaders/checkout.php:1066 +#: preheaders/checkout.php:808 preheaders/checkout.php:827 +msgid "A Payment Gateway must be set up before any payments will be processed." +msgstr "Ein Zahlungsdienstleister muss ausgewählt werden, bevor Zahlungen erfolgen können." + +#: scheduled/crons.php:39 scheduled/crons.php:31 scheduled/crons.php:34 +#: scheduled/crons.php:38 scheduled/crons.php:61 scheduled/crons.php:46 +#, php-format +msgid "Membership expired email sent to %s. " +msgstr "Mitgliedschaft ist abgelaufen. E-Mail wurde an %s gesendet." + +#: scheduled/crons.php:105 scheduled/crons.php:27 scheduled/crons.php:74 +#: scheduled/crons.php:80 scheduled/crons.php:84 scheduled/crons.php:88 +#: scheduled/crons.php:99 scheduled/crons.php:100 scheduled/crons.php:117 +#, php-format +msgid "Membership expiring email sent to %s. " +msgstr "Mitgliedschaft läuft ab. E-Mail wurde an %s gesendet." + +#: scheduled/crons.php:184 scheduled/crons.php:143 scheduled/crons.php:152 +#: scheduled/crons.php:157 scheduled/crons.php:164 scheduled/crons.php:175 +#: scheduled/crons.php:176 scheduled/crons.php:206 +#, php-format +msgid "Credit card expiring email sent to %s. " +msgstr "Kreditkarte läuft ab. E-Mail wurde an %s gesendet." + +#: scheduled/crons.php:240 scheduled/crons.php:104 scheduled/crons.php:196 +#: scheduled/crons.php:208 scheduled/crons.php:210 scheduled/crons.php:220 +#: scheduled/crons.php:231 scheduled/crons.php:232 scheduled/crons.php:266 +#, php-format +msgid "Trial ending email sent to %s. " +msgstr "Testphase läuft ab. E-Mail wurde an %s gesendet." + +#: services/applydiscountcode.php:70 services/applydiscountcode.php:64 +#: services/applydiscountcode.php:67 services/applydiscountcode.php:93 +#, php-format +msgid "The %s code has been applied to your order. " +msgstr "Der %s Code wurde wie gewünscht verwendet." + +#: services/applydiscountcode.php:100 services/applydiscountcode.php:82 +#: services/applydiscountcode.php:83 services/applydiscountcode.php:86 +#: services/applydiscountcode.php:97 services/applydiscountcode.php:138 +#, php-format +msgid "The %s code has been applied to your order." +msgstr "Der %s Code wurde wie gewünscht verwendet." + +#: services/authnet-silent-post.php:149 services/authnet-silent-post.php:133 +#: services/authnet-silent-post.php:138 services/authnet-silent-post.php:141 +#: services/authnet-silent-post.php:144 services/authnet-silent-post.php:145 +#: services/authnet-silent-post.php:173 services/authnet-silent-post.php:176 +msgid "

    A payment is being held for review within Authorize.net.

    Payment Information From Authorize.net" +msgstr "

    Eine Zahlung wird von Authorize.net zur Überprüfung zurückgehalten.

    Zahlungs-Information von Authorize.net" + +#: shortcodes/pmpro_account.php:45 pages/account.php:19 +#: shortcodes/pmpro_account.php:44 includes/email-templates.php:68 +#: shortcodes/pmpro_account.php:43 +msgid "Billing" +msgstr "Abrechnung" + +#: shortcodes/pmpro_account.php:64 pages/account.php:36 +#: shortcodes/pmpro_account.php:62 shortcodes/pmpro_account.php:65 +#: shortcodes/pmpro_account.php:98 +msgid "Update Billing Info" +msgstr "Zahlungsinformationen ändern" + +#: shortcodes/pmpro_account.php:70 pages/account.php:42 +#: shortcodes/pmpro_account.php:68 shortcodes/pmpro_account.php:71 +#: shortcodes/pmpro_account.php:103 +msgid "Change" +msgstr "Ändern" + +#: shortcodes/pmpro_account.php:95 pages/account.php:64 +#: shortcodes/pmpro_account.php:90 shortcodes/pmpro_account.php:92 +#: shortcodes/pmpro_account.php:93 shortcodes/pmpro_account.php:158 +msgid "View all Membership Options" +msgstr "Alle Mitgliedschafts-Optionen zeigen" + +#: shortcodes/pmpro_account.php:104 pages/account.php:46 pages/account.php:50 +#: pages/account.php:71 shortcodes/pmpro_account.php:99 +#: shortcodes/pmpro_account.php:101 shortcodes/pmpro_account.php:102 +#: shortcodes/pmpro_account.php:167 +msgid "My Account" +msgstr "Mein Konto" + +#: shortcodes/pmpro_account.php:115 pages/account.php:55 pages/account.php:59 +#: pages/account.php:80 shortcodes/pmpro_account.php:110 +#: shortcodes/pmpro_account.php:112 shortcodes/pmpro_account.php:113 +#: shortcodes/pmpro_account.php:191 +msgid "Edit Profile" +msgstr "Profil editieren" + +#: shortcodes/pmpro_account.php:116 pages/account.php:56 pages/account.php:60 +#: pages/account.php:81 shortcodes/pmpro_account.php:111 +#: shortcodes/pmpro_account.php:113 shortcodes/pmpro_account.php:114 +#: includes/profile.php:872 includes/profile.php:909 +#: shortcodes/pmpro_account.php:195 includes/profile.php:884 +#: includes/profile.php:921 +msgid "Change Password" +msgstr "Passwort ändern" + +#: shortcodes/pmpro_account.php:123 pages/account.php:87 pages/account.php:125 +#: pages/account.php:129 shortcodes/pmpro_account.php:118 +#: shortcodes/pmpro_account.php:120 shortcodes/pmpro_account.php:121 +#: shortcodes/pmpro_account.php:219 +msgid "Past Invoices" +msgstr "Bisherige Rechnungen" + +#: shortcodes/pmpro_account.php:129 pages/account.php:93 +#: shortcodes/pmpro_account.php:124 shortcodes/pmpro_account.php:126 +#: shortcodes/pmpro_account.php:127 shortcodes/pmpro_account.php:225 +msgid "Amount" +msgstr "Betrag" + +#: shortcodes/pmpro_account.php:157 pages/account.php:121 pages/account.php:140 +#: pages/account.php:144 shortcodes/pmpro_account.php:152 +#: shortcodes/pmpro_account.php:154 shortcodes/pmpro_account.php:155 +#: shortcodes/pmpro_account.php:264 +msgid "View All Invoices" +msgstr "Alle Rechnungen anzeigen" + +#: shortcodes/pmpro_account.php:164 pages/account.php:128 pages/account.php:146 +#: pages/account.php:150 shortcodes/pmpro_account.php:159 +#: shortcodes/pmpro_account.php:161 shortcodes/pmpro_account.php:162 +#: shortcodes/pmpro_account.php:271 +msgid "Member Links" +msgstr "Mitglieder Links" + +#: adminpages/addons.php:79 +msgid "Disabled" +msgstr "Deaktiviert" + +#: adminpages/addons.php:79 +msgid "Enabled" +msgstr "Aktiviert" + +#: adminpages/admin_header.php:106 adminpages/admin_header.php:127 +#: adminpages/admin_header.php:136 adminpages/admin_header.php:148 +msgid "Plugin Support" +msgstr "Plugin Support" + +#: adminpages/admin_header.php:106 adminpages/admin_header.php:127 +#: adminpages/admin_header.php:136 adminpages/admin_header.php:148 +msgid "User Forum" +msgstr "Benutzer Forum" + +#: adminpages/advancedsettings.php:209 adminpages/advancedsettings.php:216 +#: adminpages/advancedsettings.php:229 adminpages/advancedsettings.php:232 +#: adminpages/advancedsettings.php:248 +msgid "reCAPTCHA Public Key" +msgstr "reCAPTCHA Public Key" + +#: adminpages/advancedsettings.php:212 adminpages/advancedsettings.php:219 +#: adminpages/advancedsettings.php:232 adminpages/advancedsettings.php:235 +#: adminpages/advancedsettings.php:251 +msgid "reCAPTCHA Private Key" +msgstr "reCAPTCHA Private Key" + +#: adminpages/advancedsettings.php:272 adminpages/advancedsettings.php:285 +msgid "selected" +msgstr "ausgewählt" + +#: adminpages/discountcodes.php:437 +msgid "Billing Ammount" +msgstr "Rechnungsbetrag" + +#: adminpages/discountcodes.php:480 +msgid "Check this to set an expiration date for new sign ups." +msgstr "Auswählen, um ein Ablaufdatum für neue Registrierungen festzulegen." + +#: adminpages/discountcodes.php:497 +msgid "How long before the expiration expires. Note that any future payments will be cancelled when the membership expires." +msgstr "Wie lange vor Ende des Ablaufdatums. Beachten Sie, dass alle zukünftigen Zahlungen storniert werden, wenn die Mitgliedschaft ausläuft." + +#: adminpages/emailsettings.php:63 adminpages/emailsettings.php:72 +msgid "To modify the appearance of system generated emails, add the files email_header.html and email_footer.html to your theme's directory. This will modify both the WordPress default messages as well as messages generated by Paid Memberships Pro. Click here to learn more about Paid Memberships Pro emails." +msgstr "Um das Design von System-generierten E-Mails anzupassen, fügen Sie die Dateien email_header.html und email_footer.html Ihrem Theme-Ordner hinzu. Damit werden sowohl die Wordpress-Standard-Nachrichten, als auch die von Paid Memberships Pro generiereten Nachrichten angepasst. Klicken Sie hier um mehr über Paid Memberships Pro emails zu erfahren." + +#: adminpages/emailsettings.php:98 +msgid "If unchecked, all emails from \"WordPress <" +msgstr "Wird diese Option nicht ausgewählt, werden obige Einstellungen für alle E-Mails von der angegebenen E-Mail Adresse verwendet." + +#: adminpages/membershiplevels.php:364 +msgid "Stripe integration currently only supports billing periods of \"Month\" or \"Year\"." +msgstr "Stripe unterstützt derzeit nur Monate oder Jahre als Zahlungszyklen." + +#: adminpages/membershiplevels.php:368 adminpages/membershiplevels.php:370 +#: adminpages/membershiplevels.php:389 adminpages/membershiplevels.php:391 +#: adminpages/membershiplevels.php:392 +msgid "Payflow integration currently only supports billing frequencies of 1 and billing periods of \"Week\", \"Month\" or \"Year\"." +msgstr "Payflow unterstützt derzeit nur eine Zahlungsfrequenz von 1 und als Abrechnungszyklus \"Woche\", \"Monat\" oder \"Jahr\". " + +#: adminpages/membershiplevels.php:398 +msgid "2Checkout integration does not currently support custom trials. You can do one period trials by setting an initial payment different from the billing amount." +msgstr "2Checkout unterstützt derzeit keine Testphasen. Sie können eine Testphase einrichten, indem Sie eine Einmal-Zahlung einrichten, die sich vom Zahlungsbetrag unterscheidet." + +#: adminpages/membershiplevels.php:508 adminpages/membershiplevels.php:514 +#: adminpages/membershiplevels.php:516 adminpages/membershiplevels.php:543 +msgid "Billing Cycle" +msgstr "Zahlungszyklus" + +#: adminpages/membershiplevels.php:509 adminpages/membershiplevels.php:515 +#: adminpages/membershiplevels.php:517 adminpages/membershiplevels.php:544 +msgid "Trial Cycle" +msgstr "Testphase" + +#: adminpages/membershiplevels.php:543 adminpages/membershiplevels.php:549 +#: adminpages/membershiplevels.php:551 adminpages/membershiplevels.php:578 +msgid "every" +msgstr "jede(n)" + +#: adminpages/pagesettings.php:73 +#, php-format +msgid "Membership %s" +msgstr "Mitgliedschaft %s" + +#: adminpages/paymentsettings.php:170 +msgid "Payflow Pro currently only supports one-time payments. Users will not be able to checkout for levels with recurring payments." +msgstr "Payflow Pro unterstützt derzeit nur einmalige Zahlungen. Benutzer können Anmeldungen für Paket mit wiederkehrenden Zahlungen nicht abschließen." + +#: adminpages/paymentsettings.php:195 adminpages/paymentsettings.php:450 +#: adminpages/paymentsettings.php:452 +msgid "US only. If values are given, tax will be applied for any members ordering from the selected state.
    For non-US or more complex tax rules, use the pmpro_tax filter." +msgstr "Nur für USA. Wenn Werte vergeben werden, werden die Steuern für Kunden aus den jeweiligen Staaten verreichnet.
    Für Nicht-US oder komplexere Steuersätze, verwenden Sie die pmpro_tax filter." + +#: adminpages/paymentsettings.php:223 adminpages/paymentsettings.php:235 +msgid "Your SSL Certificate must be installed by your web host. Your SSL Seal will be a short HTML or JavaScript snippet that can be pasted here." +msgstr "Ihr SSL Zertifikat muss von Ihrem Webhost installiert werden. Ihr SSL Siegel ist ein kurzer HTML oder JavaScript Text, der hier eingefügt werden kann." + +#: adminpages/paymentsettings.php:405 adminpages/paymentsettings.php:445 +msgid "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." +msgstr "Wenn Werte eingetragen sind, werden die Steuern bei jedem Benutzer aus dem jeweiligen Staat angerechnet. Für komplexere Steuer Regeln verwenden Sie bitte den \"pmpro_tax\" filter." + +#: adminpages/paymentsettings.php:410 adminpages/paymentsettings.php:421 +msgid "Use SSL" +msgstr "SSL verwenden" + +#: adminpages/paymentsettings.php:425 +msgid "Required by this Gateway Option" +msgstr "Bei diesen Zahlungsdienstleister erforderlich" + +#: adminpages/paymentsettings.php:432 +msgid "Stripe doesn't require billing address fields. Choose 'No' to hide them on the checkout page." +msgstr "Stripe erfodert keine Rechnungsadressen-Felder. Wählen Sie \"Nein\" im diese auf der Checkout-Seite auszublenden." + +#: adminpages/paymentsettings.php:438 adminpages/paymentsettings.php:471 +#: adminpages/paymentsettings.php:477 adminpages/paymentsettings.php:479 +msgid "HTTPS Nuclear Option" +msgstr "HTTPS Nuclear Option" + +#: adminpages/paymentsettings.php:441 adminpages/paymentsettings.php:474 +#: adminpages/paymentsettings.php:480 adminpages/paymentsettings.php:482 +msgid "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." +msgstr "Verwenden Sie die \"Nuclear Option\" zur Verwendung von secure (HTTPS) URLs auf Ihren SSL Seiten. Wählen Sie diese Option, wenn Sie SSL verwenden und Warnmeldungen auf Ihren SSL-Seiten bekommen." + +#: adminpages/paymentsettings.php:490 adminpages/paymentsettings.php:496 +#: adminpages/paymentsettings.php:498 +#: classes/gateways/class.pmprogateway_twocheckout.php:148 +msgid "To fully integrate with 2Checkout, be sure to set your 2Checkout INS URL " +msgstr "Um 2Checkout vollständig zu integrieren, stellen Sie Ihre 2Checkout INS URL ein " + +#: adminpages/reports/login.php:26 adminpages/reports/login.php:27 +msgid "Visits Today" +msgstr "Besuche Heute" + +#: adminpages/reports/login.php:28 adminpages/reports/login.php:29 +#: adminpages/reports/login.php:189 +msgid "Visits All Time" +msgstr "Besuche Gesamt" + +#: adminpages/reports/login.php:31 adminpages/reports/login.php:32 +msgid "Views Today" +msgstr "Ansichten Heute" + +#: adminpages/reports/login.php:33 adminpages/reports/login.php:34 +#: adminpages/reports/login.php:193 +msgid "Views All Time" +msgstr "Ansichten Gesamt" + +#: adminpages/reports/login.php:36 adminpages/reports/login.php:37 +msgid "Logins Today" +msgstr "Logins heute" + +#: adminpages/reports/login.php:38 adminpages/reports/login.php:39 +#: adminpages/reports/login.php:198 +msgid "Logins All Time" +msgstr "Logins Gesamt" + +#: adminpages/reports/memberships.php:38 adminpages/reports/memberships.php:67 +msgid "Cancellations" +msgstr "Stornierungen" + +#: adminpages/reports/memberships.php:86 +msgid "Other Stats" +msgstr "Andere Statistiken" + +#: adminpages/reports/memberships.php:88 +msgid "Monthly Recurring Revenue (MRR)" +msgstr "Monatlich Wiederkehrende Zahlungen (MRR)" + +#: adminpages/reports/memberships.php:92 +msgid "Cancellation Rate" +msgstr "Stornoquote" + +#: adminpages/reports/memberships.php:96 +msgid "Lifetime Value (LTV)" +msgstr "Lifetime Value (LTV)" + +#: classes/class.pmproemail.php:342 classes/class.pmproemail.php:345 +#: classes/class.pmproemail.php:363 classes/class.pmproemail.php:366 +#: classes/class.pmproemail.php:375 +#, php-format +msgid "Your billing information has been udpated at %s" +msgstr "Ihre Zahlungsinformationen bei %s wurden aktualisiert" + +#: classes/class.pmproemail.php:386 classes/class.pmproemail.php:390 +#: classes/class.pmproemail.php:416 classes/class.pmproemail.php:419 +#: classes/class.pmproemail.php:428 +#, php-format +msgid "Billing information has been udpated for %s at %s" +msgstr "Zahlungsinformationen für %s bei %s wurden aktualisiert" + +#: classes/class.pmproemail.php:685 classes/class.pmproemail.php:734 +#: classes/class.pmproemail.php:799 +msgid "membership has been cancelled" +msgstr "Mitgliedschaft wurde beendet." + +#: classes/gateways/class.pmprogateway_stripe.php:51 +#: classes/gateways/class.pmprogateway_stripe.php:55 +#, php-format +msgid "The %s gateway depends on the %s PHP extension. Please enable it, or ask your hosting provider to enable it" +msgstr "Das %s Gateway benötigt die %s PHP Erweiterung. Bitte aktivieren Sie sie oder bitten Sie ihren Hosting Provider, es zu aktivieren." + +#: classes/gateways/class.pmprogateway_stripe.php:285 +#: classes/gateways/class.pmprogateway_stripe.php:286 +msgid "Your Secret Key appears incorrect." +msgstr "Ihr geheimer Schlüssel scheint falsch zu sein." + +#: classes/gateways/class.pmprogateway_twocheckout.php:139 +msgid "API Private Key" +msgstr "Privater API-Schlüssel" + +#: classes/gateways/class.pmprogateway_twocheckout.php:143 +msgid "Go to API in 2Checkout and generate a new key pair. Paste the Private Key here." +msgstr "Gehen Sie zu API in 2Checkout und erzeugen Sie ein neues Schlüsselpaar. Fügen Sie den privaten Schlüssel hier ein." + +#: includes/currencies.php:11 +msgid "Brazilian Real ($)" +msgstr "Brasilianische Real (&Nummer36;)" + +#: includes/currencies.php:29 includes/currencies.php:49 +msgid "South African Rand" +msgstr "Südafrikanische Rand" + +#: includes/filters.php:218 +#, php-format +msgid "User: %s
    Email: %s
    Membership Level: %s
    Order #: %s
    Original Profile Start Date: %s
    Adjusted Profile Start Date: %s
    Trial Period: %s
    Trial Frequency: %s
    " +msgstr "Benutzer: %s
    E-Mail: %s
    Mitgliedschafts-Paket: %s
    Auftragsnummer: %s
    Original-Startdatum des Profils: %s
    Angepasstes Startdatum des Profils: %s
    Testzeitraum: %s
    Testfrequenz: %s
    " + +#: includes/functions.php:169 includes/functions.php:205 +#: includes/functions.php:211 includes/functions.php:213 +#: includes/functions.php:214 includes/functions.php:215 +#: includes/functions.php:218 includes/functions.php:254 +#: includes/functions.php:320 includes/functions.php:326 +#: includes/functions.php:331 includes/functions.php:340 +#, php-format +msgid " and then %s per %s for %d more %s." +msgstr " und dann %s pro %s für %d weitere %s." + +#: includes/functions.php:173 includes/functions.php:209 +#: includes/functions.php:215 includes/functions.php:217 +#: includes/functions.php:218 includes/functions.php:219 +#: includes/functions.php:222 +#, php-format +msgid " and then %s every %d %s for %d more %s." +msgstr " und dann %s jede(n) %d %s für %d weitere %s." + +#: includes/functions.php:178 includes/functions.php:214 +#: includes/functions.php:220 includes/functions.php:222 +#: includes/functions.php:223 includes/functions.php:224 +#: includes/functions.php:227 includes/functions.php:263 +#: includes/functions.php:329 includes/functions.php:335 +#: includes/functions.php:340 includes/functions.php:349 +#, php-format +msgid " and then %s after %d %s." +msgstr " und dann %s nach %d %s." + +#: includes/functions.php:184 includes/functions.php:220 +#: includes/functions.php:228 includes/functions.php:238 +#: includes/functions.php:239 includes/functions.php:240 +#: includes/functions.php:242 includes/functions.php:245 +#: includes/functions.php:249 includes/functions.php:285 +#: includes/functions.php:351 includes/functions.php:357 +#: includes/functions.php:362 includes/functions.php:371 +#, php-format +msgid " and then %s per %s." +msgstr " und dann %s pro %s." + +#: includes/functions.php:188 includes/functions.php:224 +#: includes/functions.php:232 includes/functions.php:242 +#: includes/functions.php:243 includes/functions.php:244 +#: includes/functions.php:246 includes/functions.php:249 +#: includes/functions.php:253 includes/functions.php:289 +#: includes/functions.php:355 includes/functions.php:361 +#: includes/functions.php:366 includes/functions.php:375 +#, php-format +msgid " and then %s every %d %s." +msgstr " und dann %s jede(n) %d %s." + +#: includes/functions.php:217 includes/functions.php:253 +#: includes/functions.php:264 includes/functions.php:275 +#: includes/functions.php:276 includes/functions.php:277 +#: includes/functions.php:279 includes/functions.php:282 +#: includes/functions.php:286 includes/functions.php:322 +#: includes/functions.php:388 includes/functions.php:394 +#: includes/functions.php:399 includes/functions.php:408 pages/levels.php:97 +#, php-format +msgid "After your initial payment, your first %d payments will cost %s." +msgstr "Nach Ihrer Erst-Zahlung wird die nächste %d Zahlung %s betragen." + +#: includes/functions.php:228 includes/functions.php:264 +#: includes/functions.php:275 includes/functions.php:286 +#: includes/functions.php:287 includes/functions.php:288 +#: includes/functions.php:290 includes/functions.php:293 +#: includes/functions.php:297 includes/functions.php:333 +#: includes/functions.php:399 includes/functions.php:405 +#: includes/functions.php:410 includes/functions.php:419 +#: includes/functions.php:523 includes/functions.php:532 +#, php-format +msgid "Customers in %s will be charged %s%% tax." +msgstr "Kunden aus %s werden zusätzlich %s%% Steuern verrechnet." + +#: includes/functions.php:228 includes/functions.php:229 +#: includes/functions.php:230 includes/functions.php:231 +#: includes/functions.php:235 includes/functions.php:271 +#: includes/functions.php:337 includes/functions.php:343 +#: includes/functions.php:348 includes/functions.php:357 +#, php-format +msgid "The price for membership is %s per %s." +msgstr "Der Preis für den Zugang beträgt %s pro %s." + +#: includes/functions.php:230 includes/functions.php:233 +#: includes/functions.php:237 includes/functions.php:273 +#: includes/functions.php:339 includes/functions.php:345 +#: includes/functions.php:350 includes/functions.php:359 +#, php-format +msgid "%s per %s." +msgstr "%s pro %s." + +#: includes/functions.php:233 includes/functions.php:234 +#: includes/functions.php:235 includes/functions.php:238 +#: includes/functions.php:242 includes/functions.php:278 +#: includes/functions.php:344 includes/functions.php:350 +#: includes/functions.php:355 includes/functions.php:364 +#, php-format +msgid "The price for membership is %s every %d %s." +msgstr "Der Preis für den Zugang beträgt %s jede(n) %d %s." + +#: includes/functions.php:237 includes/functions.php:240 +#: includes/functions.php:244 includes/functions.php:280 +#: includes/functions.php:346 includes/functions.php:352 +#: includes/functions.php:357 includes/functions.php:366 +#, php-format +msgid "%s every %d %s." +msgstr "%s jede(n) %d %s." + +#: includes/functions.php:242 includes/functions.php:278 +#: includes/functions.php:289 includes/functions.php:300 +#: includes/functions.php:301 includes/functions.php:302 +#: includes/functions.php:304 includes/functions.php:307 +#: includes/functions.php:311 includes/functions.php:347 +#: includes/functions.php:413 includes/functions.php:419 +#: includes/functions.php:540 includes/functions.php:549 +#, php-format +msgid "Membership expires after %d %s." +msgstr "Zugang endet nach %d %s." + +#: includes/functions.php:258 includes/functions.php:324 +#: includes/functions.php:330 includes/functions.php:335 +#: includes/functions.php:344 +#, php-format +msgid " and then %s every %d %s for %d more payments." +msgstr " und dann %s jede(n) %d %s für %d weitere Zahlungen." + +#: includes/functions.php:469 includes/functions.php:478 +#, php-format +msgid "%s per %s for %d more %s" +msgstr "%s pro %s für %d weitere %s" + +#: includes/functions.php:473 includes/functions.php:482 +#, php-format +msgid "%s every %d %s for %d more payments" +msgstr "%s jede(n) %d %s für %d weitere Zahlungen" + +#: includes/functions.php:478 includes/functions.php:487 +#, php-format +msgid "%s after %d %s" +msgstr "%s nach %d %s" + +#: includes/functions.php:484 includes/functions.php:493 +#, php-format +msgid "%s every %s" +msgstr "%s jede(n) %s" + +#: includes/functions.php:488 includes/functions.php:497 +#, php-format +msgid "%s every %d %s" +msgstr "%s jede(n) %d %s" + +#: includes/functions.php:556 includes/functions.php:557 +#: includes/functions.php:566 +#, php-format +msgid "%s membership expires after %d %s" +msgstr "%s Mitgliedschaft läuft nach %d %s aus" + +#: includes/license.php:89 includes/license.php:92 +msgid "Enter your support license key. Your license key can be found in your membership email receipt or in your Membership Account." +msgstr "Geben Sie Ihren Support-Lizenzschlüssel ein. Sie finden Ihren Lizenzschlüssel in Ihrer E-Mail-Bestätigung für die Mitgliedschaft oder in Ihrem Mitgliedskonto." + +#: includes/license.php:91 includes/license.php:94 +msgid "Visit the PMPro Membership Account page to confirm that your account is active and to find your license key." +msgstr "Besuchen Sie die PMPro Mitgliedskonto Seite, um zu bestätigen, dass Ihr Konto aktiv ist und um Ihren Lizenzschlüssel zu finden." + +#: includes/profile.php:82 includes/profile.php:84 +msgid "User is not paying." +msgstr "Benutzer bezahlt nicht." + +#: includes/updates.php:102 includes/updates.php:115 +msgid "Start the Update" +msgstr "Update starten" + +#: pages/account.php:10 +msgid "Your membership is active." +msgstr "Ihr Zugang ist aktiv." + +#: pages/account.php:34 pages/account.php:38 +#, php-format +msgid "Your first payment will cost %s." +msgstr "Ihre erste Zahlung wird %s betragen." + +#: pages/account.php:38 pages/account.php:42 +#, php-format +msgid "Your first %d payments will cost %s." +msgstr "Ihre erste %d Zahlung wird %s betragen." + +#: pages/account.php:87 pages/account.php:91 adminpages/emailtemplates.php:156 +msgid "Billing Information" +msgstr "Zahlungsinformationen" + +#: pages/account.php:114 pages/account.php:118 +msgid "Edit Billing Information" +msgstr "Zahlungsdetails ändern" + +#: pages/account.php:152 pages/account.php:156 +msgid "Update Billing Information" +msgstr "Zahlungsinformationen aktualisieren" + +#: pages/account.php:155 pages/account.php:159 +msgid "Change Membership Level" +msgstr "Paket ändern" + +#: pages/account.php:157 pages/account.php:161 +msgid "Cancel Membership" +msgstr "Mitgliedschaft stornieren" + +#: pages/cancel.php:17 pages/cancel.php:37 +msgid "Yes, cancel my account" +msgstr "Ja, mein Konto löschen" + +#: pages/cancel.php:19 pages/cancel.php:38 +msgid "No, keep my account" +msgstr "Nein, mein Konto behalten" + +#: pages/checkout.php:51 pages/checkout.php:52 +#, php-format +msgid "

    The %s code has been applied to your order.

    " +msgstr "

    Der %s Code wurde wie gewünscht verwendet.

    " + +#: pages/checkout.php:688 pages/checkout.php:691 pages/checkout.php:707 +msgid "Submit and Pay with 2CheckOut" +msgstr "Senden und bezahlen mit 2CheckOut" + +#: pages/confirmation.php:12 +msgid "Your payment has been submitted to PayPal. Your membership will be activated shortly." +msgstr "Ihre Zahlung wurde an PayPal übermittelt. Ihre Mitgliedschaft wird in Kürze aktiviert." + +#: pages/confirmation.php:95 pages/confirmation.php:97 +#, php-format +msgid "Below are details about your membership account. A welcome email with has been sent to %s." +msgstr "Untenstehend finden Sie Inforamtionen zu Ihrem Konto. Eine Willkommens-email wurde an %s gesendet." + +#: pages/invoice.php:120 pages/invoice.php:122 +msgid "View Invoice" +msgstr "Rechnung anzeigen" + +#: pages/levels.php:15 +msgid "Subscription Information" +msgstr "Abonnement Informationen" + +#: pages/levels.php:33 +msgid "--" +msgstr "--" + +#: pages/levels.php:51 +#, php-format +msgid "%s per %s for %d more %s." +msgstr "%s pro %s für %d weitere %s." + +#: pages/levels.php:55 +#, php-format +msgid "%s every %d %s for %d more %s." +msgstr "%s jede(n) %d %s für %d weitere %s." + +#: pages/levels.php:60 +#, php-format +msgid "%s after %d %s." +msgstr "%s nach %d %s." + +#: preheaders/checkout.php:99 preheaders/checkout.php:100 +#: preheaders/checkout.php:102 preheaders/checkout.php:109 +msgid "Set up Your Account" +msgstr "Konto einrichten" + +#: preheaders/checkout.php:373 preheaders/checkout.php:382 +#: preheaders/checkout.php:386 preheaders/checkout.php:415 +#: preheaders/checkout.php:508 preheaders/checkout.php:515 +#: preheaders/checkout.php:520 preheaders/checkout.php:524 +#: preheaders/checkout.php:541 preheaders/checkout.php:542 +msgid "That email address is already taken. Please try another." +msgstr "Diese E-Mail Adresse wird bereits verwendet. Bitte versuchen Sie es mit einer anderen." + +#: services/stripe-webhook.php:176 services/stripe-webhook.php:194 +#: services/stripe-webhook.php:270 services/stripe-webhook.php:271 +#: services/stripe-webhook.php:272 services/stripe-webhook.php:283 +#: services/stripe-webhook.php:290 services/stripe-webhook.php:304 +#: services/stripe-webhook.php:320 +#, php-format +msgid "%s has had their payment subscription cancelled by Stripe. Please check that this user's membership is cancelled on your site if it should be." +msgstr "Die Abo-Zahlung von %s wurde von Stripe storniert. Überprüfen Sie, ob die Mitgliedschaft dieses Benutzers deaktiviert ist, falls sie dies sein sollte." + +#: services/stripe-webhook.php:193 services/stripe-webhook.php:203 +#, php-format +msgid "While processing an update to the subscription for %s, we failed to cancel their old subscription in Stripe. Please check that this user's original subscription (%s) is cancelled in the Stripe dashboard." +msgstr "Bei der Bearbeitung einer Aktualisierung des Abonnements für %s konnten wir das alte Abonnement in Stripe nicht stornieren. Bitte überprüfen Sie, ob das ursprüngliche Abonnement dieses Benutzers (%s) im Stripe-Dashboard gekündigt ist." + +#. Plugin Name of the plugin +#: blocks/blocks.php:41 classes/class-pmpro-admin-activity-email.php:355 +#: includes/compatibility/divi.php:19 includes/compatibility/divi.php:23 +#: includes/compatibility/elementor/class-pmpro-elementor.php:65 +#: includes/menus.php:34 includes/menus.php:104 +#: blocks/account-invoices-section/block.js:38 +#: blocks/account-links-section/block.js:38 +#: blocks/account-membership-section/block.js:38 +#: blocks/account-page/block.js:58 blocks/account-profile-section/block.js:39 +#: blocks/billing-page/block.js:38 blocks/cancel-page/block.js:38 +#: blocks/checkout-page/block.js:51 blocks/confirmation-page/block.js:38 +#: blocks/invoice-page/block.js:38 blocks/levels-page/block.js:38 +#: blocks/login/block.js:46 blocks/member-profile-edit/block.js:33 +#: js/blocks.build.js:135 js/blocks.build.js:192 js/blocks.build.js:249 +#: js/blocks.build.js:340 js/blocks.build.js:508 js/blocks.build.js:565 +#: js/blocks.build.js:693 js/blocks.build.js:1001 js/blocks.build.js:1152 +#: js/blocks.build.js:1222 js/blocks.build.js:1279 js/blocks.build.js:1342 +#: js/blocks.build.js:1502 +msgid "Paid Memberships Pro" +msgstr "Paid Memberships Pro" + +#. Plugin URI of the plugin +msgid "https://www.paidmembershipspro.com" +msgstr "https://www.paidmembershipspro.com" + +#. Description of the plugin +msgid "The most complete member management and membership subscriptions plugin for WordPress." +msgstr "Das umfassendste Plugin für Mitgliederverwaltung und Mitgliedsbeiträge für WordPress." + +#. Author of the plugin +msgid "Stranger Studios" +msgstr "Stranger Studios" + +#. Author URI of the plugin +msgid "https://www.strangerstudios.com" +msgstr "https://www.strangerstudios.com" + +#: adminpages/admin_header.php:27 adminpages/admin_header.php:29 +msgid "Next step:" +msgstr "Nächster Schritt:" + +#: adminpages/admin_header.php:129 +msgid "The billing details for some of your discount codes are not supported by your gateway." +msgstr "Die Rechnungsdaten für einige Ihrer Rabattcodes werden von Ihrem Gateway nicht unterstützt." + +#: adminpages/admin_header.php:133 +msgid "The billing details for this discount code are not supported by your gateway." +msgstr "Die Rechnungsdaten für diesen Rabattcode werden von Ihrem Gateway nicht unterstützt." + +#: adminpages/admin_header.php:137 +msgid "The discount codes with issues are highlighted below." +msgstr "Die Rabattcodes mit Ausgaben sind unten hervorgehoben." + +#: adminpages/admin_header.php:139 +msgid "Please edit your discount codes" +msgstr "Bitte bearbeiten Sie Ihre Rabattcodes" + +#: adminpages/admin_header.php:177 +msgid "Valid License" +msgstr "Gültige Lizenz" + +#: adminpages/admin_header.php:179 +msgid "No License" +msgstr "Keine Lizenz" + +#: adminpages/admin_header.php:222 includes/adminpages.php:51 +#: includes/adminpages.php:146 +msgid "Dashboard" +msgstr "Dashboard" + +#: adminpages/admin_header.php:226 includes/adminpages.php:52 +#: includes/adminpages.php:158 +msgid "Members" +msgstr "Mitglieder" + +#: adminpages/admin_header.php:238 includes/adminpages.php:55 +#: includes/adminpages.php:194 +msgid "Settings" +msgstr "Einstellungen" + +#: adminpages/admin_header.php:246 includes/adminpages.php:65 +msgid "License" +msgstr "Lizenz" + +#: adminpages/admin_header.php:265 +msgid "Payment Gateway & SSL Settings" +msgstr "Zahlungs-Gateway & SSL-Einstellungen" + +#: adminpages/admin_header.php:273 adminpages/emailtemplates.php:20 +#: includes/adminpages.php:72 +msgid "Email Templates" +msgstr "E-Mail-Vorlagen" + +#: adminpages/advancedsettings.php:106 includes/updates/upgrade_1.php:7 +msgid "This content is for !!levels!! members only.
    Join Now" +msgstr "Dieser Inhalt ist nur für !!levels!! Mitglieder.
    Jetzt registrieren" + +#: adminpages/advancedsettings.php:111 +msgid "This content is for !!levels!! members only.
    Log In Join Now" +msgstr "Dieser Inhalt ist nur für !!levels!! Mitglieder.
    Einloggen Registrieren" + +#: adminpages/advancedsettings.php:135 +msgid "Restrict Dashboard Access" +msgstr "Zugang zum Dashboard einschränken" + +#: adminpages/advancedsettings.php:140 +msgid "WordPress Dashboard" +msgstr "WordPress Dashboard" + +#: adminpages/advancedsettings.php:143 +msgid "Block all users with the Subscriber role from accessing the Dashboard." +msgstr "Alle Benutzer mit der Rolle „Abonnent“ für den Zugriff auf das Dashboard sperren." + +#: adminpages/advancedsettings.php:148 +msgid "WordPress Toolbar" +msgstr "WordPress Werkzeugleiste" + +#: adminpages/advancedsettings.php:151 +msgid "Hide the Toolbar from all users with the Subscriber role." +msgstr "Die Werkzeugleiste für alle Benutzer mit der Rolle „Abonnent“ ausblenden." + +#: adminpages/advancedsettings.php:159 +msgid "Message Settings" +msgstr "Nachrichteneinstellungen" + +#: adminpages/advancedsettings.php:177 adminpages/advancedsettings.php:186 +msgid "Available variables" +msgstr "Verfügbare Variablen" + +#: adminpages/advancedsettings.php:224 +msgid "Checkout Settings" +msgstr "Checkout Einstellungen" + +#: adminpages/advancedsettings.php:257 +msgid "reCAPTCHA Version" +msgstr "reCAPTCHA Version" + +#: adminpages/advancedsettings.php:260 +msgid " v2 - Checkbox" +msgstr " v2-Checkbox" + +#: adminpages/advancedsettings.php:261 +msgid "v3 - Invisible" +msgstr "v3 - Unsichtbar" + +#: adminpages/advancedsettings.php:263 +msgid "Changing your version will require new API keys." +msgstr "Wenn Sie Ihre Version ändern, benötigen Sie neue API-Schlüssel." + +#: adminpages/advancedsettings.php:283 +msgid "Communication Settings" +msgstr "Kommunikationseinstellungen" + +#: adminpages/advancedsettings.php:286 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: adminpages/advancedsettings.php:290 +msgid "Show all notifications." +msgstr "Alle Benachrichtigungen anzeigen." + +#: adminpages/advancedsettings.php:293 +msgid "Show only security notifications." +msgstr "Nur Sicherheitsbenachrichtigungen anzeigen." + +#: adminpages/advancedsettings.php:297 +msgid "Notifications are occasionally shown on the Paid Memberships Pro settings pages." +msgstr "Benachrichtigungen werden gelegentlich auf den Einstellungsseiten für bezahlte Mitgliedschaften Pro angezeigt." + +#: adminpages/advancedsettings.php:302 +msgid "Activity Email Frequency" +msgstr "Aktivität E-Mail-Häufigkeit" + +#: adminpages/advancedsettings.php:310 +msgid "Weekly" +msgstr "Wöchentlich" + +#: adminpages/advancedsettings.php:320 +msgid "Send periodic sales and revenue updates from this site to the administration email address." +msgstr "Senden Sie regelmäßige Updates zu Verkäufen und Einnahmen von dieser Website an die E-Mail-Adresse der Verwaltung." + +#: adminpages/advancedsettings.php:473 adminpages/advancedsettings.php:475 +msgid "Uninstall PMPro on deletion?" +msgstr "PMPro bei Löschung deinstallieren?" + +#: adminpages/advancedsettings.php:478 adminpages/advancedsettings.php:480 +msgid "Yes - Delete all PMPro Data." +msgstr "Ja - Alle PMPro-Daten löschen." + +#: adminpages/dashboard.php:12 +msgid "Welcome to Paid Memberships Pro" +msgstr "Willkommen bei Paid Memberships Pro" + +#: adminpages/dashboard.php:40 +msgid "Recent Members" +msgstr "Neue Mitglieder" + +#: adminpages/dashboard.php:47 +msgid "Recent Orders" +msgstr "Aktuelle Aufträge" + +#: adminpages/dashboard.php:54 +msgid "Paid Memberships Pro News and Updates" +msgstr "Paid Memberships Pro Neuigkeiten und Updates" + +#: adminpages/dashboard.php:108 +msgid "Initial Setup" +msgstr "Erstmalige Einrichtung" + +#: adminpages/dashboard.php:113 adminpages/membershiplevels.php:779 +msgid "Create a Membership Level" +msgstr "Eine Mitgliedschafts-Paket erstellen" + +#: adminpages/dashboard.php:115 +msgid "View Membership Levels" +msgstr "Ansicht Mitgliedschafts-Pakete" + +#: adminpages/dashboard.php:123 +msgid "Generate Membership Pages" +msgstr "Mitgliedschaftsseiten generieren" + +#: adminpages/dashboard.php:125 +msgid "Manage Membership Pages" +msgstr "Mitgliedschaftsseiten verwalten" + +#: adminpages/dashboard.php:133 adminpages/dashboard.php:135 +msgid "Configure Payment Settings" +msgstr "Zahlungseinstellungen konfigurieren" + +#: adminpages/dashboard.php:143 +msgid "Confirm Email Settings" +msgstr "Bestätigen Sie die E-Mail-Einstellungen" + +#: adminpages/dashboard.php:147 adminpages/dashboard.php:151 +msgid "View Advanced Settings" +msgstr "Erweiterte Einstellungen anzeigen" + +#: adminpages/dashboard.php:151 adminpages/dashboard.php:155 +msgid "Explore Add Ons for Additional Features" +msgstr "Erkunden Sie Add Ons für zusätzliche Funktionen" + +#: adminpages/dashboard.php:156 adminpages/dashboard.php:160 +msgid "For guidance as your begin these steps," +msgstr "Sie können sich bei diesen Schritten beraten lassen," + +#: adminpages/dashboard.php:157 adminpages/dashboard.php:161 +msgid "view the Initial Setup Video and Docs." +msgstr "sehen Sie sich das Video und die Dokumente zur Ersteinrichtung an." + +#: adminpages/dashboard.php:161 adminpages/dashboard.php:165 +msgid "Support License" +msgstr "Support Lizenz" + +#: adminpages/dashboard.php:169 adminpages/dashboard.php:173 +msgid "No support license key found." +msgstr "Kein Support-Lizenzschlüssel gefunden." + +#: adminpages/dashboard.php:170 adminpages/dashboard.php:174 +msgid "Enter your key here »" +msgstr "Geben Sie hier Ihren Schlüssel ein »" + +#: adminpages/dashboard.php:175 adminpages/dashboard.php:179 +msgid "View your membership account to verify your license key." +msgstr "Sie können Ihr Mitgliedskonto einsehen, um Ihren Lizenzschlüssel zu überprüfen." + +#: adminpages/dashboard.php:177 adminpages/license.php:51 +#: adminpages/dashboard.php:181 adminpages/license.php:43 +msgid "Thank you! A valid %s license key has been used to activate your support license on this site." +msgstr "Thank you! A valid %s license key has been used to activate your support license on this site." + +#: adminpages/dashboard.php:181 adminpages/dashboard.php:185 +msgid "An annual support license is recommended for websites running Paid Memberships Pro." +msgstr "Für Websites, die Paid Memberships Pro verwenden, wird eine jährliche Support-Lizenz empfohlen." + +#: adminpages/dashboard.php:181 adminpages/dashboard.php:185 +msgid "View Pricing »" +msgstr "Preise anzeigen »" + +#: adminpages/dashboard.php:182 adminpages/dashboard.php:186 +msgid "Upgrade" +msgstr "Upgrade" + +#: adminpages/dashboard.php:185 adminpages/dashboard.php:189 +msgid "Paid Memberships Pro and our add ons are distributed under the GPLv2 license. This means, among other things, that you may use the software on this site or any other site free of charge." +msgstr "Paid Memberships Pro und unsere Add-ons werden unter der GPLv2-Lizenz vertrieben. Dies bedeutet unter anderem, dass Sie die Software auf dieser oder einer anderen Website kostenlos verwenden dürfen." + +#: adminpages/dashboard.php:188 adminpages/dashboard.php:192 +msgid "Get Involved" +msgstr "Engagieren Sie sich" + +#: adminpages/dashboard.php:189 adminpages/dashboard.php:193 +msgid "There are many ways you can help support Paid Memberships Pro." +msgstr "Es gibt viele Möglichkeiten, wie Sie Paid Memberships Pro unterstützen können." + +#: adminpages/dashboard.php:190 adminpages/dashboard.php:194 +msgid "Get involved with our plugin development via GitHub." +msgstr "Beteiligen Sie sich an unserer Plugin-Entwicklung über GitHub." + +#: adminpages/dashboard.php:190 adminpages/dashboard.php:194 +msgid "View on GitHub" +msgstr "Ansicht auf GitHub" + +#: adminpages/dashboard.php:192 adminpages/dashboard.php:196 +msgid "Subscribe to our YouTube Channel." +msgstr "Abonnieren Sie unseren YouTube-Kanal." + +#: adminpages/dashboard.php:193 adminpages/dashboard.php:197 +msgid "Follow us on Facebook." +msgstr "Folgen Sie uns auf Facebook." + +#: adminpages/dashboard.php:194 adminpages/dashboard.php:198 +msgid "Follow @pmproplugin on Twitter." +msgstr "Folgen Sie @pmproplugin auf Twitter." + +#: adminpages/dashboard.php:195 adminpages/dashboard.php:199 +msgid "Share an honest review at WordPress.org." +msgstr "Schreiben Sie eine ehrliche Bewertung auf WordPress.org." + +#: adminpages/dashboard.php:198 adminpages/dashboard.php:202 +msgid "Help translate Paid Memberships Pro into your language." +msgstr "Helfen Sie bei der Übersetzung von Paid Memberships Pro in Ihre Sprache." + +#: adminpages/dashboard.php:198 adminpages/dashboard.php:202 +msgid "Translation Dashboard" +msgstr "Übersetzung Dashboard" + +#: adminpages/dashboard.php:265 adminpages/dashboard.php:269 +msgid "View All Members " +msgstr "Alle Mitglieder anzeigen" + +#: adminpages/dashboard.php:356 adminpages/dashboard.php:360 +msgid "View All Orders " +msgstr "Alle Bestellungen anzeigen " + +#: adminpages/dashboard.php:387 +#: classes/class-pmpro-admin-activity-email.php:346 +#: adminpages/dashboard.php:391 +msgid "No news found." +msgstr "Keine Neuigkeiten gefunden." + +#: adminpages/dashboard.php:393 adminpages/dashboard.php:397 +msgid "Posted %s" +msgstr "Gesendet %s" + +#: adminpages/dashboard.php:401 adminpages/dashboard.php:405 +msgid "View More" +msgstr "Mehr anzeigen" + +#: adminpages/discountcodes.php:358 adminpages/membershiplevels.php:169 +#: adminpages/discountcodes.php:360 +msgid "WARNING: A level was set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a specific time period. For more information, see our post here." +msgstr "WARNUNG: Eine Stufe wurde sowohl mit einem wiederkehrenden Rechnungsbetrag als auch mit einem Ablaufdatum festgelegt. Sie müssen nur eines davon festlegen, es sei denn, Sie möchten wirklich, dass diese Mitgliedschaft nach einer bestimmten Zeitspanne ausläuft. Weitere Informationen finden Sie in unserem Beitrag hier." + +#: adminpages/discountcodes.php:622 adminpages/membershiplevels.php:450 +#: adminpages/discountcodes.php:624 +msgid "Stripe integration does not allow billing periods longer than 1 year." +msgstr "Die Stripe-Integration erlaubt keine Abrechnungszeiträume von mehr als 1 Jahr." + +#: adminpages/discountcodes.php:643 adminpages/membershiplevels.php:480 +#: adminpages/discountcodes.php:645 +msgid "Optional: Allow billing limits with Stripe using the Stripe Billing Limits Add On." +msgstr "Optional: Erlauben Sie Abrechnungslimits mit Stripe unter Verwendung des Stripe Billing Limits Add On." + +#: adminpages/discountcodes.php:697 adminpages/membershiplevels.php:580 +#: adminpages/discountcodes.php:699 +msgid "Hour(s)" +msgstr "Stunde(n)" + +#: adminpages/discountcodes.php:754 adminpages/discountcodes.php:756 +msgid "No Discount Codes Found" +msgstr "Keine Rabatt-Codes gefunden" + +#: adminpages/discountcodes.php:755 adminpages/discountcodes.php:757 +msgid "Discount codes allow you to override your membership level's default pricing." +msgstr "Mit Rabattcodes können Sie die Standardpreise für Ihre Mitgliedschaft außer Kraft setzen." + +#: adminpages/discountcodes.php:756 adminpages/discountcodes.php:758 +msgid "Create a Discount Code" +msgstr "Einen Rabattcode erstellen" + +#: adminpages/discountcodes.php:757 adminpages/discountcodes.php:759 +msgid "Documentation: Discount Codes" +msgstr "Dokumentation: Rabatt-Codes" + +#: adminpages/discountcodes.php:807 adminpages/discountcodes.php:809 +msgid "Edit Code: %s" +msgstr "Code bearbeiten: %s" + +#: adminpages/discountcodes.php:810 adminpages/membershiplevels.php:833 +#: adminpages/orders.php:1366 includes/profile.php:443 +#: adminpages/discountcodes.php:833 adminpages/discountcodes.php:843 +#: adminpages/membershiplevels.php:858 adminpages/membershiplevels.php:868 +#: adminpages/orders.php:1396 adminpages/orders.php:1406 +#: adminpages/discountcodes.php:835 adminpages/discountcodes.php:845 +msgid "Edit" +msgstr "Bearbeiten" + +#: adminpages/discountcodes.php:813 adminpages/membershiplevels.php:834 +#: adminpages/orders.php:1369 adminpages/discountcodes.php:847 +#: adminpages/discountcodes.php:858 adminpages/membershiplevels.php:872 +#: adminpages/membershiplevels.php:883 adminpages/orders.php:1410 +#: adminpages/orders.php:1421 adminpages/discountcodes.php:849 +#: adminpages/discountcodes.php:860 +msgid "Copy" +msgstr "Kopieren" + +#: adminpages/discountcodes.php:820 +msgid " View Orders" +msgstr "Bestellungen anzeigen" + +#: adminpages/emailsettings.php:87 +msgid "Send Emails From" +msgstr "E-Mails senden von" + +#: adminpages/emailsettings.php:119 adminpages/emailsettings.php:173 +msgid "Save All Settings" +msgstr "Alle Einstellungen speichern" + +#: adminpages/emailsettings.php:122 +msgid "Email Deliverability" +msgstr "E-Mail-Zustellbarkeit" + +#: adminpages/emailsettings.php:133 +msgid "If you are having issues with email delivery from your server, please read our email troubleshooting guide. As an alternative, Paid Memberships Pro offers built-in integration for SendWP. Optional: SendWP is a third-party service for transactional email in WordPress. Click here to learn more about SendWP and Paid Memberships Pro." +msgstr "Wenn Sie Probleme mit der E-Mail-Zustellung von Ihrem Server haben, lesen Sie bitte unseren Leitfaden zur E-Mail-Fehlerbehebung. Als Alternative bietet Paid Memberships Pro eine integrierte Integration für SendWP. Optional: SendWP ist ein Drittanbieterdienst für Transaktions-E-Mails in WordPress. Klicken Sie hier, um mehr über SendWP und Paid Memberships Pro zu erfahren." + +#: adminpages/emailsettings.php:141 +msgid "Connect to SendWP" +msgstr "Mit SendWP verbinden" + +#: adminpages/emailsettings.php:143 +msgid "Disconnect from SendWP" +msgstr "Trennen Sie die Verbindung zu SendWP" + +#: adminpages/emailsettings.php:149 +msgid "Your site is connected to SendWP." +msgstr "Ihre Website ist mit SendWP verbunden." + +#: adminpages/emailsettings.php:149 +msgid "View Your SendWP Account" +msgstr "Ihr SendWP-Konto anzeigen" + +#: adminpages/emailsettings.php:150 +msgid "Please enable email sending inside %s." +msgstr "Bitte aktivieren Sie den E-Mail-Versand innerhalb von %s." + +#: adminpages/emailsettings.php:157 +msgid "Other Email Settings" +msgstr "Andere E-Mail-Einstellungen" + +#: adminpages/emailsettings.php:166 +msgid "Default WP notification email." +msgstr "Standard-WP-Benachrichtigungs-E-Mail." + +#: adminpages/emailsettings.php:167 +msgid "Recommended: Leave unchecked. Members will still get an email confirmation from PMPro after checkout." +msgstr "Empfohlen: Unmarkiert lassen. Die Mitglieder erhalten nach der Buchung trotzdem eine E-Mail-Bestätigung von PMPro." + +#: adminpages/emailtemplates.php:23 +msgid "Select an email template from the dropdown below to customize the subject and body of emails sent through your membership site. You can also disable a specific email or send a test version through this admin page." +msgstr "Wählen Sie eine E-Mail-Vorlage aus dem Dropdown-Menü aus, um den Betreff und den Text der E-Mails, die über Ihre Mitgliederseite versendet werden, anzupassen. Sie können auch eine bestimmte E-Mail deaktivieren oder eine Testversion über diese Verwaltungsseite senden." + +#: adminpages/emailtemplates.php:23 +msgid "Click here for a description of each email sent to your members and admins at different stages of the member experience." +msgstr "Klicken Sie hier, um eine Beschreibung der einzelnen E-Mails zu erhalten, die an Ihre Mitglieder und Administratoren in den verschiedenen Stadien der Mitgliedschaft gesendet werden." + +#: adminpages/emailtemplates.php:38 +msgid "Email Template" +msgstr "E-Mail-Vorlage" + +#: adminpages/emailtemplates.php:42 +msgid "Select a Template to Edit" +msgstr "Wählen Sie eine Vorlage zum Bearbeiten" + +#: adminpages/emailtemplates.php:58 +msgid "Disable this email?" +msgstr "Diese E-Mail deaktivieren?" + +#: adminpages/emailtemplates.php:61 +msgid "Emails with this template will not be sent." +msgstr "E-Mails mit dieser Vorlage werden nicht versendet." + +#: adminpages/emailtemplates.php:66 +msgid "Subject" +msgstr "Betreff" + +#: adminpages/emailtemplates.php:73 +msgid "Body" +msgstr "Body" + +#: adminpages/emailtemplates.php:84 +msgid "Send a test email to " +msgstr "Senden Sie eine Test-E-Mail an " + +#: adminpages/emailtemplates.php:87 +msgid "Save Template and Send Email" +msgstr "Vorlage speichern und E-Mail senden" + +#: adminpages/emailtemplates.php:92 +msgid "Your current membership will be used for any membership level data." +msgstr "Ihre aktuelle Mitgliedschaft wird für alle Daten der Mitgliedschaftsebene verwendet." + +#: adminpages/emailtemplates.php:101 +msgid "Save Template" +msgstr "Vorlage speichern" + +#: adminpages/emailtemplates.php:104 +msgid "Reset Template" +msgstr "Vorlage zurücksetzen" + +#: adminpages/emailtemplates.php:114 +msgid "Variable Reference" +msgstr "Variable Referenz" + +#: adminpages/emailtemplates.php:116 +msgid "Use the placeholder variables below to customize your member and admin emails with specific user or membership data." +msgstr "Verwenden Sie die unten stehenden Platzhaltervariablen, um Ihre Mitglieder- und Admin-E-Mails mit spezifischen Benutzer- oder Mitgliedsdaten zu versehen." + +#: adminpages/emailtemplates.php:120 +msgid "General Settings / Membership Info" +msgstr "Allgemeine Einstellungen / Mitgliedschaftsinformationen" + +#: adminpages/emailtemplates.php:126 adminpages/emailtemplates.php:136 +msgid "Display Name (Profile/Edit User > Display name publicly as)" +msgstr "Anzeigename (Profil/Benutzer bearbeiten > Anzeigename öffentlich als)" + +#: adminpages/emailtemplates.php:128 +msgid "Site Title" +msgstr "Seitentitel" + +#: adminpages/emailtemplates.php:129 +msgid "Site Email Address (General Settings > Email OR Memberships > Settings > Email Settings)" +msgstr "Website-E-Mail-Adresse (Allgemeine Einstellungen > E-Mail ODER Mitgliedschaften > Einstellungen > E-Mail-Einstellungen)" + +#: adminpages/emailtemplates.php:131 +msgid "Membership Level Name" +msgstr "Name der Mitgliedschafts-Paket" + +#: adminpages/emailtemplates.php:132 +msgid "Membership Level Change" +msgstr "Änderung des Mitgliedschafts-Paketes" + +#: adminpages/emailtemplates.php:133 +msgid "Membership Level Expiration" +msgstr "Ablauf des Mitgliedschafts-Paketes" + +#: adminpages/emailtemplates.php:134 +msgid "Membership Start Date" +msgstr "Datum des Beginns der Mitgliedschaft" + +#: adminpages/emailtemplates.php:135 +msgid "Membership End Date" +msgstr "Enddatum der Mitgliedschaft" + +#: adminpages/emailtemplates.php:138 +msgid "Login URL" +msgstr "Login URL" + +#: adminpages/emailtemplates.php:139 +msgid "Membership Levels Page URL" +msgstr "URL des Mitgliedschafts-Paketes" + +#: adminpages/emailtemplates.php:162 +msgid "Billing Info Complete Address" +msgstr "Vollständige Rechnungsadresse" + +#: adminpages/emailtemplates.php:163 +msgid "Billing Info Name" +msgstr "Rechnungsdaten Name" + +#: adminpages/emailtemplates.php:164 +msgid "Billing Info Street Address" +msgstr "Rechnungsdaten Straße und Hausnummer" + +#: adminpages/emailtemplates.php:165 +msgid "Billing Info City" +msgstr "Rechnungsdaten Stadt" + +#: adminpages/emailtemplates.php:166 +msgid "Billing Info State" +msgstr "Rechnungsdaten Bundesland" + +#: adminpages/emailtemplates.php:167 +msgid "Billing Info ZIP Code" +msgstr "Rechnungsdaten Postleitzahl" + +#: adminpages/emailtemplates.php:168 +msgid "Billing Info Country" +msgstr "Rechnungsdaten Land" + +#: adminpages/emailtemplates.php:169 +msgid "Billing Info Phone #" +msgstr "Rechnungsdaten Telefonnummer" + +#: adminpages/emailtemplates.php:171 +msgid "Credit Card Number (last 4 digits)" +msgstr "Kreditkartennummer (letzte 4 Ziffern)" + +#: adminpages/emailtemplates.php:172 +msgid "Credit Card Expiration Month (mm format)" +msgstr "Ablaufmonat der Kreditkarte (Format mm)" + +#: adminpages/emailtemplates.php:173 +msgid "Credit Card Expiration Year (yyyy format)" +msgstr "Ablaufjahr der Kreditkarte (Format yyyy)" + +#: adminpages/emailtemplates.php:174 +msgid "Membership Level Cost Text" +msgstr "Mitgliedschafts-Paket Kosten Text" + +#: adminpages/emailtemplates.php:175 +msgid "Payment Instructions (used in Checkout - Email Template)" +msgstr "Zahlungsanweisungen (verwendet in Checkout - E-Mail-Vorlage)" + +#: adminpages/emailtemplates.php:176 includes/profile.php:423 +msgid "Invoice ID" +msgstr "Rechnung ID" + +#: adminpages/emailtemplates.php:177 +msgid "Invoice Total" +msgstr "Rechnung Gesamt" + +#: adminpages/emailtemplates.php:178 +msgid "Invoice Date" +msgstr "Rechnungsdatum" + +#: adminpages/emailtemplates.php:179 +msgid "Invoice Page URL" +msgstr "URL der Rechnungsseite" + +#: adminpages/emailtemplates.php:180 +msgid "Discount Code Applied" +msgstr "Rabattcode angewendet" + +#: adminpages/license.php:47 adminpages/license.php:39 +msgid "Enter your support license key. Your license key can be found in your membership email receipt or in your Membership Account." +msgstr "Geben Sie Ihren Support-Lizenzschlüssel ein. Sie finden Ihren Lizenzschlüssel in Ihrer E-Mail-Bestätigung für die Mitgliedschaft oder in Ihrem Mitgliedskonto." + +#: adminpages/license.php:49 adminpages/license.php:37 +#: adminpages/license.php:41 +msgid "Visit the PMPro Membership Account page to confirm that your account is active and to find your license key." +msgstr "Besuchen Sie die PMPro Mitgliedskonto Seite, um zu bestätigen, dass Ihr Konto aktiv ist und um Ihren Lizenzschlüssel zu finden." + +#: adminpages/license.php:61 adminpages/license.php:53 +msgid "Validate Key" +msgstr "Schlüssel bestätigen" + +#: adminpages/license.php:95 adminpages/license.php:87 +msgid "Paid Memberships Pro and our Add Ons are distributed under the GPLv2 license. This means, among other things, that you may use the software on this site or any other site free of charge." +msgstr "Paid Memberships Pro und unsere Add Ons werden unter der GPLv2 license vertrieben. Dies bedeutet unter anderem, dass Sie die Software auf dieser oder einer anderen Website kostenlos nutzen dürfen." + +#: adminpages/membershiplevels.php:391 +msgid "Check to include this message in the membership confirmation email." +msgstr "Prüfen Sie, ob diese Nachricht in der E-Mail zur Bestätigung der Mitgliedschaft enthalten ist." + +#: adminpages/membershiplevels.php:459 +msgid "You will need to create a \"Plan\" in your Braintree dashboard with the same settings and the \"Plan ID\" set to %s." +msgstr "Sie müssen einen „Tarif“ in Ihrem Braintree-Dashboard mit den gleichen Einstellungen und der „Tarif-ID“ auf %s erstellen." + +#: adminpages/membershiplevels.php:506 +msgid "Optional: Allow more customizable trial periods and renewal dates using the Subscription Delays Add On." +msgstr "Optional: Erlauben Sie weitere anpassbare Testzeiträume und Verlängerungsdaten mit dem Subscription Delays Add On." + +#: adminpages/membershiplevels.php:571 +msgid "Optional: Allow more customizable expiration dates using the Set Expiration Date Add On." +msgstr "Optional: Ermöglichen Sie weitere anpassbare Ablaufdaten mit dem Ablaufdatum festlegen - Add On ." + +#: adminpages/membershiplevels.php:589 +msgid "WARNING: This level is set with both a recurring billing amount and an expiration date. You only need to set one of these unless you really want this membership to expire after a certain number of payments. For more information, see our post here." +msgstr "ACHTUNG: Für diese Stufe sind sowohl ein wiederkehrender Rechnungsbetrag als auch ein Verfallsdatum festgelegt. Sie müssen nur eines davon festlegen, es sei denn, Sie möchten wirklich, dass diese Mitgliedschaft nach einer bestimmten Anzahl von Zahlungen ausläuft. Weitere Informationen finden Sie in unserem Beitrag hier." + +#: adminpages/membershiplevels.php:640 +msgid "Non-members will not see posts in these categories. You can update this setting here." +msgstr "Nicht-Mitglieder sehen keine Beiträge in diesen Kategorien. Sie können diese Einstellung hier aktualisieren." + +#: adminpages/membershiplevels.php:644 +msgid "Non-members will see the title and excerpt for posts in these categories. You can update this setting here." +msgstr "Nicht-Mitglieder sehen den Titel und den Textauszug für Beiträge in diesen Kategorien. Sie können diese Einstellung hier aktualisieren." + +#: adminpages/membershiplevels.php:647 +msgid "Non-members will see the title only for posts in these categories. You can update this setting here." +msgstr "Nicht-Mitglieder sehen den Titel nur für Beiträge in diesen Kategorien. Sie können diese Einstellung hier aktualisieren." + +#: adminpages/membershiplevels.php:778 adminpages/membershiplevels.php:819 +msgid "No Membership Levels Found" +msgstr "Keine Mitgliedschaftsebenen gefunden" + +#: adminpages/membershiplevels.php:780 +msgid "Video: Membership Levels" +msgstr "Video: Mitgliedschaftspakete" + +#: adminpages/memberslist.php:41 +msgid "Optional: Capture additional member profile fields using the Register Helper Add On." +msgstr "Optional: Erfassen Sie zusätzliche Mitgliederprofilfelder mit dem Register Helper Add On." + +#: adminpages/orders.php:862 includes/profile.php:109 adminpages/orders.php:868 +msgid "at" +msgstr "Bei" + +#: adminpages/orders.php:1024 adminpages/orders.php:1030 +msgid "With a Discount Code" +msgstr "Mit einem Rabattcode" + +#: adminpages/orders.php:1028 adminpages/orders.php:1034 +msgid "Only Paid Orders" +msgstr "Only Paid Orders" + +#: adminpages/orders.php:1030 adminpages/orders.php:1036 +msgid "Only Free Orders" +msgstr "Nur kostenlose Bestellungen" + +#: adminpages/orders.php:1073 adminpages/orders.php:1079 +msgid "Last Month" +msgstr "Letzter Monat" + +#: adminpages/orders.php:1077 adminpages/orders.php:1083 +msgid "Last Year" +msgstr "Letztes Jahr" + +#: adminpages/pagesettings.php:86 adminpages/pagesettings.php:100 +msgid "Your Profile" +msgstr "Ihr Profil" + +#: adminpages/pagesettings.php:99 includes/login.php:481 includes/login.php:717 +#: includes/menus.php:66 includes/menus.php:70 includes/menus.php:160 +msgid "Log In" +msgstr "Log In" + +#: adminpages/pagesettings.php:114 +msgid "Found an existing version of the %s page and used that one." +msgstr "Ich habe eine bestehende Version der Seite %s gefunden und diese verwendet." + +#: adminpages/pagesettings.php:117 +msgid "Error generating the %s page. You will have to choose or create one manually." +msgstr "Fehler beim Generieren der %s-Seite. Sie müssen eine Seite auswählen oder manuell erstellen." + +#: adminpages/pagesettings.php:174 +msgid "Manage Pages" +msgstr "Seiten verwalten" + +#: adminpages/pagesettings.php:175 +msgid "Several frontend pages are required for your Paid Memberships Pro site." +msgstr "Für Ihre Paid Memberships Pro-Website sind mehrere Frontend-Seiten erforderlich." + +#: adminpages/pagesettings.php:176 +msgid "Generate Pages For Me" +msgstr "Seiten für mich erstellen" + +#: adminpages/pagesettings.php:177 +msgid "Create Pages Manually" +msgstr "Seiten manuell erstellen" + +#: adminpages/pagesettings.php:199 +msgid "or the Membership Account block" +msgstr "oder den Block Mitgliedskonto" + +#: adminpages/pagesettings.php:216 +msgid "or the Membership Billing block" +msgstr "oder den Block „Abrechnung der Mitgliedschaft“" + +#: adminpages/pagesettings.php:233 +msgid "or the Membership Cancel block" +msgstr "oder den Block Mitgliedschaft kündigen" + +#: adminpages/pagesettings.php:251 +msgid "or the Membership Checkout block" +msgstr "oder den Block Mitgliedschaft Checkout" + +#: adminpages/pagesettings.php:269 +msgid "or the Membership Confirmation block" +msgstr "oder den Block „Bestätigung der Mitgliedschaft“" + +#: adminpages/pagesettings.php:287 +msgid "or the Membership Invoice block" +msgstr "oder der Block „Mitgliedschaftsrechnungen“" + +#: adminpages/pagesettings.php:305 +msgid "or the Membership Levels block" +msgstr "oder den Block Mitgliedschafts-Pakete" + +#: adminpages/pagesettings.php:315 +msgid "Optional: Customize your Membership Levels page using the Advanced Levels Page Add On." +msgstr "Optional: Passen Sie Ihre Seite für die Mitgliedschafts-Pakete mit dem Erweiterte Pakete Seite - Add On an." + +#: adminpages/pagesettings.php:321 +msgid "Log In Page" +msgstr "Log In Seite" + +#: adminpages/pagesettings.php:328 adminpages/pagesettings.php:356 +msgid "Use WordPress Default" +msgstr "WordPress-Standard verwenden" + +#: adminpages/pagesettings.php:344 +msgid "Include the shortcode %s or the Log In Form block." +msgstr "Fügen Sie den Shortcode %s oder den Block Log In Form ein." + +#: adminpages/pagesettings.php:349 includes/adminpages.php:358 +msgid "Member Profile Edit Page" +msgstr "Mitgliedsprofil bearbeiten Seite" + +#: adminpages/pagesettings.php:372 +msgid "Include the shortcode %s or the Member Profile Edit block." +msgstr "Fügen Sie den Shortcode %s oder den Block „Mitgliederprofil bearbeiten“ ein." + +#: adminpages/pagesettings.php:382 +msgid "Optional: Collect additional member fields at checkout, on the profile, or for admin-use only using the Register Helper Add On." +msgstr "Optional: Erfassen Sie zusätzliche Mitgliederfelder an der Kasse, im Profil oder nur für den Administrator mit dem Register Helper Add On." + +#: adminpages/paymentsettings.php:115 +msgid "Learn more about SSL or Payment Gateway Settings." +msgstr "Erfahren Sie mehr über SSL oder Payment Gateway Einstellungen." + +#: adminpages/paymentsettings.php:142 +msgid "This gateway is for membership sites with Free levels or for sites that accept payment offline." +msgstr "Dieses Gateway ist für Mitgliedschaftsseiten mit kostenlosen Pakete oder für Seiten, die Zahlungen offline akzeptieren." + +#: adminpages/paymentsettings.php:142 +msgid "It is not connected to a live gateway environment and cannot accept payments." +msgstr "Es besteht keine Verbindung mit einer Live-Gateway-Umgebung und kann keine Zahlungen annehmen." + +#: adminpages/paymentsettings.php:241 +msgid "US only. If values are given, tax will be applied for any members ordering from the selected state.
    For non-US or more complex tax rules, use the pmpro_tax filter." +msgstr "Nur USA. Wenn Werte angegeben werden, wird die Steuer auf alle Mitglieder angewandt, die aus dem ausgewählten Staat bestellen.
    Für nicht-amerikanische oder komplexere Steuerregeln verwenden Sie den pmpro_tax Filter." + +#: adminpages/paymentsettings.php:282 +msgid "Your SSL Certificate must be installed by your web host. Use this field to display your seal or other trusted merchant images. This field does not accept JavaScript." +msgstr "Ihr SSL-Zertifikat muss von Ihrem Webhost installiert werden. Verwenden Sie dieses Feld, um Ihr Siegel oder andere vertrauenswürdige Bilder von Händlern anzuzeigen. Dieses Feld akzeptiert kein JavaScript." + +#: adminpages/reports/history.php:4 adminpages/reports/history.php:84 +msgid "Member Value Report" +msgstr "Mitgliederwertbericht" + +#: adminpages/reports/history.php:25 +msgid "No paying members found." +msgstr "Keine zahlenden Mitglieder gefunden." + +#: adminpages/reports/history.php:27 +msgid "Your Top 10 Members" +msgstr "Ihre Top 10 Mitglieder" + +#: adminpages/reports/history.php:33 +msgid "Member" +msgstr "Mitglied" + +#: adminpages/reports/history.php:35 +msgid "Total Value" +msgstr "Gesamt" + +#: adminpages/reports/history.php:47 classes/class.memberorder.php:967 +msgid "Edit User" +msgstr "Benutzer bearbeiten" + +#: adminpages/reports/history.php:185 +msgid "Current Membership" +msgstr "Aktuelle Mitgliedschaft" + +#: adminpages/reports/history.php:188 includes/profile.php:411 +msgid "Total Paid" +msgstr "Bezahlte Summe" + +#: adminpages/reports/login.php:44 +msgid "This Week" +msgstr "Diese Woche" + +#: adminpages/reports/login.php:56 +msgid "Year to Date" +msgstr "Bisheriges Jahr" + +#: adminpages/reports/login.php:186 +msgid "Visits This Week" +msgstr "Besuche diese Woche" + +#: adminpages/reports/login.php:188 +msgid "Visits This Year" +msgstr "Besuche dieses Jahr" + +#: adminpages/reports/login.php:190 +msgid "Views This Week" +msgstr "Ansichten diese Woche" + +#: adminpages/reports/login.php:192 +msgid "Views This Year" +msgstr "Ansichten dieses Jahr" + +#: adminpages/reports/login.php:195 +msgid "Logins This Week" +msgstr "Logins diese Woche" + +#: adminpages/reports/login.php:197 +msgid "Logins This Year" +msgstr "Logins dieses Jahr" + +#: adminpages/reports/memberships.php:356 +msgid "All Paid Levels" +msgstr "Alle bezahlten Pakete" + +#: adminpages/reports/memberships.php:357 +msgid "All Free Levels" +msgstr "Alle freien Pakete" + +#: adminpages/reports/memberships.php:377 adminpages/reports/sales.php:334 +msgid "All Codes" +msgstr "Alle Codes" + +#: adminpages/reports/sales.php:345 +msgid "Average line calculated using data prior to current day, month, or year." +msgstr "Durchschnittslinie, die anhand von Daten vor dem aktuellen Tag, Monat oder Jahr berechnet wird." + +#: adminpages/reports/sales.php:388 +msgid "Average*" +msgstr "Durchschnitt*" + +#: blocks/checkout-button/block.php:54 +msgid "Buy Now" +msgstr "Jetzt kaufen" + +#: classes/class-pmpro-admin-activity-email.php:43 +msgid "yesterday" +msgstr "Gestern" + +#: classes/class-pmpro-admin-activity-email.php:44 +msgid "last week" +msgstr "Letzte Woche" + +#: classes/class-pmpro-admin-activity-email.php:45 +msgid "last month" +msgstr "Letzter Monat" + +#: classes/class-pmpro-admin-activity-email.php:84 +msgid "Here's a summary of what happened in your Paid Memberships Pro site %s." +msgstr "Hier ist eine Zusammenfassung der Vorgänge auf Ihrer Website für bezahlte Mitgliedschaften Pro %s." + +#: classes/class-pmpro-admin-activity-email.php:104 +msgid "Your membership site made %1$s in revenue %2$s." +msgstr "Ihre Mitgliederseite hat %1$s an Umsatz %2$s gemacht." + +#: classes/class-pmpro-admin-activity-email.php:106 +msgid "Signups and Cancellations" +msgstr "Anmeldungen und Stornierungen" + +#: classes/class-pmpro-admin-activity-email.php:135 +msgid " Total Members" +msgstr " Mitglieder insgesamt" + +#: classes/class-pmpro-admin-activity-email.php:151 +msgid "Here is a summary of your top %s most popular levels:

    " +msgstr "Hier ist eine Zusammenfassung der beliebtesten %s-Pakete:

    >" + +#: classes/class-pmpro-admin-activity-email.php:165 +msgid "View Signups and Cancellations Report »" +msgstr "Bericht über Anmeldungen und Stornierungen anzeigen »" + +#: classes/class-pmpro-admin-activity-email.php:175 +msgid "Discount Code Usage" +msgstr "Verwendung von Rabattcodes" + +#: classes/class-pmpro-admin-activity-email.php:206 +msgid "%1$d order used a Discount Code at checkout:" +msgstr "%1$d Bestellung hat beim CheckOut einen Rabattcode benutzt:" + +#: classes/class-pmpro-admin-activity-email.php:208 +msgid "%1$d orders used a Discount Code at checkout. Here is a breakdown of your most used codes:" +msgstr "%1$d Bestellungen haben beim CheckOut einen Rabattcode benutzt. Hier ist eine Aufschlüsselung der am häufigsten verwendeten Codes:" + +#: classes/class-pmpro-admin-activity-email.php:228 +msgid "No Discount Codes were used %2$s." +msgstr "Es wurden keine Rabatt-Codes verwendet %2$s." + +#: classes/class-pmpro-admin-activity-email.php:241 +msgid "Active Add Ons" +msgstr "Aktive Add Ons" + +#: classes/class-pmpro-admin-activity-email.php:270 +msgid "Free Add Ons" +msgstr "Freie Add Ons" + +#: classes/class-pmpro-admin-activity-email.php:271 +msgid "Plus Add Ons" +msgstr "Plus Add Ons" + +#: classes/class-pmpro-admin-activity-email.php:272 +msgid "Required Updates" +msgstr "Notwendige Updates" + +#: classes/class-pmpro-admin-activity-email.php:275 +msgid "It is important to keep all Add Ons up to date to take advantage of security improvements, bug fixes, and expanded features. Add On updates can be made via the WordPress Dashboard." +msgstr "Es ist wichtig, alle Add Ons auf dem neuesten Stand zu halten, um von den Sicherheitsverbesserungen, Fehlerbehebungen und erweiterten Funktionen zu profitieren. Add-On-Updates können über das WordPress-Dashboard vorgenommen werden." + +#: classes/class-pmpro-admin-activity-email.php:284 +msgid "Membership Site Administration" +msgstr "Verwaltung der Mitgliederseite" + +#: classes/class-pmpro-admin-activity-email.php:288 +msgid "Administrators" +msgstr "Administratoren" + +#: classes/class-pmpro-admin-activity-email.php:289 +msgid "Membership Managers" +msgstr "Mitgliedschaftsmanager" + +#: classes/class-pmpro-admin-activity-email.php:308 +msgid "Note: It is important to review users with access to your membership site data since they control settings and can modify member accounts." +msgstr "Hinweis: Es ist wichtig, die Benutzer mit Zugriff auf die Daten Ihrer Mitgliederseite zu überprüfen, da sie die Einstellungen kontrollieren und die Mitgliederkonten ändern können." + +#: classes/class-pmpro-admin-activity-email.php:315 +msgid "License Status: None" +msgstr "Lizenz-Status: Keine" + +#: classes/class-pmpro-admin-activity-email.php:316 +msgid "...and that is perfectly OK! PMPro is free to use for as long as you want for membership sites of all sizes. Interested in unlimited support, access to over 70 featured-enhancing Add Ons and instant installs and updates? Check out our paid plans to learn more." +msgstr "…und das ist völlig in Ordnung! PMPro ist für Mitgliedschaftsseiten jeder Größe kostenlos und kann so lange genutzt werden, wie Sie wollen. Sind Sie an unbegrenztem Support, Zugang zu über 70 funktionserweiternden Add Ons und sofortigen Installationen und Updates interessiert? Sehen Sie sich unsere kostenpflichtigen Pläne an, um mehr zu erfahren." + +#: classes/class-pmpro-admin-activity-email.php:357 +msgid "Follow @pmproplugin on Twitter" +msgstr "Folgen Sie @pmproplugin auf Twitter" + +#: classes/class-pmpro-admin-activity-email.php:358 +msgid "Like us on Facebook" +msgstr "Gefällt mir auf Facebook" + +#: classes/class-pmpro-admin-activity-email.php:359 +msgid "Subscribe to our YouTube Channel" +msgstr "Abonnieren Sie unseren YouTube-Kanal" + +#: classes/class-pmpro-admin-activity-email.php:371 +msgid "This email is automatically generated by your WordPress site and sent to your Administration Email Address set under Settings > General in your WordPress dashboard." +msgstr "Diese E-Mail wird automatisch von Ihrer WordPress-Website generiert und an Ihre E-Mail-Adresse für die Administration gesendet, die Sie unter Einstellungen > Allgemein in Ihrem WordPress-Dashboard festgelegt haben." + +#: classes/class-pmpro-admin-activity-email.php:372 +msgid "To adjust the frequency of this message or disable these emails completely, you can update the \"Activity Email Frequency\" setting here." +msgstr "Um die Häufigkeit dieser Nachricht anzupassen oder diese E-Mails ganz zu deaktivieren, können Sie hier die Einstellung „Häufigkeit der Aktivitäts-E-Mails“ aktualisieren." + +#: classes/class-pmpro-admin-activity-email.php:410 +msgid "[%1$s] PMPro Activity for %2$s: %3$s" +msgstr "[%1$s] PMPro Aktivität für %2$s: %3$s" + +#: classes/class-pmpro-members-list-table.php:232 +#: classes/class-pmpro-members-list-table.php:231 +msgid "You can also try searching:" +msgstr "Sie können auch eine Suche durchführen:" + +#: classes/class-pmpro-members-list-table.php:542 +#: shortcodes/pmpro_account.php:145 +#: classes/class-pmpro-members-list-table.php:541 +msgid "—" +msgstr "" + +#: classes/class.memberorder.php:968 +msgid "Edit Order" +msgstr "Bestellung bearbeiten" + +#: classes/class.memberorder.php:1141 +msgid "This is a test order used with the PMPro Email Templates addon." +msgstr "Dies ist ein Testauftrag, der mit dem Addon PMPro E-Mail Templates verwendet wird." + +#: classes/class.pmproemail.php:371 classes/class.pmproemail.php:377 +msgid "Member checkout for %s at %s" +msgstr "Anmeldung eines neuen Mitglieds für das Paket %s bei %s" + +#: classes/class.pmproemail.php:565 classes/class.pmproemail.php:577 +msgid "Membership payment failed at %s" +msgstr "Mitgliedschaftszahlung bei %s fehlgeschlagen" + +#: classes/class.pmproemail.php:614 classes/class.pmproemail.php:626 +msgid "Membership payment failed For %s at %s" +msgstr "Mitgliedsbeitragszahlung fehlgeschlagen für %s bei %s" + +#: classes/class.pmproemail.php:663 classes/class.pmproemail.php:675 +msgid "Credit card on file expiring soon at %s" +msgstr "Die hinterlegte Kreditkarte läuft bald ab bei %s" + +#: classes/class.pmproemail.php:715 classes/class.pmproemail.php:727 +msgid "Invoice for %s membership" +msgstr "Rechnung für %s Mitgliedschaft" + +#: classes/class.pmproemail.php:904 classes/class.pmproemail.php:949 +#: includes/email.php:443 includes/email.php:468 +#: classes/class.pmproemail.php:916 classes/class.pmproemail.php:961 +#: includes/email.php:475 +msgid "This membership does not expire." +msgstr "Diese Mitgliedschaft läuft nicht ab." + +#: classes/class.pmproemail.php:940 classes/class.pmproemail.php:952 +msgid "Membership has been cancelled." +msgstr "Die Mitgliedschaft wurde gekündigt." + +#: classes/class.pmproemail.php:980 classes/class.pmproemail.php:992 +msgid "Invoice for order #: " +msgstr "Rechnung für Bestellung Nummer: " + +#: classes/class.pmproemail.php:1030 classes/class.pmproemail.php:1042 +msgid "Payment action required for your %s membership" +msgstr "Zahlungsvorgang für Ihre %s-Mitgliedschaft erforderlich" + +#: classes/class.pmproemail.php:1068 classes/class.pmproemail.php:1080 +msgid "Payment action required: membership for %s at %s" +msgstr "Zahlungsvorgang erforderlich: Mitgliedschaft für %s bei %s" + +#: classes/gateways/class.pmprogateway_braintree.php:933 +msgid "Error subscribing customer to plan with Braintree: %s (%s)" +msgstr "Fehler beim Abonnieren eines Kunden für einen Tarif mit Braintree: %s (%s)" + +#: classes/gateways/class.pmprogateway_braintree.php:948 +msgid "Failed to subscribe with Braintree: %s" +msgstr "Anmeldung bei Braintree fehlgeschlagen: %s" + +#: classes/gateways/class.pmprogateway_braintree.php:1018 +#: classes/gateways/class.pmprogateway_braintree.php:1029 +msgid "Could not find the subscription. %s" +msgstr "Das Abonnement konnte nicht gefunden werden. %s" + +#: classes/gateways/class.pmprogateway_braintree.php:1082 +msgid "Error getting subscription with Braintree:" +msgstr "Fehler beim Abonnieren mit Braintree:" + +#: classes/gateways/class.pmprogateway_cybersource.php:317 +#: classes/gateways/class.pmprogateway_cybersource.php:318 +#: classes/gateways/class.pmprogateway_cybersource.php:481 +#: classes/gateways/class.pmprogateway_cybersource.php:482 +#: classes/gateways/class.pmprogateway_cybersource.php:768 +#: classes/gateways/class.pmprogateway_cybersource.php:769 +msgid "Error validating credit card type. Make sure your credit card number is correct and try again." +msgstr "Fehler bei der Überprüfung des Kreditkartentyps. Stellen Sie sicher, dass Ihre Kreditkartennummer korrekt ist und versuchen Sie es erneut." + +#: classes/gateways/class.pmprogateway_cybersource.php:344 +#: classes/gateways/class.pmprogateway_cybersource.php:350 +#: classes/gateways/class.pmprogateway_cybersource.php:396 +#: classes/gateways/class.pmprogateway_cybersource.php:402 +#: classes/gateways/class.pmprogateway_cybersource.php:506 +#: classes/gateways/class.pmprogateway_cybersource.php:512 +#: classes/gateways/class.pmprogateway_cybersource.php:696 +#: classes/gateways/class.pmprogateway_cybersource.php:702 +#: classes/gateways/class.pmprogateway_cybersource.php:780 +#: classes/gateways/class.pmprogateway_cybersource.php:786 +#: classes/gateways/class.pmprogateway_cybersource.php:834 +#: classes/gateways/class.pmprogateway_cybersource.php:840 +msgid "Error communicating with Cybersource: %" +msgstr "Fehler bei der Kommunikation mit Cybersource: %" + +#: classes/gateways/class.pmprogateway_cybersource.php:345 +#: classes/gateways/class.pmprogateway_cybersource.php:351 +#: classes/gateways/class.pmprogateway_cybersource.php:397 +#: classes/gateways/class.pmprogateway_cybersource.php:403 +#: classes/gateways/class.pmprogateway_cybersource.php:507 +#: classes/gateways/class.pmprogateway_cybersource.php:513 +#: classes/gateways/class.pmprogateway_cybersource.php:697 +#: classes/gateways/class.pmprogateway_cybersource.php:703 +#: classes/gateways/class.pmprogateway_cybersource.php:781 +#: classes/gateways/class.pmprogateway_cybersource.php:787 +#: classes/gateways/class.pmprogateway_cybersource.php:835 +#: classes/gateways/class.pmprogateway_cybersource.php:841 +msgid "Error communicating with Cybersource." +msgstr "Fehler bei der Kommunikation mit Cybersource." + +#: classes/gateways/class.pmprogateway_cybersource.php:679 +msgid "The payment gateway doesn't support this credit/debit card type." +msgstr "Das Zahlungsgateway unterstützt diesen Kredit-/Debitkartentyp nicht." + +#: classes/gateways/class.pmprogateway_cybersource.php:864 +msgid "Successful transaction." +msgstr "Erfolgreiche Transaktion." + +#: classes/gateways/class.pmprogateway_cybersource.php:865 +msgid "The request is missing one or more required fields." +msgstr "In der Anfrage fehlen ein oder mehrere Pflichtfelder." + +#: classes/gateways/class.pmprogateway_cybersource.php:866 +msgid "One or more fields in the request contains invalid data. Check that your billing address is valid." +msgstr "Ein oder mehrere Felder in der Anfrage enthalten ungültige Daten. Prüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:867 +msgid "Duplicate order detected." +msgstr "Doppelte Bestellung gefunden." + +#: classes/gateways/class.pmprogateway_cybersource.php:868 +msgid "Only partial amount was approved." +msgstr "Es wurde nur ein Teilbetrag genehmigt." + +#: classes/gateways/class.pmprogateway_cybersource.php:869 +msgid "Error: General system failure." +msgstr "Fehler: Allgemeiner Systemfehler." + +#: classes/gateways/class.pmprogateway_cybersource.php:870 +msgid "Error: The request was received but there was a server timeout." +msgstr "Fehler: Die Anfrage wurde empfangen, aber es gab eine Server-Zeitüberschreitung." + +#: classes/gateways/class.pmprogateway_cybersource.php:871 +msgid "Error: The request was received, but a service did not finish running in time. " +msgstr "Fehler: Die Anfrage wurde empfangen, aber ein Dienst wurde nicht rechtzeitig fertig. " + +#: classes/gateways/class.pmprogateway_cybersource.php:872 +msgid "Address Verification Service (AVS) failure." +msgstr "Ausfall des Adressverifizierungsdienstes (AVS)." + +#: classes/gateways/class.pmprogateway_cybersource.php:873 +msgid "Authorization failed." +msgstr "Autorisierung fehlgeschlagen." + +#: classes/gateways/class.pmprogateway_cybersource.php:874 +msgid "Expired card or invalid expiration date." +msgstr "Abgelaufene Karte oder ungültiges Gültigkeitsdatum." + +#: classes/gateways/class.pmprogateway_cybersource.php:875 +msgid "The card was declined." +msgstr "Die Karte wurde abgelehnt." + +#: classes/gateways/class.pmprogateway_cybersource.php:876 +msgid "Insufficient funds in the account." +msgstr "Unzureichende Deckung des Kontos." + +#: classes/gateways/class.pmprogateway_cybersource.php:877 +msgid "Stolen or lost card." +msgstr "Gestohlene oder verlorene Karte." + +#: classes/gateways/class.pmprogateway_cybersource.php:878 +msgid "Issuing bank unavailable." +msgstr "Die ausstellende Bank ist nicht verfügbar." + +#: classes/gateways/class.pmprogateway_cybersource.php:879 +msgid "Inactive card or card not authorized for card-not-present transactions." +msgstr "Inaktive Karte oder nicht autorisierte Karte für Transaktionen ohne Kartenzahlung." + +#: classes/gateways/class.pmprogateway_cybersource.php:880 +msgid "American Express Card Identification Digits (CID) did not match." +msgstr "Die American Express Card Identification Digits (CID) stimmten nicht überein." + +#: classes/gateways/class.pmprogateway_cybersource.php:881 +msgid "The card has reached the credit limit. " +msgstr "Die Karte hat das Kreditlimit erreicht. " + +#: classes/gateways/class.pmprogateway_cybersource.php:882 +msgid "Invalid card verification number." +msgstr "Ungültige Kartenprüfnummer." + +#: classes/gateways/class.pmprogateway_cybersource.php:883 +msgid "The customer matched an entry on the processors negative file. " +msgstr "Der Kunde stimmte mit einem Eintrag in der Negativdatei des Verarbeiters überein. " + +#: classes/gateways/class.pmprogateway_cybersource.php:884 +msgid "Card verification (CV) check failed." +msgstr "Die Überprüfung der Karte (CV) ist fehlgeschlagen." + +#: classes/gateways/class.pmprogateway_cybersource.php:885 +msgid "Invalid account number." +msgstr "Ungültige Kontonummer." + +#: classes/gateways/class.pmprogateway_cybersource.php:886 +msgid "The card type is not accepted by the payment processor." +msgstr "Der Kartentyp wird vom Zahlungsdienstleister nicht akzeptiert." + +#: classes/gateways/class.pmprogateway_cybersource.php:887 +msgid "General decline by the processor." +msgstr "Allgemeine Ablehnung durch den Prozessor." + +#: classes/gateways/class.pmprogateway_cybersource.php:888 +msgid "There is a problem with your CyberSource merchant configuration." +msgstr "Es liegt ein Problem mit der CyberSource-Händlerkonfiguration vor." + +#: classes/gateways/class.pmprogateway_cybersource.php:889 +msgid "The requested amount exceeds the originally authorized amount." +msgstr "Der angeforderte Betrag übersteigt den ursprünglich genehmigten Betrag." + +#: classes/gateways/class.pmprogateway_cybersource.php:890 +msgid "Processor failure." +msgstr "Prozessorfehler." + +#: classes/gateways/class.pmprogateway_cybersource.php:891 +msgid "The authorization has already been reversed." +msgstr "Die Autorisierung wurde bereits storniert." + +#: classes/gateways/class.pmprogateway_cybersource.php:892 +msgid "The authorization has already been captured." +msgstr "Die Autorisierung wurde bereits erfasst." + +#: classes/gateways/class.pmprogateway_cybersource.php:893 +msgid "The requested transaction amount must match the previous transaction amount." +msgstr "Der angeforderte Buchungsbetrag muss mit dem vorherigen Buchungsbetrag übereinstimmen." + +#: classes/gateways/class.pmprogateway_cybersource.php:894 +msgid "The card type sent is invalid or does not correlate with the credit card number." +msgstr "Der gesendete Kartentyp ist ungültig oder korreliert nicht mit der Kreditkartennummer." + +#: classes/gateways/class.pmprogateway_cybersource.php:895 +msgid "The referenced request id is invalid for all follow-on transactions." +msgstr "Die referenzierte Anforderungs-ID ist für alle Folgetransaktionen ungültig." + +#: classes/gateways/class.pmprogateway_cybersource.php:896 +msgid "The request ID is invalid." +msgstr "Die Anforderungs-ID ist ungültig." + +#: classes/gateways/class.pmprogateway_cybersource.php:897 +msgid "The transaction has already been settled or reversed." +msgstr "Die Buchung wurde bereits ausgeglichen oder storniert." + +#: classes/gateways/class.pmprogateway_cybersource.php:898 +msgid "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." +msgstr "Die Erfassung oder Gutschrift ist nicht annullierbar, da die Erfassungs- oder Kreditinformationen bereits an Ihren Auftragsverarbeiter übermittelt wurden. Oder Sie haben eine Stornierung für einen Transaktionstyp angefordert, der nicht storniert werden kann." + +#: classes/gateways/class.pmprogateway_cybersource.php:899 +msgid "You requested a credit for a capture that was previously voided." +msgstr "Sie haben eine Gutschrift für eine Erfassung angefordert, die zuvor storniert wurde." + +#: classes/gateways/class.pmprogateway_cybersource.php:900 +msgid "Error: The request was received, but there was a timeout at the payment processor." +msgstr "Fehler: Die Anforderung wurde empfangen, aber es gab ein Timeout am Zahlungsprozessor." + +#: classes/gateways/class.pmprogateway_cybersource.php:901 +msgid "Stand-alone credits are not allowed with this processor." +msgstr "Eigenständige Credits sind mit diesem Prozessor nicht zulässig." + +#: classes/gateways/class.pmprogateway_cybersource.php:902 +msgid "Apartment number missing or not found. Check that your billing address is valid." +msgstr "Wohnungsnummer fehlt oder nicht gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:903 +msgid "Insufficient address information. Check that your billing address is valid." +msgstr "Unzureichende Adressinformationen. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:904 +msgid "House/Box number not found on street. Check that your billing address is valid." +msgstr "Haus/Box-Nummer auf der Straße nicht gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:905 +msgid "Multiple address matches were found. Check that your billing address is valid." +msgstr "Es wurden mehrere Adressübereinstimmungen gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:906 +msgid "P.O. Box identifier not found or out of range.. Check that your billing address is valid." +msgstr "Postfach-Id wurde nicht gefunden oder ist nicht in erreichbar. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:907 +msgid "Route service identifier not found or out of range. Check that your billing address is valid." +msgstr "Routen-Id wurde nicht gefunden oder ist nicht in erreichbar. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:908 +msgid "Street name not found in Postal code. Check that your billing address is valid." +msgstr "Straßenname in der Postleitzahl nicht gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:909 +msgid "Postal code not found in database. Check that your billing address is valid." +msgstr "Postleitzahl in der Datenbank nicht gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:910 +msgid "Unable to verify or correct address. Check that your billing address is valid." +msgstr "Die Adresse kann nicht überprüft oder korrigiert werden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:911 +msgid "Multiple address matches were found (international). Check that your billing address is valid." +msgstr "Es wurden mehrere Adressübereinstimmungen (international) gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:912 +msgid "Address match not found. Check that your billing address is valid." +msgstr "Adressübereinstimmung wurde nicht gefunden. Überprüfen Sie, ob Ihre Rechnungsadresse gültig ist." + +#: classes/gateways/class.pmprogateway_cybersource.php:913 +msgid "Unsupported character set. Verify the character set that you are using to process transactions." +msgstr "Nicht unterstützter Zeichensatz. Überprüfen Sie den Zeichensatz, den Sie zum Verarbeiten von Transaktionen verwenden." + +#: classes/gateways/class.pmprogateway_cybersource.php:914 +msgid "Order has been rejected by Decision Manager." +msgstr "Der Auftrag wurde vom Entscheidungsmanager abgelehnt." + +#: classes/gateways/class.pmprogateway_cybersource.php:915 +msgid "Smart Authorization failed." +msgstr "Smart Authorization fehlgeschlagen." + +#: classes/gateways/class.pmprogateway_cybersource.php:916 +msgid "Your order has been refused." +msgstr "Ihre Bestellung wurde abgelehnt." + +#: classes/gateways/class.pmprogateway_cybersource.php:922 +#: includes/license.php:159 +msgid "Unknown error." +msgstr "Unbekannter Fehler." + +#: classes/gateways/class.pmprogateway_cybersource.php:927 +msgid " Invalid fields:" +msgstr " Ungültige Felder:" + +#: classes/gateways/class.pmprogateway_payflowpro.php:145 +msgid "Payflow does not use IPN. To sync recurring subscriptions, please see the Payflow Recurring Orders Add On." +msgstr "Payflow verwendet keine IPN. Um wiederkehrende Abonnements zu synchronisieren benutzen Sie bitte Payflow Recurring Orders Add On ." + +#: classes/gateways/class.pmprogateway_paypal.php:146 +#: classes/gateways/class.pmprogateway_paypalexpress.php:155 +#: classes/gateways/class.pmprogateway_paypalstandard.php:147 +#: classes/gateways/class.pmprogateway_paypalexpress.php:165 +msgid "Note: We do not recommend using PayPal Standard. We suggest using PayPal Express, Website Payments Pro (Legacy), or PayPal Pro (Payflow Pro). More information on why can be found here." +msgstr "Bitte beachten Sie: Wir empfehlen, nicht mit PayPal-Standard zu arbeiten. Wir empfehlen die Verwendung von PayPal Express, Website Zahlungen Pro (Legacy) oder PayPal Pro (Payflow Pro). Weitere Informationen finden Sie hier." + +#: classes/gateways/class.pmprogateway_paypalexpress.php:346 +#: classes/gateways/class.pmprogateway_paypalexpress.php:356 +msgid "Checkout was already processed." +msgstr "Der Checkout wurde bereits bearbeitet." + +#: classes/gateways/class.pmprogateway_paypalexpress.php:781 +#: classes/gateways/class.pmprogateway_paypalexpress.php:791 +msgid "Something went wrong creating plan with PayPal; missing PROFILESTATUS." +msgstr "Etwas ist schief gelaufen, einen Tarif mit PayPal zu erstellen; fehlender PROFILSTATUS." + +#: classes/gateways/class.pmprogateway_paypalexpress.php:782 +#: classes/gateways/class.pmprogateway_paypalexpress.php:792 +msgid "Error creating plan with PayPal." +msgstr "Fehler beim Erstellen des Tarifs mit PayPal." + +#: classes/gateways/class.pmprogateway_stripe.php:350 +#: classes/gateways/class.pmprogateway_stripe.php:436 +#: classes/gateways/class.pmprogateway_stripe.php:354 +#: classes/gateways/class.pmprogateway_stripe.php:444 +#: classes/gateways/class.pmprogateway_stripe.php:360 +#: classes/gateways/class.pmprogateway_stripe.php:450 +msgid "Stripe Connect Settings" +msgstr "Stripe Connect Settings" + +#: classes/gateways/class.pmprogateway_stripe.php:352 +#: classes/gateways/class.pmprogateway_stripe.php:356 +#: classes/gateways/class.pmprogateway_stripe.php:362 +msgid "Live Mode:" +msgstr "Live-Modus:" + +#: classes/gateways/class.pmprogateway_stripe.php:354 +#: classes/gateways/class.pmprogateway_stripe.php:440 +#: classes/gateways/class.pmprogateway_stripe.php:358 +#: classes/gateways/class.pmprogateway_stripe.php:448 +#: classes/gateways/class.pmprogateway_stripe.php:364 +#: classes/gateways/class.pmprogateway_stripe.php:454 +msgid "Connected" +msgstr "Verbunden" + +#: classes/gateways/class.pmprogateway_stripe.php:356 +#: classes/gateways/class.pmprogateway_stripe.php:442 +#: classes/gateways/class.pmprogateway_stripe.php:362 +#: classes/gateways/class.pmprogateway_stripe.php:452 +#: classes/gateways/class.pmprogateway_stripe.php:368 +#: classes/gateways/class.pmprogateway_stripe.php:458 +msgid "Not Connected" +msgstr "Nicht verbunden" + +#: classes/gateways/class.pmprogateway_stripe.php:363 +#: classes/gateways/class.pmprogateway_stripe.php:449 +#: classes/gateways/class.pmprogateway_stripe.php:369 +#: classes/gateways/class.pmprogateway_stripe.php:459 +#: classes/gateways/class.pmprogateway_stripe.php:375 +#: classes/gateways/class.pmprogateway_stripe.php:465 +msgid "Your site is using legacy API keys to authenticate with Stripe." +msgstr "Ihre Website verwendet ältere API-Schlüssel zur Authentifizierung bei Stripe." + +#: classes/gateways/class.pmprogateway_stripe.php:364 +#: classes/gateways/class.pmprogateway_stripe.php:371 +#: classes/gateways/class.pmprogateway_stripe.php:377 +msgid "Use the \"Connect with Stripe\" button below to securely authenticate with your Stripe account using Stripe Connect. Log in with the current Stripe account used for this site so that existing subscriptions are not affected by the update." +msgstr "Verwenden Sie die Schaltfläche \"Mit Stripe verbinden\", um sich mit Stripe Connect sicher bei Ihrem Stripe-Konto zu authentifizieren. Melden Sie sich mit dem aktuellen Stripe-Konto an, das für diese Website verwendet wird, damit vorhandene Abonnements nicht von der Aktualisierung betroffen sind." + +#: classes/gateways/class.pmprogateway_stripe.php:372 +#: classes/gateways/class.pmprogateway_stripe.php:458 +#: classes/gateways/class.pmprogateway_stripe.php:380 +#: classes/gateways/class.pmprogateway_stripe.php:470 +#: classes/gateways/class.pmprogateway_stripe.php:386 +#: classes/gateways/class.pmprogateway_stripe.php:476 +msgid "Stripe Connection:" +msgstr "Stripe-Verbindung:" + +#: classes/gateways/class.pmprogateway_stripe.php:388 +#: classes/gateways/class.pmprogateway_stripe.php:482 +#: classes/gateways/class.pmprogateway_stripe.php:396 +#: classes/gateways/class.pmprogateway_stripe.php:494 +#: classes/gateways/class.pmprogateway_stripe.php:402 +#: classes/gateways/class.pmprogateway_stripe.php:500 +msgid "Disconnect From Stripe" +msgstr "Verbindung zu Stripe trennen" + +#: classes/gateways/class.pmprogateway_stripe.php:389 +#: classes/gateways/class.pmprogateway_stripe.php:397 +#: classes/gateways/class.pmprogateway_stripe.php:403 +msgid "This will disconnect your site from Stripe. Users will not be able to complete membership checkout or update their billing information. Existing subscriptions will not be affected at the gateway, but new recurring orders will not be created in this site." +msgstr "Dadurch wird Ihre Website von Stripe getrennt. Benutzer können den Checkout der Mitgliedschaft nicht abschließen oder ihre Rechnungsinformationen aktualisieren. Bestehende Abonnements sind am Gateway nicht betroffen, aber neue wiederkehrende Bestellungen werden auf dieser Website nicht erstellt." + +#: classes/gateways/class.pmprogateway_stripe.php:401 +#: classes/gateways/class.pmprogateway_stripe.php:496 +#: classes/gateways/class.pmprogateway_stripe.php:409 +#: classes/gateways/class.pmprogateway_stripe.php:508 +#: classes/gateways/class.pmprogateway_stripe.php:415 +#: classes/gateways/class.pmprogateway_stripe.php:514 +msgid "Connect with Stripe" +msgstr "Mit Stripe verbinden" + +#: classes/gateways/class.pmprogateway_stripe.php:408 +#: classes/gateways/class.pmprogateway_stripe.php:416 +#: classes/gateways/class.pmprogateway_stripe.php:422 +msgid "Note: You have a valid license and are not charged additional platform fees for payment processing." +msgstr "Hinweis: Sie haben eine gültige Lizenz und es fallen keine zusätzlichen Plattformgebühren für die Zahlungsabwicklung an." + +#: classes/gateways/class.pmprogateway_stripe.php:411 +#: classes/gateways/class.pmprogateway_stripe.php:419 +#: classes/gateways/class.pmprogateway_stripe.php:425 +msgid "Note: You are using the free Stripe payment gateway integration. This includes an additional 1% fee for payment processing. This fee is removed by activating a Plus license." +msgstr "Hinweis: Sie verwenden die kostenlose Stripe-Zahlungsgateway-Integration. Diese beinhaltet eine zusätzliche 1% Gebühr für die Zahlungsabwicklung. Diese Gebühr entfällt durch die Aktivierung einer Plus-Lizenz." + +#: classes/gateways/class.pmprogateway_stripe.php:423 +#: classes/gateways/class.pmprogateway_stripe.php:507 +#: classes/gateways/class.pmprogateway_stripe.php:547 +#: classes/gateways/class.pmprogateway_stripe.php:431 +#: classes/gateways/class.pmprogateway_stripe.php:519 +#: classes/gateways/class.pmprogateway_stripe.php:559 +#: classes/gateways/class.pmprogateway_stripe.php:578 +#: classes/gateways/class.pmprogateway_stripe.php:437 +#: classes/gateways/class.pmprogateway_stripe.php:525 +#: classes/gateways/class.pmprogateway_stripe.php:584 +msgid "Webhook" +msgstr "Webhook" + +#: classes/gateways/class.pmprogateway_stripe.php:427 +#: classes/gateways/class.pmprogateway_stripe.php:511 +#: classes/gateways/class.pmprogateway_stripe.php:582 +#: classes/gateways/class.pmprogateway_stripe.php:435 +#: classes/gateways/class.pmprogateway_stripe.php:523 +#: classes/gateways/class.pmprogateway_stripe.php:594 +#: classes/gateways/class.pmprogateway_stripe.php:613 +#: classes/gateways/class.pmprogateway_stripe.php:441 +#: classes/gateways/class.pmprogateway_stripe.php:529 +#: classes/gateways/class.pmprogateway_stripe.php:619 +msgid "Webhook URL" +msgstr "Webhook URL" + +#: classes/gateways/class.pmprogateway_stripe.php:438 +#: classes/gateways/class.pmprogateway_stripe.php:446 +#: classes/gateways/class.pmprogateway_stripe.php:452 +msgid "Test Mode:" +msgstr "Test Modus:" + +#: classes/gateways/class.pmprogateway_stripe.php:450 +#: classes/gateways/class.pmprogateway_stripe.php:461 +#: classes/gateways/class.pmprogateway_stripe.php:467 +msgid "Use the \"Connect with Stripe\" button below to securely authenticate with your Stripe account using Stripe Connect in test mode." +msgstr "Verwenden Sie die Schaltfläche \"Mit Stripe verbinden\" unten, um sich mit Stripe Connect im Testmodus sicher bei Ihrem Stripe-Konto zu authentifizieren." + +#: classes/gateways/class.pmprogateway_stripe.php:483 +#: classes/gateways/class.pmprogateway_stripe.php:495 +#: classes/gateways/class.pmprogateway_stripe.php:501 +msgid "This will disconnect your site from Stripe in test mode only." +msgstr "Dadurch wird Ihre Website nur im Testmodus von Stripe getrennt." + +#: classes/gateways/class.pmprogateway_stripe.php:518 +#: classes/gateways/class.pmprogateway_stripe.php:530 +#: classes/gateways/class.pmprogateway_stripe.php:536 +msgid "Stripe API Settings (Legacy)" +msgstr "Stripe-API-Einstellungen (alt)" + +#: classes/gateways/class.pmprogateway_stripe.php:551 +#: classes/gateways/class.pmprogateway_stripe.php:575 +#: classes/gateways/class.pmprogateway_stripe.php:563 +#: classes/gateways/class.pmprogateway_stripe.php:587 +#: classes/gateways/class.pmprogateway_stripe.php:582 +#: classes/gateways/class.pmprogateway_stripe.php:606 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:612 +msgid "Create Webhook" +msgstr "Webhook erstellen" + +#: classes/gateways/class.pmprogateway_stripe.php:557 +#: classes/gateways/class.pmprogateway_stripe.php:569 +#: classes/gateways/class.pmprogateway_stripe.php:588 +#: classes/gateways/class.pmprogateway_stripe.php:594 +msgid "A webhook is set up in Stripe, but it is disabled." +msgstr "Ein Webhook ist in Stripe eingerichtet, aber deaktiviert." + +#: classes/gateways/class.pmprogateway_stripe.php:564 +#: classes/gateways/class.pmprogateway_stripe.php:576 +#: classes/gateways/class.pmprogateway_stripe.php:595 +#: classes/gateways/class.pmprogateway_stripe.php:601 +msgid "A webhook is set up in Stripe, but it is using an old API version." +msgstr "Ein Webhook ist in Stripe eingerichtet, verwendet jedoch eine alte API-Version." + +#: classes/gateways/class.pmprogateway_stripe.php:564 +#: classes/gateways/class.pmprogateway_stripe.php:576 +#: classes/gateways/class.pmprogateway_stripe.php:595 +#: classes/gateways/class.pmprogateway_stripe.php:601 +msgid "Rebuild Webhook" +msgstr "Webhook neu erstellen" + +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:710 +#: classes/gateways/class.pmprogateway_stripe.php:826 +#: classes/gateways/class.pmprogateway_stripe.php:582 +#: classes/gateways/class.pmprogateway_stripe.php:722 +#: classes/gateways/class.pmprogateway_stripe.php:838 +#: classes/gateways/class.pmprogateway_stripe.php:601 +#: classes/gateways/class.pmprogateway_stripe.php:741 +#: classes/gateways/class.pmprogateway_stripe.php:857 +#: classes/gateways/class.pmprogateway_stripe.php:607 +#: classes/gateways/class.pmprogateway_stripe.php:747 +#: classes/gateways/class.pmprogateway_stripe.php:863 +msgid "Your webhook is enabled." +msgstr "Ihr Webhook ist aktiviert." + +#: classes/gateways/class.pmprogateway_stripe.php:570 +#: classes/gateways/class.pmprogateway_stripe.php:582 +#: classes/gateways/class.pmprogateway_stripe.php:601 +#: classes/gateways/class.pmprogateway_stripe.php:607 +msgid "Disable Webhook" +msgstr "Webhook deaktivieren" + +#: classes/gateways/class.pmprogateway_stripe.php:577 +#: classes/gateways/class.pmprogateway_stripe.php:737 +#: classes/gateways/class.pmprogateway_stripe.php:754 +#: classes/gateways/class.pmprogateway_stripe.php:788 +#: classes/gateways/class.pmprogateway_stripe.php:589 +#: classes/gateways/class.pmprogateway_stripe.php:749 +#: classes/gateways/class.pmprogateway_stripe.php:766 +#: classes/gateways/class.pmprogateway_stripe.php:800 +#: classes/gateways/class.pmprogateway_stripe.php:608 +#: classes/gateways/class.pmprogateway_stripe.php:768 +#: classes/gateways/class.pmprogateway_stripe.php:785 +#: classes/gateways/class.pmprogateway_stripe.php:819 +#: classes/gateways/class.pmprogateway_stripe.php:614 +#: classes/gateways/class.pmprogateway_stripe.php:774 +#: classes/gateways/class.pmprogateway_stripe.php:791 +#: classes/gateways/class.pmprogateway_stripe.php:825 +msgid "A webhook in Stripe is required to process recurring payments, manage failed payments, and synchronize cancellations." +msgstr "Ein Webhook in Stripe ist erforderlich, um wiederkehrende Zahlungen zu verarbeiten, fehlgeschlagene Zahlungen zu verwalten und Stornierungen zu synchronisieren." + +#: classes/gateways/class.pmprogateway_stripe.php:589 +#: classes/gateways/class.pmprogateway_stripe.php:601 +#: classes/gateways/class.pmprogateway_stripe.php:620 +#: classes/gateways/class.pmprogateway_stripe.php:626 +msgid "Other Stripe Settings" +msgstr "Andere Streifeneinstellungen" + +#: classes/gateways/class.pmprogateway_stripe.php:593 +#: classes/gateways/class.pmprogateway_stripe.php:605 +#: classes/gateways/class.pmprogateway_stripe.php:624 +#: classes/gateways/class.pmprogateway_stripe.php:630 +msgid "Stripe API Version" +msgstr "Stripe API-Version" + +#: classes/gateways/class.pmprogateway_stripe.php:612 +#: classes/gateways/class.pmprogateway_stripe.php:624 +#: classes/gateways/class.pmprogateway_stripe.php:643 +#: classes/gateways/class.pmprogateway_stripe.php:649 +msgid "Enable Payment Request Button" +msgstr "Schaltfläche \"Zahlungsanforderung aktivieren\"" + +#: classes/gateways/class.pmprogateway_stripe.php:630 +#: classes/gateways/class.pmprogateway_stripe.php:642 +#: classes/gateways/class.pmprogateway_stripe.php:661 +#: classes/gateways/class.pmprogateway_stripe.php:667 +msgid "Allow users to pay using Apple Pay, Google Pay, or Microsoft Pay depending on their browser. When enabled, your domain will automatically be registered with Apple and a domain association file will be hosted on your site. More Information »" +msgstr "Ermöglichen Sie es Benutzern, je nach Browser mit Apple Pay, Google Pay oder Microsoft Pay zu bezahlen. Wenn diese Option aktiviert ist, wird Ihre Domain automatisch bei Apple registriert und eine Domain-Zuordnungsdatei wird auf Ihrer Website gehostet. Weitere Informationen »" + +#: classes/gateways/class.pmprogateway_stripe.php:643 +#: classes/gateways/class.pmprogateway_stripe.php:655 +#: classes/gateways/class.pmprogateway_stripe.php:674 +#: classes/gateways/class.pmprogateway_stripe.php:680 +msgid "This webpage is being served over HTTP, but the Stripe Payment Request Button will only work on pages being served over HTTPS. To resolve this, you must set up WordPress to always use HTTPS." +msgstr "Diese Webseite wird über HTTP bereitgestellt, aber die Stripe Payment Request Button funktioniert nur auf Seiten, die über HTTPS bereitgestellt werden. Um dieses Problem zu beheben, müssen Sie WordPress so einrichten, dass immer HTTPS verwendet wird." + +#: classes/gateways/class.pmprogateway_stripe.php:645 +#: classes/gateways/class.pmprogateway_stripe.php:657 +#: classes/gateways/class.pmprogateway_stripe.php:676 +#: classes/gateways/class.pmprogateway_stripe.php:682 +msgid "It looks like you are using an older Stripe publishable key. In order to use the Payment Request Button feature, you will need to update your API key, which will be prefixed with \"pk_live_\" or \"pk_test_\". Log in to your Stripe Dashboard to roll your publishable key." +msgstr "Es sieht so aus, als ob Sie einen älteren veröffentlichbaren Stripe-Schlüssel verwenden. Um die Funktion \"Payment Request Button\" verwenden zu können, müssen Sie Ihren API-Schlüssel aktualisieren, dem das Präfix \"pk_live_\" oder \"pk_test_\" vorangestellt wird. Melden Sie sich bei Ihrem Stripe-Dashboard an, um Ihren veröffentlichbaren Schlüssel zu rollen." + +#: classes/gateways/class.pmprogateway_stripe.php:647 +#: classes/gateways/class.pmprogateway_stripe.php:659 +#: classes/gateways/class.pmprogateway_stripe.php:678 +#: classes/gateways/class.pmprogateway_stripe.php:684 +msgid "It looks like you are using an older Stripe secret key. In order to use the Payment Request Button feature, you will need to update your API key, which will be prefixed with \"sk_live_\" or \"sk_test_\". Log in to your Stripe Dashboard to roll your secret key." +msgstr "Es sieht so aus, als ob Sie einen älteren geheimen Stripe-Schlüssel verwenden. Um die Funktion \"Payment Request Button\" nutzen zu können, müssen Sie Ihren API-Schlüssel aktualisieren, dem \"sk_live_\" oder \"sk_test_\" vorangestellt wird. Melden Sie sich bei Ihrem Stripe-Dashboard an, um Ihren geheimen Schlüssel zu rollen." + +#: classes/gateways/class.pmprogateway_stripe.php:649 +#: classes/gateways/class.pmprogateway_stripe.php:661 +#: classes/gateways/class.pmprogateway_stripe.php:680 +#: classes/gateways/class.pmprogateway_stripe.php:686 +msgid "Your domain could not be registered with Apple to enable Apple Pay. Please try registering your domain manually from the Apple Pay settings page in Stripe." +msgstr "Ihre Domain konnte nicht bei Apple registriert werden, um Apple Pay zu aktivieren. Bitte versuchen Sie, Ihre Domain manuell über die Apple Pay-Einstellungsseite in Stripe zu registrieren." + +#: classes/gateways/class.pmprogateway_stripe.php:674 +#: classes/gateways/class.pmprogateway_stripe.php:686 +#: classes/gateways/class.pmprogateway_stripe.php:705 +#: classes/gateways/class.pmprogateway_stripe.php:711 +msgid "Optional: Offer PayPal Express as an option at checkout using the Add PayPal Express Add On." +msgstr "Optional: PayPal Express als Option an der Kasse mit dem Add PayPal Express Add Onanbieten." + +#: classes/gateways/class.pmprogateway_stripe.php:695 +#: classes/gateways/class.pmprogateway_stripe.php:707 +#: classes/gateways/class.pmprogateway_stripe.php:726 +#: classes/gateways/class.pmprogateway_stripe.php:732 +msgid "Webhook creation failed. You might already have a webhook set up." +msgstr "Die Webhook-Erstellung ist fehlgeschlagen. Möglicherweise ist bereits ein Webhook eingerichtet." + +#: classes/gateways/class.pmprogateway_stripe.php:761 +#: classes/gateways/class.pmprogateway_stripe.php:835 +#: classes/gateways/class.pmprogateway_stripe.php:773 +#: classes/gateways/class.pmprogateway_stripe.php:847 +#: classes/gateways/class.pmprogateway_stripe.php:792 +#: classes/gateways/class.pmprogateway_stripe.php:866 +#: classes/gateways/class.pmprogateway_stripe.php:798 +#: classes/gateways/class.pmprogateway_stripe.php:872 +msgid "There was an error deleting the webhook." +msgstr "Beim Löschen des Webhooks ist ein Fehler aufgetreten." + +#: classes/gateways/class.pmprogateway_stripe.php:811 +#: classes/gateways/class.pmprogateway_stripe.php:823 +#: classes/gateways/class.pmprogateway_stripe.php:842 +#: classes/gateways/class.pmprogateway_stripe.php:848 +msgid "Webhook creation failed. Please refresh and try again." +msgstr "Webhook-Erstellung fehlgeschlagen. Bitte aktualisieren Sie und versuchen Sie es erneut." + +#: classes/gateways/class.pmprogateway_stripe.php:867 +#: classes/gateways/class.pmprogateway_stripe.php:879 +#: classes/gateways/class.pmprogateway_stripe.php:898 +#: classes/gateways/class.pmprogateway_stripe.php:904 +msgid "Verification steps confirmed. Your payment is processing." +msgstr "Überprüfungsschritte bestätigt. Ihre Zahlung wird verarbeitet." + +#: classes/gateways/class.pmprogateway_stripe.php:1262 +#: classes/gateways/class.pmprogateway_stripe.php:1274 +#: classes/gateways/class.pmprogateway_stripe.php:1293 +#: classes/gateways/class.pmprogateway_stripe.php:1299 +msgid "Pay with Credit Card" +msgstr "Mit Kreditkarte bezahlen" + +#: classes/gateways/class.pmprogateway_stripe.php:1296 +#: classes/gateways/class.pmprogateway_stripe.php:1308 +#: classes/gateways/class.pmprogateway_stripe.php:1327 +#: classes/gateways/class.pmprogateway_stripe.php:1333 +msgid "CVC" +msgstr "CVC" + +#: classes/gateways/class.pmprogateway_stripe.php:1981 +#: classes/gateways/class.pmprogateway_stripe.php:1985 +#: classes/gateways/class.pmprogateway_stripe.php:1998 +#: classes/gateways/class.pmprogateway_stripe.php:2002 +#: classes/gateways/class.pmprogateway_stripe.php:1993 +#: classes/gateways/class.pmprogateway_stripe.php:1997 +#: classes/gateways/class.pmprogateway_stripe.php:2010 +#: classes/gateways/class.pmprogateway_stripe.php:2014 +#: classes/gateways/class.pmprogateway_stripe.php:2012 +#: classes/gateways/class.pmprogateway_stripe.php:2016 +#: classes/gateways/class.pmprogateway_stripe.php:2029 +#: classes/gateways/class.pmprogateway_stripe.php:2033 +#: classes/gateways/class.pmprogateway_stripe.php:2018 +#: classes/gateways/class.pmprogateway_stripe.php:2022 +#: classes/gateways/class.pmprogateway_stripe.php:2035 +#: classes/gateways/class.pmprogateway_stripe.php:2039 +msgid "Error: %s" +msgstr "Fehler: %s" + +#: classes/gateways/class.pmprogateway_stripe.php:3330 +#: classes/gateways/class.pmprogateway_stripe.php:3342 +#: classes/gateways/class.pmprogateway_stripe.php:3364 +#: classes/gateways/class.pmprogateway_stripe.php:3370 +msgid "Customer authentication is required to complete this transaction. Please complete the verification steps issued by your payment provider." +msgstr "Zum Abschließen dieser Transaktion ist eine Kundenauthentifizierung erforderlich. Bitte führen Sie die von Ihrem Zahlungsanbieter ausgestellten Überprüfungsschritte aus." + +#: classes/gateways/class.pmprogateway_stripe.php:3347 +#: classes/gateways/class.pmprogateway_stripe.php:3359 +#: classes/gateways/class.pmprogateway_stripe.php:3381 +#: classes/gateways/class.pmprogateway_stripe.php:3387 +msgid "Customer authentication is required to finish setting up your subscription. Please complete the verification steps issued by your payment provider." +msgstr "Die Kundenauthentifizierung ist erforderlich, um die Einrichtung Ihres Abonnements abzuschließen. Bitte führen Sie die von Ihrem Zahlungsanbieter ausgestellten Überprüfungsschritte aus." + +#: classes/gateways/class.pmprogateway_stripe.php:3533 +#: classes/gateways/class.pmprogateway_stripe.php:3545 +#: classes/gateways/class.pmprogateway_stripe.php:3567 +#: classes/gateways/class.pmprogateway_stripe.php:3573 +msgid "Invalid response from the Stripe Connect server." +msgstr "Ungültige Antwort vom Stripe Connect-Server." + +#. translators: %s Error Message +#: classes/gateways/class.pmprogateway_stripe.php:3561 +#: classes/gateways/class.pmprogateway_stripe.php:3573 +#: classes/gateways/class.pmprogateway_stripe.php:3595 +#: classes/gateways/class.pmprogateway_stripe.php:3601 +msgid "Error: PMPro could not connect to the Stripe API. Reason: %s" +msgstr "Fehler: PMPro konnte keine Verbindung zur Stripe-API herstellen. Grund: %s" + +#. translators: %s Error Message +#: classes/gateways/class.pmprogateway_stripe.php:3597 +#: classes/gateways/class.pmprogateway_stripe.php:3609 +#: classes/gateways/class.pmprogateway_stripe.php:3631 +#: classes/gateways/class.pmprogateway_stripe.php:3637 +msgid "Error: PMPro could not disconnect from the Stripe API. Reason: %s" +msgstr "Fehler: PMPro konnte die Verbindung zur Stripe-API nicht trennen. Grund: %s" + +#: classes/gateways/class.pmprogateway_stripe.php:3768 +#: classes/gateways/class.pmprogateway_stripe.php:3780 +#: classes/gateways/class.pmprogateway_stripe.php:3802 +#: classes/gateways/class.pmprogateway_stripe.php:3808 +msgid "Last webhook received at" +msgstr "Letzter Webhook erhalten am" + +#: classes/gateways/class.pmprogateway_stripe.php:3770 +#: classes/gateways/class.pmprogateway_stripe.php:3782 +#: classes/gateways/class.pmprogateway_stripe.php:3804 +#: classes/gateways/class.pmprogateway_stripe.php:3810 +msgid "No webhooks have been received." +msgstr "Es wurden keine Webhooks empfangen." + +#: classes/gateways/class.pmprogateway_stripe.php:3774 +#: classes/gateways/class.pmprogateway_stripe.php:3786 +#: classes/gateways/class.pmprogateway_stripe.php:3808 +#: classes/gateways/class.pmprogateway_stripe.php:3814 +msgid "Your webhook may not be working correctly." +msgstr "Ihr Webhook funktioniert möglicherweise nicht ordnungsgemäß." + +#: classes/gateways/class.pmprogateway_stripe.php:3776 +#: classes/gateways/class.pmprogateway_stripe.php:3788 +#: classes/gateways/class.pmprogateway_stripe.php:3810 +#: classes/gateways/class.pmprogateway_stripe.php:3816 +msgid "Click here for info on setting up your webhook with Stripe." +msgstr "Klicken Sie hier, um Informationen zum Einrichten Ihres Webhook mit Stripe zu erhalten." + +#: includes/adminpages.php:65 includes/adminpages.php:225 +msgid "Warning: One or more users for deletion have an active membership level. Deleting a user will also cancel their membership and recurring subscription.

    " +msgstr "

    Warnung: Mindestens ein Benutzer zum Löschen hat eine aktive Mitgliedschafts-Paket. Durch das Löschen eines Benutzers wird auch die Mitgliedschaft und das wiederkehrende Abonnement gekündigt.

    " + +#: includes/cleanup.php:45 +msgid "

    Warning: This user has an active membership level. Deleting a user will also cancel their membership and recurring subscription.

    " +msgstr "

    Warnung: Dieser Benutzer hat eine aktive Mitgliedschafts-Paket. Durch das Löschen eines Benutzers wird auch die Mitgliedschaft und das wiederkehrende Abonnement gekündigt.

    " + +#: includes/compatibility/beaver-builder.php:29 +#: includes/compatibility/beaver-builder.php:126 +#: includes/compatibility/elementor.php:36 +msgid "Non-members" +msgstr "Nichtmitglieder" + +#: includes/compatibility/beaver-builder.php:35 +#: includes/compatibility/beaver-builder.php:131 +msgid "PMPro" +msgstr "" + +#: includes/compatibility/beaver-builder.php:38 +msgid "General" +msgstr "Allgemein" + +#: includes/compatibility/beaver-builder.php:42 +#: includes/compatibility/beaver-builder.php:138 +msgid "Enable Paid Memberships Pro module visibility?" +msgstr "Paid Memberships Pro-Modulsichtbarkeit aktivieren?" + +#: includes/compatibility/beaver-builder.php:57 +#: includes/compatibility/beaver-builder.php:153 +msgid "Select a level for module access" +msgstr "Wählen Sie eine Ebene für den Modulzugriff" + +#: includes/compatibility/divi.php:34 +msgid "Restrict Row by Level" +msgstr "Zeile nach Ebene einschränken" + +#: includes/compatibility/divi.php:35 includes/compatibility/divi.php:51 +msgid "Enter comma-separated level IDs." +msgstr "Geben Sie durch Kommas getrennte Paket-IDs ein." + +#: includes/compatibility/divi.php:50 +msgid "Restrict Section by Level" +msgstr "Abschnitt nach Ebene einschränken" + +#: includes/compatibility/elementor/class-pmpro-elementor-content-restriction.php:29 +msgid "Require Membership Level" +msgstr "Erfordern des Mitgliedschafts-Paketes" + +#: includes/compatibility/elementor/class-pmpro-elementor-content-restriction.php:41 +msgid "Require membership level to see this content." +msgstr "Erforderlich ist das Mitgliedschafts-Paket, um diesen Inhalt anzuzeigen." + +#: includes/currencies.php:44 +msgid "Ghanaian Cedi (₵)" +msgstr "Ghanaischer Cedi (₵)" + +#: includes/currencies.php:59 +msgid "Kenyan Shilling" +msgstr "Kenianischer Schilling" + +#: includes/currencies.php:68 +msgid "Romanian Leu" +msgstr "Rumänische Leu" + +#: includes/currencies.php:103 +msgid "Ukrainian Hryvnia (₴)" +msgstr "Ukrainische Hrywna (₴)" + +#. translators: 1: the old hook name, 2: the new or replacement hook name +#: includes/deprecated.php:21 +msgid "The %1$s hook has been deprecated in Paid Memberships Pro. Please use the %2$s hook instead." +msgstr "Der Hook von %1$s ist in PMPro veraltet. Bitte verwenden Sie stattdessen den%2$s Hook." + +#. translators: %s: The list of deprecated plugins that are active. +#: includes/deprecated.php:107 +msgid "Some Add Ons are now merged into the Paid Memberships Pro core plugin. The features of the following plugins are now included in PMPro by default. You should delete these unnecessary plugins from your site: %s." +msgstr "Einige Add-Ons sind jetzt im Paid Memberships Pro Core Plugin zusammengeführt. Die Funktionen der folgenden Plugins sind jetzt standardmäßig in PMPro enthalten. Sie sollten diese unnötigen Plugins von Ihrer Website löschen: %s ." + +#: includes/email-templates.php:12 +msgid "An email from !!sitename!!" +msgstr "Eine E-Mail von !!sitename!!" + +#: includes/email-templates.php:13 +msgid "Default Email" +msgstr "Standard-E-Mail" + +#: includes/email-templates.php:14 +msgid "!!body!!" +msgstr "!!body!!" + +#: includes/email-templates.php:15 +msgid "This email is sent when there is a general message that needs to be communicated to the site administrator." +msgstr "Diese E-Mail wird gesendet, wenn eine allgemeine Nachricht an den Site-Administrator übermittelt werden muss." + +#: includes/email-templates.php:19 +msgid "Email Footer" +msgstr "E-Mail Fußzeile" + +#: includes/email-templates.php:20 +msgid "" +"

    \n" +"\tRespectfully,
    \n" +"\t!!sitename!!\n" +"

    " +msgstr "" +"

    \n" +"Mit freundlichen Grüßen,
    \n" +"\t!!sitename!!\n" +"

    " + +#: includes/email-templates.php:24 +msgid "This is the closing message included in every email sent to members and the site administrator through Paid Memberships Pro." +msgstr "Dies ist die Abschlussnachricht, die in jeder E-Mail enthalten ist, die über Paid Memberships Pro an Mitglieder und den Site-Administrator gesendet wird." + +#: includes/email-templates.php:28 +msgid "Email Header" +msgstr "E-Mail Kopfzeile" + +#: includes/email-templates.php:29 +msgid "

    Dear !!name!!,

    " +msgstr "

    Sehr geehrte(r) !!name!!

    " + +#: includes/email-templates.php:30 +msgid "This is the opening message included in every email sent to members and the site administrator through Paid Memberships Pro." +msgstr "Dies ist die Eröffnungsnachricht, die in jeder E-Mail enthalten ist, die über Paid Memberships Pro an Mitglieder und den Site-Administrator gesendet wird." + +#: includes/email-templates.php:33 +msgid "Your membership at !!sitename!! has been changed" +msgstr "Ihre Mitgliedschaft bei !!sitename!! wurde geändert" + +#: includes/email-templates.php:34 +msgid "Admin Change" +msgstr "Admin-Änderung" + +#: includes/email-templates.php:35 +msgid "" +"

    An administrator at !!sitename!! has changed your membership level.

    \n" +"\t\t\n" +"

    !!membership_change!!

    \n" +"\t\t\n" +"

    If you did not request this membership change and would like more information please contact us at !!siteemail!!

    \n" +"\t\t\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Ein Administrator bei !!sitename!! hat Ihr Mitgliedschafts-Paket geändert.

    \n" +"\t\t\n" +"

    !!membership_change!!

    \n" +"\t\t\n" +"

    Wenn Sie diese Mitgliedschaftsänderung nicht beantragt haben und weitere Informationen wünschen, kontaktieren Sie uns bitte unter !!siteemail!!

    \n" +"\t\t\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:42 +msgid "The site administrator can manually update a user's membership level through the WordPress admin. This email notifies the member of the level update." +msgstr "Der Site-Administrator kann das Mitgliedschafts-Paket eines Benutzers manuell über den WordPress-Administrator aktualisieren. Diese E-Mail benachrichtigt das Mitglied über die Aktualisierung des Mitgliedschafts-Paketes." + +#: includes/email-templates.php:45 +msgid "Membership for !!user_login!! at !!sitename!! has been changed" +msgstr "Mitgliedschaft für !!user_login!! bei !!sitename!! wurde geändert" + +#: includes/email-templates.php:46 +msgid "Admin Change (admin)" +msgstr "Admin-Änderung (admin)" + +#: includes/email-templates.php:47 +msgid "" +"

    An administrator at !!sitename!! has changed a membership level for !!name!!.

    \n" +"\n" +"

    !!membership_change!!

    \n" +"\n" +"

    Log in to your WordPress admin here: !!login_url!!

    " +msgstr "" +"

    Ein Administrator bei !!sitename!! hat ein Mitgliedschafts-Paket für !!name!! geändert.

    \n" +"\n" +"

    !!membership_change!!

    \n" +"\n" +"

    Melden Sie sich hier bei Ihrem WordPress-Admin an: !!login_url!!

    " + +#: includes/email-templates.php:52 +msgid "The site administrator can manually update a user's membership level through the WordPress admin. This email notifies the site administrator of the level update." +msgstr "Der Site-Administrator kann das Mitgliedschafts-Paket eines Benutzers manuell über den WordPress-Administrator aktualisieren. Diese E-Mail benachrichtigt den Site-Administrator über die Paket-Aktualisierung." + +#: includes/email-templates.php:55 +msgid "Invoice for order #: !!order_code!!" +msgstr "Rechnung für Bestellung Nummer: !!order_code!!" + +#: includes/email-templates.php:57 +msgid "" +"

    Thank you for your membership to !!sitename!!. Below is your invoice for order #: !!order_code!!

    \n" +"\n" +"!!invoice!!\n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    \n" +"\n" +"

    To view an online version of this invoice, click here: !!invoice_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Unten ist Ihre Rechnung für Bestellung Nummer: !!order_code!!

    \n" +"\n" +"!!invoice!!\n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    \n" +"\n" +"

    Um eine Online-Version dieser Rechnung zu sehen, klicken Sie hier: !!invoice_url!!

    " + +#: includes/email-templates.php:64 +msgid "The site administrator can manually send a user a copy of this invoice email via the Memberships > Orders admin page." +msgstr "Der Site-Administrator kann einem Benutzer manuell eine Kopie dieser Rechnungs-E-Mail über die Admin-Seite Mitgliedschaften > Bestellungen senden." + +#: includes/email-templates.php:67 +msgid "Your billing information has been updated at !!sitename!!" +msgstr "Ihre Rechnungsinformationen wurden aktualisiert: !!sitename!!" + +#: includes/email-templates.php:69 +msgid "" +"

    Your billing information at !!sitename!! has been changed.

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    \n" +"\tBilling Information:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    If you did not request a billing information change please contact us at !!siteemail!!

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Ihre Rechnungsinformationen unter !!sitename!! wurde geändert.

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    \n" +"\tRechnungsinformationen:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!!/!!expirationyear!!\n" +"

    Wenn Sie keine Änderung der Rechnungsinformationen angefordert haben, kontaktieren Sie uns bitte unter !!siteemail!!

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:77 +msgid "Members can update the payment method associated with their recurring subscription. This email is sent to the member as a confirmation of a payment method update." +msgstr "Mitglieder können die Zahlungsmethode aktualisieren, die mit ihrem wiederkehrenden Abonnement verknüpft ist. Diese E-Mail wird als Bestätigung einer Aktualisierung der Zahlungsmethode an das Mitglied gesendet." + +#: includes/email-templates.php:80 +msgid "Billing information has been updated for !!user_login!! at !!sitename!!" +msgstr "Die Abrechnungsinformationen wurden für !!user_login!! aktualisiert: !!sitename!!" + +#: includes/email-templates.php:81 +msgid "Billing (admin)" +msgstr "Rechnung (admin)" + +#: includes/email-templates.php:82 +msgid "" +"

    The billing information for !!display_name!! at !!sitename!! has been changed.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    \n" +"\tBilling Information:
    \n" +"\t!!billing_name!!
    \n" +"\t!!billing_street!!
    \n" +"\t!!billing_city!!, !!billing_state!! !!billing_zip!!\t!!billing_country!!\n" +"\t!!billing_phone!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Log in to your WordPress dashboard here: !!login_url!!

    " +msgstr "" +"

    Die Rechnungsinformationen für !!display_name!! bei!!sitename!! wurde geändert.

    \n" +"\n" +"

    \n" +"\tKonto: !!display_name!! (!!user_email!!)

    \n" +"

    \n" +"\tRechnungsinformationen:
    \n" +"\t!!billing_name!!
    \n" +"\t!!billing_street!!
    \n" +"\t!!billing_city!!, !!billing_state!! !!billing_zip!!\t!!billing_country!!\n" +"\t!!billing_phone!!\n" +"

    \n" +"\n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Melden Sie sich hier in Ihrem WordPress-Dashboard an: !!login_url!!

    " + +#: includes/email-templates.php:99 +msgid "Members can update the payment method associated with their recurring subscription. This email is sent to the site administrator as a confirmation of a payment method update." +msgstr "Mitglieder können die Zahlungsmethode aktualisieren, die mit ihrem wiederkehrenden Abonnement verknüpft ist. Diese E-Mail wird als Bestätigung für eine Aktualisierung der Zahlungsmethode an den Websiteadministrator gesendet." + +#: includes/email-templates.php:102 +msgid "Membership payment failed at !!sitename!!" +msgstr "Mitgliedszahlung fehlgeschlagen bei !!sitename!!" + +#: includes/email-templates.php:103 +msgid "Billing Failure" +msgstr "Bezahlvorgang fehlgeschlagen" + +#: includes/email-templates.php:104 +msgid "" +"

    The current subscription payment for your !!sitename!! membership has failed. Please click the following link to log in and update your billing information to avoid account suspension. !!login_url!!

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    " +msgstr "" +"

    Die aktuelle Abonnementzahlung für Ihre !!sitename!! Mitgliedschaft ist fehlgeschlagen. Bitte klicken Sie auf den folgenden Link, um sich anzumelden und Ihre Rechnungsinformationen zu aktualisieren, um eine Kontosperrung zu vermeiden. !!login_url!!

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    " + +#: includes/email-templates.php:107 +msgid "This email is sent out if a recurring payment has failed, usually due to an expired or cancelled credit card. This email is sent to the member to allowing them time to update payment information without a disruption in access to your site." +msgstr "Diese E-Mail wird versendet, wenn eine wiederkehrende Zahlung fehlgeschlagen ist, in der Regel aufgrund einer abgelaufenen oder stornierten Kreditkarte. Diese E-Mail wird an das Mitglied gesendet, damit es Zeit hat, Zahlungsinformationen ohne Unterbrechung des Zugriffs auf Ihre Website zu aktualisieren." + +#: includes/email-templates.php:110 +msgid "Membership payment failed for !!display_name!! at !!sitename!!" +msgstr "Mitgliedszahlung fehlgeschlagen für !!display_name!! bei !!sitename!!" + +#: includes/email-templates.php:111 +msgid "Billing Failure (admin)" +msgstr "Abrechnungsfehler (admin)" + +#: includes/email-templates.php:112 +msgid "" +"

    The subscription payment for !!user_login!! at !!sitename!! has failed.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"\n" +"

    Log in to your WordPress admin here: !!login_url!!

    \n" +msgstr "" +"

    Die Abonnementzahlung für !!user_login!! bei !!sitename!! ist fehlgeschlagen.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"\n" +"

    Melden Sie sich hier bei Ihrem WordPress-Admin an: !!login_url!!

    \n" + +#: includes/email-templates.php:119 +msgid "This email is sent out if a recurring payment has failed for a member, usually due to an expired or cancelled credit card. This email is sent to the site administrator." +msgstr "Diese E-Mail wird versendet, wenn eine wiederkehrende Zahlung für ein Mitglied fehlgeschlagen ist, in der Regel aufgrund einer abgelaufenen oder stornierten Kreditkarte. Diese E-Mail wird an den Site-Administrator gesendet." + +#: includes/email-templates.php:122 +msgid "Your membership at !!sitename!! has been CANCELLED" +msgstr "Ihre Mitgliedschaft bei !!sitename!! wurde storniert" + +#: includes/email-templates.php:124 +msgid "" +"

    Your membership at !!sitename!! has been cancelled.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"\n" +"

    If you did not request this cancellation and would like more information please contact us at !!siteemail!!

    " +msgstr "" +"

    Ihre Mitgliedschaft bei !!sitename!! wurde storniert.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"\n" +"

    Wenn Sie diese Stornierung nicht beantragt haben und weitere Informationen wünschen, kontaktieren Sie uns bitte unter !!siteemail!!

    " + +#: includes/email-templates.php:130 +msgid "The site administrator can manually cancel a user's membership through the WordPress admin or the member can cancel their own membership through your site. This email is sent to the member as confirmation of a cancelled membership." +msgstr "Der Site-Administrator kann die Mitgliedschaft eines Benutzers manuell über den WordPress-Administrator kündigen oder das Mitglied kann seine eigene Mitgliedschaft über Ihre Website kündigen. Diese E-Mail wird als Bestätigung einer gekündigten Mitgliedschaft an das Mitglied gesendet." + +#: includes/email-templates.php:133 +msgid "Membership for !!user_login!! at !!sitename!! has been CANCELLED" +msgstr "Die Mitgliedschaft für !!user_login!! bei !!sitename!! wurde storniert" + +#: includes/email-templates.php:134 +msgid "Cancel (admin)" +msgstr "Kündigung (admin)" + +#: includes/email-templates.php:135 +msgid "" +"

    The membership for !!user_login!! at !!sitename!! has been cancelled.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Start Date: !!startdate!!

    \n" +"

    End Date: !!enddate!!

    \n" +"\n" +"

    Log in to your WordPress admin here: !!login_url!!

    " +msgstr "" +"

    Die Mitgliedschaft für !!user_login!! bei !!sitename!! wurde storniert.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Startdatum: !!startdate!!

    \n" +"

    Enddatum: !!enddate!!

    \n" +"\n" +"

    Melden Sie sich hier bei Ihrem WordPress-Admin an: !!login_url!!

    " + +#: includes/email-templates.php:143 +msgid "The site administrator can manually cancel a user's membership through the WordPress admin or the member can cancel their own membership through your site. This email is sent to the site administrator as confirmation of a cancelled membership." +msgstr "Der Site-Administrator kann die Mitgliedschaft eines Benutzers manuell über den WordPress-Administrator kündigen oder das Mitglied kann seine eigene Mitgliedschaft über Ihre Website kündigen. Diese E-Mail wird als Bestätigung einer gekündigten Mitgliedschaft an den Site-Administrator gesendet." + +#: includes/email-templates.php:146 includes/email-templates.php:192 +#: includes/email-templates.php:234 includes/email-templates.php:261 +#: includes/email-templates.php:310 includes/email-templates.php:367 +msgid "Your membership confirmation for !!sitename!!" +msgstr "Ihre Mitgliedsbestätigung für !!sitename!!" + +#: includes/email-templates.php:147 +msgid "Checkout - Check" +msgstr "Buchung - Scheck" + +#: includes/email-templates.php:148 +msgid "" +"

    Thank you for your membership to !!sitename!!. Your membership account is now active.

    \n" +"\n" +"!!membership_level_confirmation_message!!\n" +"\n" +"!!instructions!!\n" +"\n" +"

    Below are details about your membership account and a receipt for your initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Ihr Mitgliedskonto ist jetzt aktiv.

    !!membership_level_confirmation_message!!\n" +"\n" +"!!instructions!!\n" +"\n" +"

    Unten finden Sie Details zu Ihrem Mitgliedskonto und eine Quittung für Ihre erste Mitgliedschaftsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!\n" +"

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tRechnungs-Nummer!!invoice_id!! auf !!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:167 +msgid "This is a membership confirmation welcome email sent to a new member or to existing members that change their level using the \"Pay by Check\" gateway." +msgstr "Dies ist eine Willkommens-E-Mail zur Bestätigung der Mitgliedschaft, die an ein neues Mitglied oder an bestehende Mitglieder gesendet wird, die ihre Stufe über das Gateway \"Pay by Check\" ändern." + +#: includes/email-templates.php:170 includes/email-templates.php:214 +#: includes/email-templates.php:248 includes/email-templates.php:286 +#: includes/email-templates.php:339 includes/email-templates.php:396 +msgid "Member checkout for !!membership_level_name!! at !!sitename!!" +msgstr "Mitglieder Checkout für !!membership_level_name!! bei !!sitename!!" + +#: includes/email-templates.php:171 +msgid "Checkout - Check (admin)" +msgstr "Buchung - Scheck (admin)" + +#: includes/email-templates.php:172 +msgid "" +"

    There was a new member checkout at !!sitename!!.

    \n" +"\n" +"

    They have chosen to pay by check.

    \n" +"\n" +"

    Below are details about the new membership account and a receipt for the initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: $!!invoice_total!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Es gab eine neue Mitglieder-Anmeldung bei !!sitename!!.

    \n" +"\n" +"

    Das Mitglied sich entschieden, als Scheck zu bezahlen.

    \n" +"\n" +"

    Unten finden Sie Details zum neuen Mitgliedskonto und eine Quittung für die ursprüngliche Mitgliedsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    Rechnungs-Nummer!!invoice_id!! auf!!invoice_date!!
    \n" +"\n" +"Insgesamt abgerechnet: $!!invoice_total!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:189 +msgid "This is the membership confirmation email sent to the site administrator for every membership checkout using the \"Pay by Check\" gateway." +msgstr "Dies ist die Bestätigungs-E-Mail zur Mitgliedschaft, die an den Site-Administrator für jeden Mitglieds-Checkout über das Gateway \"Pay by Check\" gesendet wird." + +#: includes/email-templates.php:193 +msgid "Checkout - PayPal Express" +msgstr "Buchung - PayPal Express" + +#: includes/email-templates.php:194 +msgid "" +"

    Thank you for your membership to !!sitename!!. Your membership account is now active.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Below are details about your membership account and a receipt for your initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    \n" +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Ihr Mitgliedskonto ist jetzt aktiv.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Unten finden Sie Details zu Ihrem Mitgliedskonto und eine Quittung für Ihre erste Mitgliedschaftsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tRechnungs-Nummer: !!invoice_id!! am !!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    \n" + +#: includes/email-templates.php:210 +msgid "This is a membership confirmation welcome email sent to a new member or to existing members that change their level using the \"PayPal Express\" gateway." +msgstr "Dies ist eine Willkommens-E-Mail zur Bestätigung der Mitgliedschaft, die an ein neues Mitglied oder an bestehende Mitglieder gesendet wird, die ihre Stufe über das Gateway \"PayPal Express\" ändern." + +#: includes/email-templates.php:215 +msgid "Checkout - PayPal Express (admin)" +msgstr "Buchung - PayPal Express (admin)" + +#: includes/email-templates.php:216 +msgid "" +"

    There was a new member checkout at !!sitename!!.

    \n" +"

    Below are details about the new membership account and a receipt for the initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    \n" +msgstr "" +"

    Es gab eine neue Mitglieder-Anmeldung bei !!sitename!!.

    \n" +"

    Unten finden Sie Details zum neuen Mitgliedskonto und eine Quittung für die ursprüngliche Mitgliedsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tRechnungs-Nummer!!invoice_id!! am !!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    \n" + +#: includes/email-templates.php:231 +msgid "This is the membership confirmation email sent to the site administrator for every membership checkout using the \"PayPal Express\" gateway." +msgstr "Dies ist die Bestätigungs-E-Mail zur Mitgliedschaft, die an den Site-Administrator für jeden Mitglieds-Checkout über das Gateway \"PayPal Express\" gesendet wird." + +#: includes/email-templates.php:235 +msgid "Checkout - Free" +msgstr "Buchung - Kostenlos" + +#: includes/email-templates.php:236 +msgid "" +"

    Thank you for your membership to !!sitename!!. Your membership account is now active.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Below are details about your membership account.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Ihr Mitgliedskonto ist jetzt aktiv.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Unten finden Sie Details zu Ihrem Mitgliedskonto.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:245 +msgid "This is a membership confirmation welcome email sent to a new member or to existing members that change their level when the level has no charge." +msgstr "Dies ist eine Willkommens-E-Mail zur Bestätigung der Mitgliedschaft, die an ein neues Mitglied oder an bestehende Mitglieder gesendet wird, die ihre Stufe ändern, wenn die Stufe kostenlos ist." + +#: includes/email-templates.php:249 +msgid "Checkout - Free (admin)" +msgstr "Buchung - Kostenlos (admin)" + +#: includes/email-templates.php:250 +msgid "" +"

    There was a new member checkout at !!sitename!!.

    \n" +"

    Below are details about the new membership account.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Es gab eine neue Mitglieder-Anmeldung bei !!sitename!!.

    \n" +"

    Unten finden Sie Details zum neuen Mitgliedskonto.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:258 +msgid "This is the membership confirmation email sent to the site administrator for every membership checkout that has no charge." +msgstr "Dies ist die Bestätigungs-E-Mail zur Mitgliedschaft, die an den Site-Administrator für jeden kostenpflichtigen Mitglieds-Checkout gesendet wird." + +#: includes/email-templates.php:262 +msgid "Checkout - Free Trial" +msgstr "Buchung- Kostenlose Testphase" + +#: includes/email-templates.php:263 +msgid "" +"

    Thank you for your membership to !!sitename!!. Your membership account is now active.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Below are details about your membership account.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tBilling Information on File:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Ihr Mitgliedskonto ist jetzt aktiv.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Unten finden Sie Details zu Ihrem Mitgliedskonto.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tGespeicherte Rechnungsinformationen:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    !!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:283 includes/email-templates.php:393 +msgid "This is a membership confirmation welcome email sent to a new member or to existing members that change their level with a trial period." +msgstr "Dies ist eine Willkommens-E-Mail zur Bestätigung der Mitgliedschaft, die an ein neues Mitglied oder an bestehende Mitglieder gesendet wird, die ihre Stufe mit einer Testphase ändern." + +#: includes/email-templates.php:287 +msgid "Checkout - Free Trial (admin)" +msgstr "Buchung- Kostenlose Testphase (admin)" + +#: includes/email-templates.php:288 +msgid "" +"

    There was a new member checkout at !!sitename!!.

    \n" +"

    Below are details about the new membership account and a receipt for the initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tBilling Information on File:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Es gab eine neue Mitglieder-Anmeldung bei !!sitename!!.

    \n" +"

    Unten finden Sie Details zum neuen Mitgliedskonto und eine Quittung für die ursprüngliche Mitgliedsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tGespeicherte Rechnungsinformationen:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!! /!!expirationyear!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:307 includes/email-templates.php:421 +msgid "This is the membership confirmation email sent to the site administrator for every membership checkout with a trial period." +msgstr "Dies ist die Bestätigungs-E-Mail zur Mitgliedschaft, die an den Websiteadministrator für jeden Mitgliedschafts-Checkout mit einem Testzeitraum gesendet wird." + +#: includes/email-templates.php:311 +msgid "Checkout - Paid" +msgstr "Buchung - Bezahlt" + +#: includes/email-templates.php:312 includes/email-templates.php:369 +msgid "" +"

    Thank you for your membership to !!sitename!!. Your membership account is now active.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Below are details about your membership account and a receipt for your initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"

    \n" +"\tBilling Information:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Ihr Mitgliedskonto ist jetzt aktiv.

    \n" +"!!membership_level_confirmation_message!!\n" +"

    Unten finden Sie Details zu Ihrem Mitgliedskonto und eine Quittung für Ihre erste Mitgliedschaftsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tRechnungs-Nummer!!invoice_id!! auf!!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!\n" +"

    \n" +"

    \n" +"\tRechnungsinformationen:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!! /!!expirationyear!!\n" +"

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:336 +msgid "This is a membership confirmation welcome email sent to a new member or to existing members that change their level and complete a paid checkout on the site." +msgstr "Dies ist eine Willkommens-E-Mail zur Bestätigung der Mitgliedschaft, die an ein neues Mitglied oder an bestehende Mitglieder gesendet wird, die ihre Stufe ändern und einen bezahlten Checkout auf der Website abschließen." + +#: includes/email-templates.php:340 +msgid "Checkout - Paid (admin)" +msgstr "Buchung - Bezahlt (admin)" + +#: includes/email-templates.php:341 includes/email-templates.php:398 +msgid "" +"

    There was a new member checkout at !!sitename!!.

    \n" +"

    Below are details about the new membership account and a receipt for the initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"

    \n" +"\tBilling Information:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Es gab eine neue Mitglieder-Anmeldung bei !!sitename!!.

    \n" +"

    Unten finden Sie Details zum neuen Mitgliedskonto und eine Quittung für die ursprüngliche Mitgliedsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tRechnungs-Nummer: !!invoice_id!! am !!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!\n" +"

    \n" +"

    \n" +"Rechnungsinformationen:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!! /!!expirationyear!!\n" +"

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:364 +msgid "This is the membership confirmation email sent to the site administrator for every paid membership checkout on the site." +msgstr "Dies ist die Bestätigungs-E-Mail zur Mitgliedschaft, die an den Websiteadministrator für jeden bezahlten Mitgliedschafts-Checkout auf der Website gesendet wird." + +#: includes/email-templates.php:368 +msgid "Checkout - Trial" +msgstr "Buchung - Testphase" + +#: includes/email-templates.php:397 +msgid "Checkout - Trial (admin)" +msgstr "Buchung - Testphase (admin)" + +#: includes/email-templates.php:424 +msgid "Credit card on file expiring soon at !!sitename!!" +msgstr "Ihre Kreditkarte läuft bald ab: !!sitename!!" + +#: includes/email-templates.php:425 +msgid "Credit Card Expiring" +msgstr "Kreditkarte läuft aus" + +#: includes/email-templates.php:426 +msgid "" +"

    The payment method used for your membership at !!sitename!! will expire soon. Please click the following link to log in and update your billing information to avoid account suspension. !!login_url!!

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    The most recent account information we have on file is:

    \n" +"\n" +"

    !!billing_name!!
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    " +msgstr "" +"

    Die Zahlungsmethode, die für Ihre Mitgliedschaft bei !!sitename!! Verwendet wurde, läuft bald ab. Bitte klicken Sie auf den folgenden Link, um sich anzumelden und Ihre Rechnungsinformationen zu aktualisieren, um eine Kontosperrung zu vermeiden. !!login_url!!

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Die neuesten Kontoinformationen, die wir gespeichert haben, sind:

    \n" +"\n" +"

    !!billing_name!!
    \n" +"\t!!billing_address!!

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!! /!!expirationyear!!\n" +"

    " + +#: includes/email-templates.php:439 +msgid "This email is sent when a member's payment method will be expiring soon. This allows the member to update their payment method before a payment failure, which may result in lost access to member features." +msgstr "Diese E-Mail wird gesendet, wenn die Zahlungsmethode eines Mitglieds bald abläuft. Dies ermöglicht es dem Mitglied, seine Zahlungsmethode vor einem Zahlungsfehler zu aktualisieren, was zu einem Verlust des Zugriffs auf die Mitgliederfunktionen führen kann." + +#: includes/email-templates.php:442 +msgid "Invoice for !!sitename!! membership" +msgstr "Rechnung für !!sitename!! Mitgliedschaft" + +#: includes/email-templates.php:443 +msgid "Invoice" +msgstr "Rechnung" + +#: includes/email-templates.php:444 +msgid "" +"

    Thank you for your membership to !!sitename!!. Below is a receipt for your most recent membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"

    \n" +"\tBilling Information:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tExpires: !!expirationmonth!!/!!expirationyear!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    \n" +"

    To view an online version of this invoice, click here: !!invoice_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Nachfolgend finden Sie eine Quittung für Ihre letzte Mitgliedsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    \n" +"\tRechnungs-Nummer!!invoice_id!! auf!!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!

    \n" +"

    \n" +"\tRechnungsinformationen:
    \n" +"\t!!billing_address!!\n" +"

    \n" +"\n" +"

    \n" +"\t!!cardtype!!: !!accountnumber!!
    \n" +"\tLäuft ab: !!expirationmonth!! /!!expirationyear!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    \n" +"

    Um eine Online-Version dieser Rechnung zu sehen, klicken Sie hier: !!invoice_url!!

    " + +#: includes/email-templates.php:463 +msgid "This email is sent to the member each time a new subscription payment is made." +msgstr "Diese E-Mail wird jedes Mal an das Mitglied gesendet, wenn eine neue Abonnementzahlung erfolgt." + +#: includes/email-templates.php:466 +msgid "Your membership at !!sitename!! has ended" +msgstr "Ihre Mitgliedschaft bei !!sitename!! ist beendet" + +#: includes/email-templates.php:467 +msgid "Membership Expired" +msgstr "Mitgliedschaft abgelaufen" + +#: includes/email-templates.php:468 +msgid "" +"

    Your membership at !!sitename!! has ended.

    \n" +"\n" +"

    Thank you for your support.

    \n" +"\n" +"

    View our current membership offerings here: !!levels_url!!

    \n" +"\n" +"

    Log in to manage your account here: !!login_url!!

    " +msgstr "" +"

    Ihre Mitgliedschaft bei !!sitename!! ist beendet.

    \n" +"\n" +"

    Schade, dass Sie uns verlassen.

    \n" +"\n" +"

    Sehen Sie sich hier unsere aktuellen Mitgliedschaftsangebote an: !!levels_url!!

    \n" +"\n" +"

    Melden Sie sich hier an, um Ihr Konto zu verwalten: !!login_url!!

    " + +#: includes/email-templates.php:475 +msgid "This email is sent to the member when their membership expires." +msgstr "Diese E-Mail wird an das Mitglied gesendet, wenn seine Mitgliedschaft abläuft." + +#: includes/email-templates.php:478 +msgid "Your membership at !!sitename!! will end soon" +msgstr "Ihre Mitgliedschaft bei !!sitename!! wird bald enden" + +#: includes/email-templates.php:479 +msgid "Membership Expiring" +msgstr "Mitgliedschaft läuft ab" + +#: includes/email-templates.php:480 +msgid "" +"

    Thank you for your membership to !!sitename!!. This is just a reminder that your membership will end on !!enddate!!.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Dies ist nur eine Erinnerung daran, dass Ihre Mitgliedschaft am enden wird .

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:486 +msgid "This email is sent to the member when their expiration date is approaching, at an interval based on the term of the membership." +msgstr "Diese E-Mail wird an das Mitglied gesendet, wenn sich sein Ablaufdatum nähert, in einem Intervall, das auf der Laufzeit der Mitgliedschaft basiert." + +#: includes/email-templates.php:489 +msgid "Your trial at !!sitename!! is ending soon" +msgstr "Ihre Testphase der Mitgliedschaft bei !!sitename!! endet bald" + +#: includes/email-templates.php:490 +msgid "Trial Ending" +msgstr "Testphase endet" + +#: includes/email-templates.php:491 +msgid "" +"

    Thank you for your membership to !!sitename!!. Your trial period is ending on !!trial_end!!.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"\n" +"

    Your fee will be changing from !!trial_amount!! to !!billing_amount!! every !!cycle_number!! !!cycle_period!!(s).

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Mitgliedschaft bei !!sitename!!. Ihre Testphase endet am !!trial_end!!.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"\n" +"

    Ihre Gebühr ändert sich von !!trial_amount!! zu !!billing_amount!! alle !!cycle_number!! !!cycle_period!!(*).

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/email-templates.php:499 +msgid "This email is sent to the member when the trial portion of their membership level is approaching, at an interval based on the term of the trial." +msgstr "Diese E-Mail wird an das Mitglied gesendet, wenn sich der Testteil seiner Mitgliedschafts-Paket nähert, und zwar in einem Intervall, das auf der Laufzeit der Testphase basiert." + +#: includes/email-templates.php:508 +msgid "Payment action required for your !!sitename!! membership" +msgstr "Zahlungsaktion erforderlich für Ihre !!sitename!! Mitgliedschaft" + +#: includes/email-templates.php:509 +msgid "Payment Action Required" +msgstr "Zahlungsaktion erforderlich" + +#: includes/email-templates.php:510 +msgid "" +"

    Customer authentication is required to finish setting up your subscription at !!sitename!!.

    \n" +"\n" +"

    Please complete the verification steps issued by your payment provider at the following link:

    \n" +"

    !!invoice_url!!

    " +msgstr "" +"

    Eine Kundenauthentifizierung ist erforderlich, um die Einrichtung Ihres Abonnements unter !!sitename!! abzuschließen.

    \n" +"\n" +"

    Bitte führen Sie die Verifizierungsschritte Ihres Zahlungsanbieters unter folgendem Link aus:

    \n" +"

    !!invoice_url!!

    " + +#: includes/email-templates.php:514 +msgid "This email is sent to the user when an attempted membership checkout requires additional customer authentication." +msgstr "Diese E-Mail wird an den Benutzer gesendet, wenn für einen Versuch, eine Mitgliedschaft zu buchen, eine zusätzliche Kundenauthentifizierung erforderlich ist." + +#: includes/email-templates.php:517 +msgid "Payment action required: membership for !!user_login!! at !!sitename!!" +msgstr "Zahlungsaktion erforderlich: Mitgliedschaft für !!user_login!! bei !!sitename!!" + +#: includes/email-templates.php:518 +msgid "Payment Action Required (admin)" +msgstr "Zahlungsaktion erforderlich (admin)" + +#: includes/email-templates.php:519 +msgid "" +"

    A payment at !!sitename!! for !!user_login!! requires additional customer authentication to complete.

    \n" +"

    Below is a copy of the email we sent to !!user_email!! to notify them that they need to complete their payment:

    \n" +"\n" +"

    Customer authentication is required to finish setting up your subscription at !!sitename!!.

    \n" +"\n" +"

    Please complete the verification steps issued by your payment provider at the following link:

    \n" +"

    !!invoice_url!!

    " +msgstr "" +"

    Eine Zahlung an !!sitename!! für !!user_login!! erfordert eine zusätzliche Kundenauthentifizierung, um abgeschlossen zu werden.

    \n" +"

    Unten ist eine Kopie der E-Mail, die wir an !!user_email!! um sie darüber zu informieren, dass sie ihre Zahlung abschließen müssen:

    \n" +"\n" +"

    Eine Kundenauthentifizierung ist erforderlich, um die Einrichtung Ihres Abonnements unter !!sitename!! abzuschließen.

    \n" +"\n" +"

    Bitte führen Sie die Verifizierungsschritte Ihres Zahlungsanbieters unter folgendem Link aus:

    \n" +"

    !!invoice_url!!

    " + +#: includes/email-templates.php:526 +msgid "This email is sent to the site administrator when an attempted membership checkout requires additional customer authentication." +msgstr "Diese E-Mail wird an den Site-Administrator gesendet, wenn für einen Versuch, eine Mitgliedschaft zu buchen, eine zusätzliche Kundenauthentifizierung erforderlich ist." + +#: includes/email.php:210 includes/email.php:218 includes/email.php:225 +msgid "Template Saved" +msgstr "Vorlage gespeichert" + +#: includes/email.php:376 includes/email.php:396 includes/email.php:403 +msgid "THIS IS A TEST EMAIL" +msgstr "DIES IST EINE TEST E-MAIL" + +#: includes/functions.php:2433 +msgid "Sign Up Now" +msgstr "Jetzt registrieren" + +#: includes/lib/SendWP/sendwp.php:149 +msgid "Security failed to check pmpro_sendwp_install_nonce" +msgstr "Sicherheit konnte pmpro_sendwp_install_nonce nicht überprüfen" + +#: includes/lib/SendWP/sendwp.php:150 +msgid "Ask an administrator for install_plugins capability" +msgstr "Fragen Sie einen Administrator nach install_plugins Funktion" + +#: includes/lib/SendWP/sendwp.php:151 +msgid "SendWP is already connected." +msgstr "SendWP ist bereits verbunden." + +#: includes/localization.php:34 +msgid "Hour" +msgstr "Stunde" + +#: includes/localization.php:47 +msgid "Hours" +msgstr "Stunden" + +#: includes/login.php:268 includes/login.php:292 +msgid "Welcome" +msgstr "Willkommen" + +#: includes/login.php:270 includes/login.php:294 +msgid "Lost Password" +msgstr "Passwort vergessen" + +#: includes/login.php:272 includes/login.php:296 includes/login.php:523 +#: includes/login.php:699 +msgid "Reset Password" +msgstr "Passwort zurücksetzen" + +#: includes/login.php:320 includes/login.php:861 +msgid "There was a problem with your username or password." +msgstr "Es ist ein Problem mit Ihrem Benutzernamen oder Kennwort aufgetreten." + +#: includes/login.php:324 +msgid "Unknown username. Check again or try your email address." +msgstr "Unbekannter Benutzername. Überprüfen Sie dies, oder versuchen Sie es mit Ihrer E-Mail-Adresse." + +#: includes/login.php:328 +msgid "Empty username. Please enter your username and try again." +msgstr "Leerer Benutzername. Geben Sie Ihren Benutzernamen ein, und versuchen Sie es erneut." + +#: includes/login.php:332 +msgid "Empty password. Please enter your password and try again." +msgstr "Leeres Kennwort. Geben Sie Ihr Kennwort ein, und versuchen Sie es erneut." + +#: includes/login.php:336 +msgid "The password you entered for the user is incorrect. Please try again." +msgstr "Das Kennwort, das Sie für den Benutzer eingegeben haben, ist falsch. Bitte versuchen Sie es erneut." + +#: includes/login.php:340 +msgid "Check your email for the confirmation link." +msgstr "Bitte überprüfen Sie Ihren Posteingang. Sie haben eine E-Mail mit Bestätigungslink erhalten." + +#: includes/login.php:355 +msgid "You are now logged out." +msgstr "Sie haben sich erfolgreich abgemeldet." + +#: includes/login.php:359 +msgid "There was a problem logging you out." +msgstr "Es ist ein Problem beim Abmelden aufgetreten." + +#: includes/login.php:370 +msgid "Check your email for a link to reset your password." +msgstr "Überprüfen Sie Ihre E-Mail. Wir haben Ihnen einen Link gesendet, um Ihr Passwort zurückzusetzen." + +#: includes/login.php:373 +msgid "There was an unexpected error regarding your email. Please try again" +msgstr "Es ist ein unerwarteter Fehler in Bezug auf Ihre E-Mail aufgetreten. Bitte versuchen Sie es erneut" + +#: includes/login.php:383 +msgid "Your reset password key is invalid." +msgstr "Ihr Kennwortschlüssel zum Zurücksetzen ist ungültig." + +#: includes/login.php:387 +msgid "Your reset password key is expired, please request a new key from the password reset page." +msgstr "Ihr Kennwortschlüssel zum Zurücksetzen ist abgelaufen, bitte fordern Sie einen neuen Schlüssel von der Seite zum Zurücksetzen des Kennworts an." + +#: includes/login.php:399 +msgid "Your password has successfully been updated." +msgstr "Ihr Kennwort wurde erfolgreich aktualisiert." + +#: includes/login.php:403 +msgid "There was a problem updating your password" +msgstr "Beim Aktualisieren Ihres Kennworts ist ein Problem aufgetreten." + +#: includes/login.php:417 +msgid "There is no account with that username or email address." +msgstr "Es gibt kein Konto mit diesem Benutzernamen oder dieser E-Mail-Adresse." + +#: includes/login.php:421 +msgid "Please enter a valid username." +msgstr "Bitte geben Sie einen gültigen Benutzernamen ein." + +#: includes/login.php:425 +msgid "You've entered an invalid email address." +msgstr "Sie haben eine ungültige E-Mail-Adresse eingegeben." + +#: includes/login.php:429 includes/profile.php:843 includes/profile.php:855 +msgid "New passwords do not match." +msgstr "Die neuen Passwörter stimmen nicht überein." + +#: includes/login.php:433 includes/profile.php:839 includes/profile.php:851 +msgid "Please complete all fields." +msgstr "Bitte füllen Sie alle Felder aus." + +#: includes/login.php:437 +msgid "The email could not be sent. This site may not be correctly configured to send emails." +msgstr "Die E-Mail konnte nicht gesendet werden. Diese Website ist möglicherweise nicht ordnungsgemäß für das Senden von E-Mails konfiguriert." + +#: includes/login.php:503 +msgid "Password Reset" +msgstr "Passwort zurücksetzen" + +#: includes/login.php:508 +msgid "Please enter your username or email address. You will receive a link to create a new password via email." +msgstr "Bitte geben Sie Ihre E-Mail-Adresse hier ein. Sie bekommen eine E-Mail zugesandt, mit deren Hilfe Sie ein neues Passwort erstellen können." + +#: includes/login.php:533 +msgid "You are already signed in." +msgstr "Sie sind bereits angemeldet." + +#: includes/login.php:568 +msgid "Username or Email Address" +msgstr "Nutzername oder E-Mail Adresse" + +#: includes/login.php:573 +msgid "Get New Password" +msgstr "Neues Passwort anfordern" + +#: includes/login.php:688 includes/profile.php:891 includes/profile.php:903 +msgid "New Password" +msgstr "Neues Passwort" + +#: includes/login.php:690 includes/profile.php:894 includes/scripts.php:86 +#: includes/profile.php:906 includes/scripts.php:85 +msgid "Strength Indicator" +msgstr "Passwortstärke-Anzeiger" + +#: includes/login.php:694 includes/profile.php:898 includes/profile.php:910 +msgid "Confirm New Password" +msgstr "Neues Passwort bestätigen" + +#: includes/login.php:724 +msgid "Join Now" +msgstr "Registrieren" + +#: includes/login.php:726 +msgid "Register" +msgstr "Registrieren" + +#: includes/login.php:731 +msgid "Lost Password?" +msgstr "Passwort vergessen?" + +#: includes/login.php:809 +msgid "Invalid Request" +msgstr "Ungültige Anfrage" + +#. translators: a generated link to the user's account or profile page +#: includes/login.php:933 +msgid "Welcome, %s" +msgstr "Willkommen, %s" + +#: includes/login.php:967 includes/menus.php:76 includes/menus.php:79 +#: includes/menus.php:169 shortcodes/pmpro_account.php:198 +msgid "Log Out" +msgstr "Abmelden" + +#: includes/menus.php:105 +msgid "Paid Memberships Pro Page" +msgstr "Paid Memberships Pro Seite" + +#: includes/menus.php:162 includes/menus.php:171 +msgid "Page" +msgstr "Seite" + +#: includes/menus.php:231 +msgid "Log In Widget - PMPro" +msgstr "Log In Widget - PMPro" + +#: includes/notifications.php:25 +msgid "Dismiss this notice." +msgstr "Diesen Hinweis ausblenden." + +#: includes/pointers.php:31 +msgid "PMPro v2.0 Update" +msgstr "PMPro v2.0 Update" + +#: includes/pointers.php:32 +msgid "The Memberships menu has moved. Check out the new dashboard. The Membership Levels and Discount Codes pages can now be found under Settings." +msgstr "Das Mitglieds-Menü hat sich verschoben. Schauen Sie sich das neue Dashboard an. Die Mitgliedschaftspakete und Rabatt-Code-Seiten finden Sie jetzt unter Einstellungen ." + +#: includes/pointers.php:47 +msgid "Close" +msgstr "Schließen" + +#: includes/profile.php:58 pages/invoice.php:43 +#: shortcodes/pmpro_account.php:244 +msgid "Paid" +msgstr "Bezahlt" + +#: includes/profile.php:410 +msgid "Member History" +msgstr "Verlauf der Mitgliedschaften" + +#: includes/profile.php:413 +msgid "Order History" +msgstr "Bestellverlauf" + +#: includes/profile.php:414 +msgid "Membership Levels History" +msgstr "Ihre bisherigen Mitgliedschaften" + +#: includes/profile.php:485 includes/profile.php:488 +msgid "No membership orders found." +msgstr "Keine Mitgliedschaftsbestellungen gefunden." + +#: includes/profile.php:537 includes/profile.php:546 +msgid "No membership history found." +msgstr "Keine Mitgliedschaftshistorie gefunden." + +#: includes/profile.php:644 includes/profile.php:656 +msgid "Log in to edit your profile." +msgstr "Melden Sie sich an, um Ihr Profil zu bearbeiten." + +#: includes/profile.php:679 includes/profile.php:691 +msgid "Please enter a display name." +msgstr "Geben Sie einen Anzeigenamen ein." + +#: includes/profile.php:689 includes/profile.php:701 +msgid "Please enter an email address." +msgstr "Bitte geben Sie eine E-Mail Adresse ein." + +#: includes/profile.php:691 includes/profile.php:703 +msgid "The email address isn’t correct." +msgstr "Die E-Mail Adresse ist nicht korrekt." + +#: includes/profile.php:695 includes/profile.php:707 +msgid "This email is already registered, please choose another one." +msgstr "Diese E-Mail-Adresse ist bereits registriert. Bitte wählen Sie eine andere aus." + +#: includes/profile.php:722 includes/profile.php:734 +msgid "Your profile has been updated." +msgstr "Ihr Profil wurde aktualisiert." + +#: includes/profile.php:749 includes/profile.php:761 +msgid "Display name publicly as" +msgstr "Anzeigename öffentlich als" + +#: includes/profile.php:762 includes/profile.php:774 +msgid "Site administrators must use the WordPress dashboard to update their email address." +msgstr "Site-Administratoren müssen das WordPress-Dashboard verwenden, um ihre E-Mail-Adresse zu aktualisieren." + +#: includes/profile.php:785 includes/profile.php:797 +msgid "Update Profile" +msgstr "Profil aktualisieren" + +#: includes/profile.php:841 includes/profile.php:853 +msgid "Please enter your current password." +msgstr "Bitte geben Sie Ihr derzeitiges Passwort ein." + +#: includes/profile.php:845 includes/profile.php:857 +msgid "Your current password is incorrect." +msgstr "Ihr derzeitiges Passwort ist nicht korrekt." + +#: includes/profile.php:856 includes/profile.php:868 +msgid "Your password has been updated." +msgstr "Ihr Passwort wurde aktualisiert." + +#: includes/profile.php:886 includes/profile.php:898 +msgid "Current Password" +msgstr "Aktuelles Passwort" + +#: includes/profile.php:888 includes/profile.php:893 includes/profile.php:900 +#: includes/profile.php:905 includes/profile.php:912 +msgid "Required Field" +msgstr "Pflichtfeld" + +#: includes/recaptcha.php:114 +msgid "Please check the ReCAPTCHA box to confirm you are not a bot." +msgstr "Bitte aktivieren Sie das Kontrollkästchen reCAPTCHA, um zu bestätigen, dass Sie kein Bot sind." + +#: includes/updates/upgrade_1.php:10 +msgid "This content is for !!levels!! members only.
    Login Join Now" +msgstr "Dieser Inhalt ist nur für !!levels!! Mitglieder.
    Login Jetzt registrieren" + +#: includes/widgets.php:17 +msgid "Display a login form and optional \"Logged In\" member content." +msgstr "Anmeldeformular und den optionalen \"Logged In\" Inhalt des Mitglieds anzeigen." + +#: includes/widgets.php:19 +msgid "Log In - PMPro" +msgstr "Log In - PMPro" + +#: includes/widgets.php:104 +msgid "Display \"Welcome\" content when logged in." +msgstr "\"Willkommen\" Inhalte anzeigen, wenn Sie angemeldet sind." + +#: includes/widgets.php:109 +msgid "Display a \"Log Out\" link." +msgstr "\"Abmelden\" Link anzeigen." + +#: includes/widgets.php:114 +msgid "Display the \"Log In Widget\" menu." +msgstr "Das Menü \"Widget Log In“ anzeigen." + +#: includes/widgets.php:124 +msgid "Customize this menu per level using the Nav Menus Add On. Assign the menu under Appearance > Menus." +msgstr "Passen Sie dieses Menü pro Ebene mit dem Nav Menus Add Onan an. Weisen Sie das Menü unter Aussehen > Menüs zu." + +#: pages/billing.php:136 +msgid "Your billing information cannot be updated at this time." +msgstr "Ihre Rechnungsinformationen können derzeit nicht aktualisiert werden." + +#: pages/billing.php:458 shortcodes/pmpro_account.php:68 +msgid "Your membership is not active. Renew now." +msgstr "Ihre Mitgliedschaft ist nicht aktiv. Jetzt erneuern." + +#: pages/billing.php:461 shortcodes/pmpro_account.php:71 +msgid "You do not have an active membership. Register here." +msgstr "Sie haben keine aktive Mitgliedschaft. Hier Registrieren." + +#: pages/billing.php:464 shortcodes/pmpro_account.php:74 +msgid "You do not have an active membership. Choose a membership level." +msgstr "Sie haben keine aktive Mitgliedschaft. Wählen Sie ein Mitgliedschafts-Paket aus." + +#: pages/checkout.php:85 +msgid "

    A member's Braintree subscription has expired at your site. This typically happens if you've set up billing limits on your levels.

    We have not removed the user's membership level.

    You can view details on this user here: %s

    " +msgstr "

    Das Braintree-Abonnement eines Mitglieds ist auf Ihrer Website abgelaufen. Dies geschieht normalerweise, wenn Sie Abrechnungslimits für Ihre Paket eingerichtet haben.

    Wir haben das Mitgliedschafts-Paket des Benutzers nicht entfernt.

    Details zu diesem Benutzer finden Sie hier: %s

    " + +#: services/braintree-webhook.php:427 services/braintree-webhook.php:428 +msgid "A member's Braintree subscription has expired at %s" +msgstr "Das Braintree-Abonnement eines Mitglieds ist bei %s abgelaufen" + +#: shortcodes/pmpro_account.php:249 +msgid "Refunded" +msgstr "Rückerstattet" + +#: blocks/account-invoices-section/block.js:22 +#: blocks/account-invoices-section/block.js:39 js/blocks.build.js:119 +#: js/blocks.build.js:137 +msgid "Membership Account: Invoices" +msgstr "Mitgliedskonto: Rechnungen" + +#: blocks/account-invoices-section/block.js:23 js/blocks.build.js:120 +msgid "Displays the member's invoices." +msgstr "Zeigt die Rechnungen des Mitglieds an." + +#: blocks/account-invoices-section/block.js:30 +#: blocks/account-links-section/block.js:30 +#: blocks/account-membership-section/block.js:30 +#: blocks/account-page/block.js:32 blocks/account-profile-section/block.js:31 +#: blocks/billing-page/block.js:30 blocks/cancel-page/block.js:30 +#: blocks/checkout-button/block.js:40 blocks/checkout-page/block.js:36 +#: blocks/confirmation-page/block.js:30 blocks/invoice-page/block.js:30 +#: blocks/levels-page/block.js:30 blocks/login/block.js:35 +#: blocks/member-profile-edit/block.js:26 blocks/membership/block.js:39 +#: js/blocks.build.js:127 js/blocks.build.js:184 js/blocks.build.js:241 +#: js/blocks.build.js:311 js/blocks.build.js:500 js/blocks.build.js:557 +#: js/blocks.build.js:685 js/blocks.build.js:758 js/blocks.build.js:981 +#: js/blocks.build.js:1144 js/blocks.build.js:1214 js/blocks.build.js:1271 +#: js/blocks.build.js:1335 js/blocks.build.js:1496 js/blocks.build.js:1560 +msgid "pmpro" +msgstr "" + +#: blocks/account-links-section/block.js:22 js/blocks.build.js:176 +msgid "Membership Account: Links" +msgstr "Mitgliedskonto: Links" + +#: blocks/account-links-section/block.js:23 js/blocks.build.js:177 +msgid "Displays the member's member links. This block is only visible if other Add Ons or custom code have added links." +msgstr "Zeigt die Mitgliederlinks des Mitglieds an. Dieser Block ist nur sichtbar, wenn Sie andere Zusatzfunktionen oder benutzerdefinierter Code-Links hinzugefügt haben." + +#: blocks/account-links-section/block.js:39 js/blocks.build.js:194 +msgid "Membership Account: Member Links" +msgstr "Mitgliedskonto: Mitgliederlinks" + +#: blocks/account-membership-section/block.js:22 js/blocks.build.js:233 +msgid "Membership Account: Memberships" +msgstr "Mitgliedskonto: Mitgliedschaften" + +#: blocks/account-membership-section/block.js:23 js/blocks.build.js:234 +msgid "Displays the member's membership information." +msgstr "Zeigt die Mitgliedschaftsinformationen des Mitglieds an." + +#: blocks/account-membership-section/block.js:39 js/blocks.build.js:251 +msgid "Membership Account: My Memberships" +msgstr "Mitgliedskonto: Meine Mitgliedschaften" + +#: blocks/account-page/block.js:25 js/blocks.build.js:304 +msgid "Displays the sections of the Membership Account page as selected below." +msgstr "Zeigt die Abschnitte der Seite Mitgliedskonto an, wie unten ausgewählt." + +#: blocks/account-page/inspector.js:30 js/blocks.build.js:419 +msgid "Show 'My Memberships' Section" +msgstr "Abschnitt \"Meine Mitgliedschaften\" anzeigen" + +#: blocks/account-page/inspector.js:37 js/blocks.build.js:427 +msgid "Show 'Profile' Section" +msgstr "Abschnitt \"Profil\" anzeigen" + +#: blocks/account-page/inspector.js:44 js/blocks.build.js:435 +msgid "Show 'Invoices' Section" +msgstr "Abschnitt \"Rechnungen\" anzeigen" + +#: blocks/account-page/inspector.js:51 js/blocks.build.js:443 +msgid "Show 'Member Links' Section" +msgstr "Abschnitt \"Mitgliederlinks\" anzeigen" + +#: blocks/account-profile-section/block.js:23 +#: blocks/account-profile-section/block.js:40 js/blocks.build.js:492 +#: js/blocks.build.js:510 +msgid "Membership Account: Profile" +msgstr "Mitgliedskonto: Profil" + +#: blocks/account-profile-section/block.js:24 js/blocks.build.js:493 +msgid "Displays the member's profile information." +msgstr "Zeigt die Profilinformationen des Mitglieds an." + +#: blocks/billing-page/block.js:22 blocks/billing-page/block.js:39 +#: js/blocks.build.js:549 js/blocks.build.js:567 +msgid "Membership Billing Page" +msgstr "Abrechnungsseite für Mitgliedschaften" + +#: blocks/billing-page/block.js:23 js/blocks.build.js:550 +msgid "Displays the member's billing information and allows them to update the payment method." +msgstr "Zeigt die Rechnungsinformationen des Mitglieds an und ermöglicht es ihm, die Zahlungsmethode zu aktualisieren." + +#: blocks/cancel-page/block.js:23 js/blocks.build.js:678 +msgid "Generates the Membership Cancel page." +msgstr "Generiert die Seite Mitgliedschaft kündigen." + +#: blocks/checkout-button/block.js:31 js/blocks.build.js:750 +msgid "Membership Checkout Button" +msgstr "Schaltfläche \"Mitgliedschaft buchen“" + +#: blocks/checkout-button/block.js:32 js/blocks.build.js:751 +msgid "Displays a button-styled link to Membership Checkout for the specified level." +msgstr "Zeigt einen Link im Schaltflächenstil zum Buchen der Mitgliedschaft für das angegebene Paket an." + +#: blocks/checkout-button/block.js:41 js/blocks.build.js:758 +msgid "buy" +msgstr "kaufen" + +#: blocks/checkout-button/block.js:42 js/blocks.build.js:758 +msgid "level" +msgstr "Paket" + +#: blocks/checkout-button/block.js:68 blocks/checkout-button/inspector.js:31 +#: js/blocks.build.js:790 js/blocks.build.js:891 +msgid "Button Text" +msgstr "Button Text" + +#: blocks/checkout-button/block.js:79 blocks/checkout-button/inspector.js:48 +#: js/blocks.build.js:807 js/blocks.build.js:910 +msgid "CSS Class" +msgstr "CSS Klasse" + +#: blocks/checkout-button/inspector.js:32 js/blocks.build.js:892 +msgid "Text for checkout button" +msgstr "Text für die Schaltfläche „Buchen“" + +#: blocks/checkout-button/inspector.js:40 js/blocks.build.js:901 +msgid "The level to link to for checkout button" +msgstr "Die Ebene, auf die für die Schaltfläche \"Buchen\" verlinkt werden soll" + +#: blocks/checkout-button/inspector.js:49 js/blocks.build.js:911 +msgid "Additional styling for checkout button" +msgstr "Zusätzliches Styling für Buchungs-Schaltfläche" + +#: blocks/checkout-page/block.js:28 blocks/checkout-page/block.js:52 +#: js/blocks.build.js:973 js/blocks.build.js:1003 +msgid "Membership Checkout Form" +msgstr "Buchungs-Formular für die Mitgliedschaft" + +#: blocks/checkout-page/block.js:29 js/blocks.build.js:974 +msgid "Displays the Membership Checkout form." +msgstr "Zeigt das Formular Mitgliedschaft buchen an." + +#: blocks/checkout-page/inspector.js:32 js/blocks.build.js:1087 +msgid "Choose a default level for Membership Checkout." +msgstr "Wählen Sie ein Standardpaket für die Buchung der Mitgliedschaft aus." + +#: blocks/confirmation-page/block.js:23 js/blocks.build.js:1137 +msgid "Displays the member's Membership Confirmation after Membership Checkout." +msgstr "Zeigt die Mitgliedschaftsbestätigung des Mitglieds nach der Buchung der Mitgliedschaft an." + +#: blocks/invoice-page/block.js:23 js/blocks.build.js:1207 +msgid "Displays the member's Membership Invoices." +msgstr "Zeigt die Mitgliedsrechnungen des Mitglieds an." + +#: blocks/invoice-page/block.js:39 js/blocks.build.js:1224 +msgid "Membership Invoices" +msgstr "Mitgliedsrechnungen" + +#: blocks/levels-page/block.js:22 blocks/levels-page/block.js:39 +#: js/blocks.build.js:1263 js/blocks.build.js:1281 +msgid "Membership Levels List" +msgstr "Liste der Mitgliedschaftspakete" + +#: blocks/levels-page/block.js:23 js/blocks.build.js:1264 +msgid "Displays a list of Membership Levels. To change the order, go to Memberships > Settings > Levels." +msgstr "Zeigt eine Liste der Mitgliedschaftspakete an. Um die Reihenfolge zu ändern, gehen Sie zu Mitgliedschaften > Einstellungen > Pakete." + +#: blocks/login/block.js:23 blocks/login/block.js:47 js/blocks.build.js:1327 +#: js/blocks.build.js:1344 +msgid "Log in Form" +msgstr "Anmeldeformular" + +#: blocks/login/block.js:24 js/blocks.build.js:1328 +msgid "Displays a Log In Form for Paid Memberships Pro." +msgstr "Zeigt ein Anmeldeformular für Paid Memberships Pro an." + +#: blocks/login/block.js:36 js/blocks.build.js:1335 +msgid "login" +msgstr "Login" + +#: blocks/login/block.js:37 js/blocks.build.js:1335 +msgid "form" +msgstr "Formular" + +#: blocks/login/block.js:38 js/blocks.build.js:1335 +msgid "log in" +msgstr "Log In" + +#: blocks/login/inspector.js:29 js/blocks.build.js:1424 +msgid "Display 'Welcome' content when logged in." +msgstr "\"Willkommen\"-Inhalte anzeigen, wenn Sie angemeldet sind." + +#: blocks/login/inspector.js:38 js/blocks.build.js:1432 +msgid "Display the 'Log In Widget' menu." +msgstr "Menü „Widget Log In“ anzeigen." + +#: blocks/login/inspector.js:48 js/blocks.build.js:1441 +msgid "Display a 'Log Out' link." +msgstr "Link \"Abmelden\" anzeigen." + +#: blocks/member-profile-edit/block.js:17 +#: blocks/member-profile-edit/block.js:35 js/blocks.build.js:1488 +#: js/blocks.build.js:1504 +msgid "Member Profile Edit" +msgstr "Mitgliedsprofil bearbeiten Seite" + +#: blocks/member-profile-edit/block.js:18 js/blocks.build.js:1489 +msgid "Allow member profile editing." +msgstr "Bearbeiten von Mitgliederprofilen zulassen." + +#: blocks/member-profile-edit/block.js:27 js/blocks.build.js:1496 +msgid "member" +msgstr "Mitglied" + +#: blocks/member-profile-edit/block.js:28 js/blocks.build.js:1496 +msgid "profile" +msgstr "Profil" + +#: blocks/membership/block.js:31 js/blocks.build.js:1552 +msgid "Require Membership Block" +msgstr "Mitgliedschaftsblock erforderlich" + +#: blocks/membership/block.js:32 js/blocks.build.js:1553 +msgid "Control the visibility of nested blocks for members or non-members." +msgstr "Steuern Sie die Sichtbarkeit von verschachtelten Blöcken für Mitglieder oder Nichtmitglieder." + +#: adminpages/dashboard.php:147 +msgid "Customize Email Templates" +msgstr "Anpassen von E-Mail-Vorlagen" + +#: adminpages/discountcodes.php:871 adminpages/discountcodes.php:873 +msgid "View Orders" +msgstr "Bestellungen ansehen" + +#: adminpages/paymentsettings.php:115 +msgid "Learn more about Payment Gateway Settings and SSL." +msgstr "Erfahren Sie mehr über Payment Gateway-Einstellungen und SSL." + +#: classes/gateways/class.pmprogateway_stripe.php:360 +#: classes/gateways/class.pmprogateway_stripe.php:450 +#: classes/gateways/class.pmprogateway_stripe.php:366 +#: classes/gateways/class.pmprogateway_stripe.php:456 +msgid "Connected with Legacy Keys" +msgstr "Verbunden mit Legacy-Schlüsseln" + +#: classes/gateways/class.pmprogateway_stripe.php:370 +#: classes/gateways/class.pmprogateway_stripe.php:460 +#: classes/gateways/class.pmprogateway_stripe.php:376 +#: classes/gateways/class.pmprogateway_stripe.php:466 +msgid "You can continue to use the legacy API keys or choose to upgrade to our new Stripe Connect solution below." +msgstr "Sie können weiterhin die Legacy-API-Schlüssel verwenden oder ein Upgrade auf unsere neue Stripe Connect-Lösung durchführen." + +#: classes/gateways/class.pmprogateway_stripe.php:372 +#: classes/gateways/class.pmprogateway_stripe.php:462 +#: classes/gateways/class.pmprogateway_stripe.php:378 +#: classes/gateways/class.pmprogateway_stripe.php:468 +msgid "Read the documentation on switching to Stripe Connect »" +msgstr "Lesen Sie die Dokumentation zum Umstieg auf Stripe Connect »" + +#: adminpages/emailtemplates.php:181 +msgid "Custom Level Confirmation Message" +msgstr "Bestätigungsmeldung für benutzerdefinierte Ebene" + +#: classes/class-pmpro-site-health.php:62 +msgid "This debug information for your Paid Memberships Pro installation can assist you in getting support." +msgstr "Diese Debug-Informationen für Ihre Installation von Paid Memberships Pro können Ihnen dabei helfen, Support zu erhalten." + +#: classes/class-pmpro-site-health.php:109 +msgid "No Levels Found" +msgstr "Keine Pakete gefunden" + +#. translators: %d: The total count of discount codes. +#: classes/class-pmpro-site-health.php:128 +msgid "%d discount code" +msgid_plural "%d discount codes" +msgstr[0] "%d Rabattcode" +msgstr[1] "%d Rabattcodes" + +#. translators: %d: The total count of orders. +#: classes/class-pmpro-site-health.php:144 +msgid "%d order" +msgid_plural "%d orders" +msgstr[0] "%d Bestellung" +msgstr[1] "%d Bestellungen" + +#. translators: %s: The gateway name that is not registered. +#: classes/class-pmpro-site-health.php:161 +msgid "%s (gateway not registered)" +msgstr "%s (Gateway nicht registriert)" + +#: classes/class-pmpro-site-health.php:174 +msgid "Legacy Keys" +msgstr "Legacy-Schlüssel" + +#: classes/class-pmpro-site-health.php:178 +msgid "Stripe Connect" +msgstr "Stripe Connect" + +#. translators: %s: The environment name that is not registered. +#: classes/class-pmpro-site-health.php:202 +msgid "%s (environment not registered)" +msgstr "%s (Umgebung nicht registriert)" + +#: classes/class-pmpro-site-health.php:226 +msgid "Unable to verify" +msgstr "Überprüfung nicht möglich" + +#: classes/class-pmpro-site-health.php:302 +msgid "missing" +msgstr "fehlt" + +#: classes/gateways/class.pmprogateway_stripe.php:533 +#: classes/gateways/class.pmprogateway_stripe.php:539 +msgid "Having trouble connecting through the button above or otherwise need to use your own API keys?" +msgstr "Haben Sie Probleme beim Herstellen einer Verbindung über die Schaltfläche oben oder müssen Sie anderweitig Ihre eigenen API-Schlüssel verwenden?" + +#: classes/gateways/class.pmprogateway_stripe.php:534 +#: classes/gateways/class.pmprogateway_stripe.php:540 +msgid "Click here to use the legacy API settings." +msgstr "Klicken Sie hier, um die Legacy-API-Einstellungen zu verwenden." + +#: adminpages/license.php:37 +msgid "There was an issue validating your license key: %s" +msgstr "Bei der Validierung Ihres Lizenzschlüssels ist ein Problem aufgetreten" + +#: includes/email-templates.php:172 +msgid "" +"

    There was a new member checkout at !!sitename!!.

    \n" +"\n" +"

    They have chosen to pay by check.

    \n" +"\n" +"

    Below are details about the new membership account and a receipt for the initial membership invoice.

    \n" +"\n" +"

    Account: !!display_name!! (!!user_email!!)

    \n" +"

    Membership Level: !!membership_level_name!!

    \n" +"

    Membership Fee: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tInvoice #!!invoice_id!! on !!invoice_date!!
    \n" +"\tTotal Billed: !!invoice_total!!\n" +"

    \n" +"\n" +"

    Log in to your membership account here: !!login_url!!

    " +msgstr "" +"

    Vielen Dank für Ihre Anmeldung bei !!sitename!!.

    \n" +"\n" +"

    Sie haben sich entschieden, als Scheck zu bezahlen.

    \n" +"\n" +"

    Unten finden Sie Details zum neuen Mitgliedskonto und eine Quittung für die ursprüngliche Mitgliedsrechnung.

    \n" +"\n" +"

    Konto: !!display_name!! (!!user_email!!)

    \n" +"

    Mitgliedschafts-Paket: !!membership_level_name!!

    \n" +"

    Mitgliedsbeitrag: !!membership_cost!!

    \n" +"!!membership_expiration!! !!discount_code!!\n" +"\n" +"

    \n" +"\tRechnungs-Nummer!!invoice_id!! am !!invoice_date!!
    \n" +"\tInsgesamt abgerechnet: !!invoice_total!!

    \n" +"\n" +"

    Loggen Sie sich hier in Ihr Mitgliedskonto ein: !!login_url!!

    " + +#: includes/license.php:112 +msgid "Missing key." +msgstr "Fehlender Schlüssel." + +#: shortcodes/pmpro_account.php:145 +msgctxt "A dash is shown when there is no expiration date." +msgid "—" +msgstr "" + +#~ msgid "The new level is %s." +#~ msgstr "Das neue Paket ist %s." + +#~ msgid "The new level is %s. This membership is free" +#~ msgstr "Das neue Paket ist %s. Diese Mitgliedschaft ist kostenlos." From 8d95c7bed1c75feae62f0119a4efa0356d5c04b8 Mon Sep 17 00:00:00 2001 From: Jason Coleman Date: Tue, 19 Apr 2022 09:10:33 +1000 Subject: [PATCH 113/145] changelog update --- CHANGELOG.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f2f9f1809..7c4e70da6 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -5,10 +5,24 @@ * ENHANCEMENT: Introduced a new set of functions that handle cron-related tasks including: `pmpro_get_crons()` to get the list of PMPro registered crons. #1999 (@sc0ttkclark) * ENHANCEMENT: New filter `pmpro_registered_crons` which you can register new crons to be handled by PMPro. They show up in the PMPro Site Health info and are automatically scheduled when they need to be. #1999 (@sc0ttkclark) * ENHANCEMENT: Added an opt-in stats collection so we can get better insight on how people use Paid Memberships Pro. (@sc0ttkclark, @ideadude) +* ENHANCEMENT: Added Formal German translation files. #1926 +* ENHANCEMENT: Tracking library conflicts in Site Health, e.g. when other plugins are loading gateway libraries at the same time as PMPro. (@dparker1005) +* ENHANCEMENT: UI/UX improvements to the Orders admin area for list and single edit view. #2017 (@kimcoleman) +* ENHANCEMENT: Improved the UI for email template variables reference on the Settings > Email Templates admin page. #2018 (@kimcoleman) +* ENHANCEMENT: Various other UI improvements to the admin area. #2019 (@kimcoleman) +* ENHANCEMENT: Improved block names, descriptions, keywords, and organization for discover and usability. #2011 (@kimcoleman) +* ENHANCEMENT: Added "show_noaccess" as a setting on the Membership Required block for swapping in the appropriate content message. #2011 (@kimcoleman) +* ENHANCEMENT: Added filter 'pmpro_braintree_transaction_sale_array' to allow adding or adjusting of the sale transaction method. #2006 (@andrewlimaza) +* ENHANCEMENT: Moved the TOS input inside the label to support multiline i18n. #2002 (#mircobabini) +* ENHANCEMENT: Added new action `pmpro_checkout_after_tos` to output content after the TOS. #2003 (@mircobabini) +* ENHANCEMENT: Added filters to change gateway ipn/webhook logfile. #1996 (@mircobabini) +* ENHANCEMENT: Added filter to perform actions during PPHttpPost() method of the PayPal gateways. #1992 (@mircobabini) +* ENHANCEMENT: Added untranslated gateway identifiers to Site Health info. #1989 (@JarrydLong) * BUG FIX/ENHANCEMENT: Fixed escaping and localization for many strings across the codebase. #1976 (@mircobabini) * BUG FIX/ENHANCEMENT: Resolve admin area conflicts with other plugins using similar class names. #1991 (@sc0ttkclark) * BUG FIX: Crons are now automatically rescheduled if they disappear form the cron schedule. #1999 (@sc0ttkclark, @mircobabini) * BUG FIX: Resolved problems with PHP float precision and prevent passing along faulty floats to the gateway APIs. #1929 (@sc0ttkclark) +* BUG FIX: Fixed issue where TOS setting was not saving when using the PayFast gateway. #1990 (@andrewlimaza) = 2.7.5 - 2022-03-01 = * ENHANCEMENT: Now sending "name" separate from the "description" when creating customers for Stripe checkouts. (@ideadude) From f2531784f33842415d43c42679ab09a564f20518 Mon Sep 17 00:00:00 2001 From: Kim Coleman Date: Tue, 19 Apr 2022 10:04:11 -0400 Subject: [PATCH 114/145] Updating the language and adding a link to more information about usage tracking. --- adminpages/advancedsettings.php | 11 +++++++---- classes/class-pmpro-wisdom-integration.php | 2 +- classes/class-pmpro-wisdom-tracker.php | 8 ++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/adminpages/advancedsettings.php b/adminpages/advancedsettings.php index 01c701b1f..a6c238251 100644 --- a/adminpages/advancedsettings.php +++ b/adminpages/advancedsettings.php @@ -495,23 +495,26 @@ class="large-text">

    -

    +

    + + . +

     

    ' . sprintf( wp_kses( __( 'Optional: Allow more customizable trial periods and renewal dates using the Subscription Delays Add On.', 'paid-memberships-pro' ), $allowed_sd_html ), 'https://www.paidmembershipspro.com/add-ons/subscription-delays/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=subscription-delays' ) . '

     

    ' . sprintf( wp_kses( __( 'Optional: Allow more customizable trial periods and renewal dates using the Subscription Delays Add On.', 'paid-memberships-pro' ), $allowed_sd_html ), 'https://www.paidmembershipspro.com/add-ons/subscription-delays/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=subscription-delays' ) . '

     

    ' . sprintf( wp_kses( __( 'Optional: Allow more customizable expiration dates using the Set Expiration Date Add On.', 'paid-memberships-pro' ), $allowed_sed_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-expiration-date/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=pmpro-expiration-date' ) . '

     

    ' . sprintf( wp_kses( __( 'Optional: Allow more customizable expiration dates using the Set Expiration Date Add On.', 'paid-memberships-pro' ), $allowed_sed_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-expiration-date/?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=pmpro-expiration-date' ) . '