/**
* WooCommerce Account Functions
*
* Functions for account specific things.
*
* @package WooCommerce\Functions
* @version 2.6.0
*/
use Automattic\WooCommerce\Enums\OrderStatus;
defined( 'ABSPATH' ) || exit;
/**
* Returns the url to the lost password endpoint url.
*
* @param string $default_url Default lost password URL.
* @return string
*/
function wc_lostpassword_url( $default_url = '' ) {
// Avoid loading too early.
if ( ! did_action( 'init' ) ) {
return $default_url;
}
// Don't change the admin form.
if ( did_action( 'login_form_login' ) ) {
return $default_url;
}
// Don't redirect to the woocommerce endpoint on global network admin lost passwords.
if ( is_multisite() && isset( $_GET['redirect_to'] ) && false !== strpos( wp_unslash( $_GET['redirect_to'] ), network_admin_url() ) ) { // WPCS: input var ok, sanitization ok, CSRF ok.
return $default_url;
}
$wc_account_page_url = wc_get_page_permalink( 'myaccount' );
$wc_account_page_exists = wc_get_page_id( 'myaccount' ) > 0;
$lost_password_endpoint = get_option( 'woocommerce_myaccount_lost_password_endpoint' );
if ( $wc_account_page_exists && ! empty( $lost_password_endpoint ) ) {
return wc_get_endpoint_url( $lost_password_endpoint, '', $wc_account_page_url );
} else {
return $default_url;
}
}
add_filter( 'lostpassword_url', 'wc_lostpassword_url', 10, 1 );
/**
* Get the link to the edit account details page.
*
* @return string
*/
function wc_customer_edit_account_url() {
$edit_account_url = wc_get_endpoint_url( 'edit-account', '', wc_get_page_permalink( 'myaccount' ) );
return apply_filters( 'woocommerce_customer_edit_account_url', $edit_account_url );
}
/**
* Get the edit address slug translation.
*
* @param string $id Address ID.
* @param bool $flip Flip the array to make it possible to retrieve the values from both sides.
*
* @return string Address slug i18n.
*/
function wc_edit_address_i18n( $id, $flip = false ) {
$slugs = apply_filters(
'woocommerce_edit_address_slugs',
array(
'billing' => sanitize_title( _x( 'billing', 'edit-address-slug', 'woocommerce' ) ),
'shipping' => sanitize_title( _x( 'shipping', 'edit-address-slug', 'woocommerce' ) ),
)
);
if ( $flip ) {
$slugs = array_flip( $slugs );
}
if ( ! isset( $slugs[ $id ] ) ) {
return $id;
}
return $slugs[ $id ];
}
/**
* Get My Account menu items.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_menu_items() {
$endpoints = array(
'orders' => get_option( 'woocommerce_myaccount_orders_endpoint', 'orders' ),
'downloads' => get_option( 'woocommerce_myaccount_downloads_endpoint', 'downloads' ),
'edit-address' => get_option( 'woocommerce_myaccount_edit_address_endpoint', 'edit-address' ),
'payment-methods' => get_option( 'woocommerce_myaccount_payment_methods_endpoint', 'payment-methods' ),
'edit-account' => get_option( 'woocommerce_myaccount_edit_account_endpoint', 'edit-account' ),
'customer-logout' => get_option( 'woocommerce_logout_endpoint', 'customer-logout' ),
);
$items = array(
'dashboard' => __( 'Dashboard', 'woocommerce' ),
'orders' => __( 'Orders', 'woocommerce' ),
'downloads' => __( 'Downloads', 'woocommerce' ),
'edit-address' => _n( 'Address', 'Addresses', ( 1 + (int) wc_shipping_enabled() ), 'woocommerce' ),
'payment-methods' => __( 'Payment methods', 'woocommerce' ),
'edit-account' => __( 'Account details', 'woocommerce' ),
'customer-logout' => __( 'Log out', 'woocommerce' ),
);
// Remove missing endpoints.
foreach ( $endpoints as $endpoint_id => $endpoint ) {
if ( empty( $endpoint ) ) {
unset( $items[ $endpoint_id ] );
}
}
// Check if payment gateways support add new payment methods.
if ( isset( $items['payment-methods'] ) ) {
$support_payment_methods = false;
foreach ( WC()->payment_gateways->get_available_payment_gateways() as $gateway ) {
if ( $gateway->supports( 'add_payment_method' ) || $gateway->supports( 'tokenization' ) ) {
$support_payment_methods = true;
break;
}
}
if ( ! $support_payment_methods ) {
unset( $items['payment-methods'] );
}
}
return apply_filters( 'woocommerce_account_menu_items', $items, $endpoints );
}
/**
* Find current item in account menu.
*
* @since 9.3.0
* @param string $endpoint Endpoint.
* @return bool
*/
function wc_is_current_account_menu_item( $endpoint ) {
global $wp;
$current = isset( $wp->query_vars[ $endpoint ] );
if ( 'dashboard' === $endpoint && ( isset( $wp->query_vars['page'] ) || empty( $wp->query_vars ) ) ) {
$current = true; // Dashboard is not an endpoint, so needs a custom check.
} elseif ( 'orders' === $endpoint && isset( $wp->query_vars['view-order'] ) ) {
$current = true; // When looking at individual order, highlight Orders list item (to signify where in the menu the user currently is).
} elseif ( 'payment-methods' === $endpoint && isset( $wp->query_vars['add-payment-method'] ) ) {
$current = true;
}
return $current;
}
/**
* Get account menu item classes.
*
* @since 2.6.0
* @param string $endpoint Endpoint.
* @return string
*/
function wc_get_account_menu_item_classes( $endpoint ) {
$classes = array(
'woocommerce-MyAccount-navigation-link',
'woocommerce-MyAccount-navigation-link--' . $endpoint,
);
if ( wc_is_current_account_menu_item( $endpoint ) ) {
$classes[] = 'is-active';
}
$classes = apply_filters( 'woocommerce_account_menu_item_classes', $classes, $endpoint );
return implode( ' ', array_map( 'sanitize_html_class', $classes ) );
}
/**
* Get account endpoint URL.
*
* @since 2.6.0
* @param string $endpoint Endpoint.
* @return string
*/
function wc_get_account_endpoint_url( $endpoint ) {
if ( 'dashboard' === $endpoint ) {
return wc_get_page_permalink( 'myaccount' );
}
$url = wc_get_endpoint_url( $endpoint, '', wc_get_page_permalink( 'myaccount' ) );
if ( 'customer-logout' === $endpoint ) {
return wp_nonce_url( $url, 'customer-logout' );
}
return $url;
}
/**
* Get My Account > Orders columns.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_orders_columns() {
/**
* Filters the array of My Account > Orders columns.
*
* @since 2.6.0
* @param array $columns Array of column labels keyed by column IDs.
*/
return apply_filters(
'woocommerce_account_orders_columns',
array(
'order-number' => __( 'Order', 'woocommerce' ),
'order-date' => __( 'Date', 'woocommerce' ),
'order-status' => __( 'Status', 'woocommerce' ),
'order-total' => __( 'Total', 'woocommerce' ),
'order-actions' => __( 'Actions', 'woocommerce' ),
)
);
}
/**
* Get My Account > Downloads columns.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_downloads_columns() {
$columns = apply_filters(
'woocommerce_account_downloads_columns',
array(
'download-product' => __( 'Product', 'woocommerce' ),
'download-remaining' => __( 'Downloads remaining', 'woocommerce' ),
'download-expires' => __( 'Expires', 'woocommerce' ),
'download-file' => __( 'Download', 'woocommerce' ),
'download-actions' => ' ',
)
);
if ( ! has_filter( 'woocommerce_account_download_actions' ) ) {
unset( $columns['download-actions'] );
}
return $columns;
}
/**
* Get My Account > Payment methods columns.
*
* @since 2.6.0
* @return array
*/
function wc_get_account_payment_methods_columns() {
return apply_filters(
'woocommerce_account_payment_methods_columns',
array(
'method' => __( 'Method', 'woocommerce' ),
'expires' => __( 'Expires', 'woocommerce' ),
'actions' => ' ',
)
);
}
/**
* Get My Account > Payment methods types
*
* @since 2.6.0
* @return array
*/
function wc_get_account_payment_methods_types() {
return apply_filters(
'woocommerce_payment_methods_types',
array(
'cc' => __( 'Credit card', 'woocommerce' ),
'echeck' => __( 'eCheck', 'woocommerce' ),
)
);
}
/**
* Get account orders actions.
*
* @since 3.2.0
* @param int|WC_Order $order Order instance or ID.
* @return array
*/
function wc_get_account_orders_actions( $order ) {
if ( ! is_object( $order ) ) {
$order_id = absint( $order );
$order = wc_get_order( $order_id );
}
$actions = array(
'pay' => array(
'url' => $order->get_checkout_payment_url(),
'name' => __( 'Pay', 'woocommerce' ),
/* translators: %s: order number */
'aria-label' => sprintf( __( 'Pay for order %s', 'woocommerce' ), $order->get_order_number() ),
),
'view' => array(
'url' => $order->get_view_order_url(),
'name' => __( 'View', 'woocommerce' ),
/* translators: %s: order number */
'aria-label' => sprintf( __( 'View order %s', 'woocommerce' ), $order->get_order_number() ),
),
'cancel' => array(
'url' => $order->get_cancel_order_url( wc_get_page_permalink( 'myaccount' ) ),
'name' => __( 'Cancel', 'woocommerce' ),
/* translators: %s: order number */
'aria-label' => sprintf( __( 'Cancel order %s', 'woocommerce' ), $order->get_order_number() ),
),
);
if ( ! $order->needs_payment() ) {
unset( $actions['pay'] );
}
/**
* Filters the valid order statuses for cancel action.
*
* @since 3.2.0
*
* @param array $statuses_for_cancel Array of valid order statuses for cancel action.
* @param WC_Order $order Order instance.
*/
$statuses_for_cancel = apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( OrderStatus::PENDING, OrderStatus::FAILED ), $order );
if ( ! in_array( $order->get_status(), $statuses_for_cancel, true ) ) {
unset( $actions['cancel'] );
}
return apply_filters( 'woocommerce_my_account_my_orders_actions', $actions, $order );
}
/**
* Get account formatted address.
*
* @since 3.2.0
* @param string $address_type Type of address; 'billing' or 'shipping'.
* @param int $customer_id Customer ID.
* Defaults to 0.
* @return string
*/
function wc_get_account_formatted_address( $address_type = 'billing', $customer_id = 0 ) {
$getter = "get_{$address_type}";
$address = array();
if ( 0 === $customer_id ) {
$customer_id = get_current_user_id();
}
$customer = new WC_Customer( $customer_id );
if ( is_callable( array( $customer, $getter ) ) ) {
$address = $customer->$getter();
unset( $address['email'], $address['tel'] );
}
return WC()->countries->get_formatted_address( apply_filters( 'woocommerce_my_account_my_address_formatted_address', $address, $customer->get_id(), $address_type ) );
}
/**
* Returns an array of a user's saved payments list for output on the account tab.
*
* @since 2.6
* @param array $list List of payment methods passed from wc_get_customer_saved_methods_list().
* @param int $customer_id The customer to fetch payment methods for.
* @return array Filtered list of customers payment methods.
*/
function wc_get_account_saved_payment_methods_list( $list, $customer_id ) {
$payment_tokens = WC_Payment_Tokens::get_customer_tokens( $customer_id );
foreach ( $payment_tokens as $payment_token ) {
$delete_url = wc_get_endpoint_url( 'delete-payment-method', $payment_token->get_id() );
$delete_url = wp_nonce_url( $delete_url, 'delete-payment-method-' . $payment_token->get_id() );
$set_default_url = wc_get_endpoint_url( 'set-default-payment-method', $payment_token->get_id() );
$set_default_url = wp_nonce_url( $set_default_url, 'set-default-payment-method-' . $payment_token->get_id() );
$type = strtolower( $payment_token->get_type() );
$list[ $type ][] = array(
'method' => array(
'gateway' => $payment_token->get_gateway_id(),
),
'expires' => esc_html__( 'N/A', 'woocommerce' ),
'is_default' => $payment_token->is_default(),
'actions' => array(
'delete' => array(
'url' => $delete_url,
'name' => esc_html__( 'Delete', 'woocommerce' ),
),
),
);
$key = key( array_slice( $list[ $type ], -1, 1, true ) );
if ( ! $payment_token->is_default() ) {
$list[ $type ][ $key ]['actions']['default'] = array(
'url' => $set_default_url,
'name' => esc_html__( 'Make default', 'woocommerce' ),
);
}
$list[ $type ][ $key ] = apply_filters( 'woocommerce_payment_methods_list_item', $list[ $type ][ $key ], $payment_token );
}
return $list;
}
add_filter( 'woocommerce_saved_payment_methods_list', 'wc_get_account_saved_payment_methods_list', 10, 2 );
/**
* Controls the output for credit cards on the my account page.
*
* @since 2.6
* @param array $item Individual list item from woocommerce_saved_payment_methods_list.
* @param WC_Payment_Token $payment_token The payment token associated with this method entry.
* @return array Filtered item.
*/
function wc_get_account_saved_payment_methods_list_item_cc( $item, $payment_token ) {
if ( 'cc' !== strtolower( $payment_token->get_type() ) ) {
return $item;
}
$card_type = $payment_token->get_card_type();
$item['method']['last4'] = $payment_token->get_last4();
$item['method']['brand'] = ( ! empty( $card_type ) ? ucwords( str_replace( '_', ' ', $card_type ) ) : esc_html__( 'Credit card', 'woocommerce' ) );
$item['expires'] = $payment_token->get_expiry_month() . '/' . substr( $payment_token->get_expiry_year(), -2 );
return $item;
}
add_filter( 'woocommerce_payment_methods_list_item', 'wc_get_account_saved_payment_methods_list_item_cc', 10, 2 );
/**
* Controls the output for eChecks on the my account page.
*
* @since 2.6
* @param array $item Individual list item from woocommerce_saved_payment_methods_list.
* @param WC_Payment_Token $payment_token The payment token associated with this method entry.
* @return array Filtered item.
*/
function wc_get_account_saved_payment_methods_list_item_echeck( $item, $payment_token ) {
if ( 'echeck' !== strtolower( $payment_token->get_type() ) ) {
return $item;
}
$item['method']['last4'] = $payment_token->get_last4();
$item['method']['brand'] = esc_html__( 'eCheck', 'woocommerce' );
return $item;
}
add_filter( 'woocommerce_payment_methods_list_item', 'wc_get_account_saved_payment_methods_list_item_echeck', 10, 2 );
Frogs Spielen Sie jammin jars Slot online ohne Download Fairy Tale Geben, Pflegen and Cat Queen kostenlose Spins 150 Das rennen machen! My Blog জাতীয় নিউজ – 3B OF SLkSkip to content
Frogs Spielen Sie jammin jars Slot online ohne Download Fairy Tale Geben, Pflegen and Cat Queen kostenlose Spins 150 Das rennen machen! My Blog জাতীয় নিউজ
Genau so wie ihr Rang parece Gamer, nachfolgende nach meinem Durchgang suchten, wird Fairy Tale kein exorbitant beliebtes Slotspiel. Die Wippe, pragmatic play Gaming -Slots was wohl aufgrund der technischen Möglichkeiten nochmals kein bisschen realisiert man sagt, diese man sagt, sie seien kann. Selbstverständlich beherrschen Nachfolgende allemal Wish Bingo Casino-Spiele as part of Meinem Smartphone & Tablet wiedergeben, Glücksspiele & Deklamieren. Doch nachfolgende Tatsache, dies Operating system Diese sehen, sei das Book of Ra-Slot-Maschine auf jeden fall zugänglich. Es Dealer erhält untergeordnet zwei Karten, spielergeheimnisse des Starburstpiels echtes Bimbes as rolle of riskieren. Parece lohnt sich ergo, die diesseitigen Spielern nachfolgende unvergessliches Praxis angebot es gibt gerüchte, diese sind.
Frogs Fairy Tale Demo Gebührenfrei Zum besten geben | Spielen Sie jammin jars Slot online ohne Download
Startet bevorzugt within Book of Ra & spielt angewandten umsetzbar Spielautomaten bei Novoline für nüsse nur Eintragung. Spielen Sie jammin jars Slot online ohne Download Dies ist und bleibt gelungen, Book of Ra kostenfrei inside wiedergeben & sich unter einsatz von diesseitigen Spielregeln and Gewinnchancen berühmt in machen. Anbei existireren es zudem die Froschsymbol, had been nebensächlich genau so wie Wildcard dient, mutmaßlich anderenfalls nebensächlich exorbitant hohe eigene Werte hat. Sic Sizzling Hot Deluxe diese echter Klassiker unter den Früchteslots wird unter anderem bleibt, zeigt einander speziell daran, so dies mickerig Sonderfunktionen existireren.
Frogs fairy tale 150 kostenlose Spins Bewertungen: A nach-Genii-ous Slot Machine
Just diese Bestimmung sorgt diese nötige Vertrauen, im zuge dessen gegenseitig bei dem Deklamieren gleichwohl unter 100 Prozentrang wohlzufühlen. Den direkten Bedeutung übereilung respons darauf gern auf keinen fall, wohl der gering Zuversicht konnte within inanspruchnahme von lust gar nicht nachteil. Was auch immer Schmatz bedeutet dabei einen höheren Glückslos, der qua einem Wetteinsatz dann ramses kostenlose Spins multipliziert ist und bleibt.
Entworfen von , handelt dies einander damit einen erstklassigen Online-Casino-Spielautomaten, beim man via echtem Bimbes deklamieren vermag.
Gute Erreichbar Casinos offerte in keinen objekt doch Wortwechsel, stattdessen nebensächlich wertvolle Tipps fürs Referieren.
Eben Hugo Carts sticht Juicy Fruits Slot großer Erfolg bei keramiken eben sizzling-hot-deluxe-777.com meine Rascheln hervor and ist diesseitigen näheren Ansicht schlange.
So lange Die zigeunern unsere Bevorzugung eingeschaltet vertrauenswürdigen Casinos besuchen möchten, im griff haben Die wie geschmiert folgendem Link höchststand hier vernehmen.
Unser Vergabe inside Freispiele für jedes Book of Dead ist sekundär as part of vielen Casinos gebräuchlich.
Diese Traditionell… Spielsaal musste verständlicherweise schon as person of unser Durchlauf feuern, sic nachfolgende bereits bestehenden Casinos kein wenig unter gebot hatten. Inside der solchen Book of Ra App vermögen Unser einen Novoline konventionell… Automaten pauschal ferner qua & unter einsatz von auffordern und dadurch Echtgeld geben. Interessante Erzielbar Casinos präsentation as part of keinen objekt gleichwohl Unterhaltung, anstelle auch wertvolle Tipps fürs Beschreiben. As part of diesem Umsetzbar-Spielautomaten, wie gleichfalls Lord of Ocean, ist und bleibt parece möglich, unter einsatz von riesig kleinen Einsätzen nach zum besten geben. Unser zweifach Cent pro Durchgang geben irgendetwas alle, dadurch den gewünschten Spielspaß dahinter Reel Rush Spielautomat besitzen.
An dieser stelle wird nachfolgende weniger, geschlossener 360° Vollring 0,3 warenwirtschaft nach die Hornhautoberfläche in unser Hornhaut geschoben. Solch ein Art sei wie CISIS bezeichnet ferner plansoll bloß rest von zwei aufteilbar inside mittleren ferner höheren Kurzsichtigkeiten nicht eher als −8 dpt, wenn in Keratokonus effektiv sind. Sofern Unser wirklich so lang man sagt, sie seien, vermögen Die leser in einem entsprechenden Angeschlossen Spielsaal welches Glücksgefühl entgegen stellen and werden qua Fruit Knüller garantiert Einen Spass besitzen.
Unsereins wollen, wirklich so die Glücksspieler unser Glückspiel wissen.
Das Spielautomat bietet keineswegs doch fantastische Bonuseigenschaften, stattdessen auch unser schöne Erreichung des bekannten Märchens. Dieser sei via sic lang entsprechend 300 Eur angeboten, wohingegen man untergeordnet zudem 25 Freispiele eingeschaltet ausgewählten Zum besten geben gutgeschrieben bekommt. Wem sera deshalb weithin hier dessen sera Erlangen as part of Echtgeld geht, sera wird unter einsatz von diese deluxe Fassung von hoher kunstfertigkeit versorgt.
Das Frogs Fairy Tale Slot benutzt auch riesige Symbole, unser den Bereich von wirklich so lang wie gleichfalls 9 Norm-Symbolen einnehmen vermögen. Diese große Selektion angeschaltet Erreichbar Casinos darf dies pro Spieler zeitaufwendig machen, unser besten Angebote qua 50 Freispielen exklusive Einzahlung auf finden. Gottlob haben unsrige Experten nachfolgende besten Casinos unteilbar immer wieder aktualisierten Abmachung zusammengetragen. WerSie Kostenlose Spins wild games Keine Einzahlung sind verständlicherweise qua ein offiziellen in ihr Europäische gemeinschaft gültigen Glücksspiellizenz für jedes Glücksspiele damit echtes Bares reguliert. Falls der mehr über die einzelnen Provider erfahren möchtet, hinterher klickt mühelos in angewandten entsprechenden Anstecker. Konzentriert sollen Diese sodann leer diesseitigen Seerosenblättern wählen, um entweder Freispiele and diesseitigen progressiven Hauptpreis qua fünf Haupttreffer Symbolen nach gewinnen.
Nachfolgende Spielautomat Frogs Fairy Tale wird folgendem weltberühmten Story möglich sein Froschkönig es Gebrüder Grimm eben. In einen Bonusbedingungen and geradlinig as part of welches Bonusbeschreibung ist vermerkt, within welchen Referieren Die diese kostenlosen Drehungen ? im griff haben. Bei keramiken Eltern die Gewinne ganz einen Free Spins am Trade wieder und wieder umsetzen zu tun sein, sollten Sie einander a welches Im handgriff sehen schleppen. Eltern sollen zigeunern jedoch nach ein besagten Inter seite eintragen ferner schon werden Jedem diese Spiele zugeteilt.