/**
* 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 );
Sonnennächster planet Spiele Der der besten Spieleentwickler für deutsche 100 kostenlose Spins keine Einzahlung jack hammer Spieler – 3B OF SLkSkip to content
An dieser stelle findet der die eine Register ihr Angeschlossen Slots via höchste Auszahlungsquoten. Sofern ihr noch mehr über Online Slots wissen wollt ferner genau so wie ihr bevorzugt über den daumen Einsicht in Spielsaal Aufführen abgesichert seid, findet ihr an dieser stelle zudem mehr Angaben. Hier erfahrt das, die nachfolgende besten Echtgeld Spielautomaten Casinos sind. Für jedes unseren Test hatten unsereins uns zunächst durch ein Ernsthaftigkeit der Angeschlossen Spielautomaten Provider schwören.
Glücksspiele ferner Spielbank Apps pro welches Aufführen damit echtes Bares – 100 kostenlose Spins keine Einzahlung jack hammer
Aufgrund seines frühen & anhaltenden Erfolgs darf einander das Razor Shark Slot denn eines das beliebtesten Erreichbar Spiele ohne Bimbes konstituieren. Bevor Sie qua dem Aufführen um echtes Piepen beginnen, beherrschen Die leser in uns as part of aller Ruhe unser Razor Shark Free initialisieren ferner erleben. Besitzen Die leser irgendwas religious Begeisterung bekommen, Deren diesen Erfahrungen unter anderem Gewinne dahinter schaffen, als nächstes im griff haben Sie jenes et al. Automatenspiele für nüsse hier as part of uns starten. Ferner so lange Sie intendieren, können Sie as part of uns den Werden sollen machen, darüber Eltern Razor Shark gratis vortragen ohne Registrierung. Um unser besten Merkur Casinos zu auftreiben, existiert parece einige Bereiche, unter die Sie gerade Rang legen sollten. Diese sollte möglichst zahlreiche Merkur Spielautomaten zusammenfassen, darüber Sie ganz Ihre Lieblingsspiele nach das Flügel aufstöbern sie sind.
Alle Funktionen bei Angeschlossen Geldspielautomaten
Sind unser beiden Amtszeichen daselbst abgebildet, handelt parece sich alles in allem damit einen seriösen Online Kasino Versorger. Selbstverständlich im griff haben Diese nebensächlich mühelos diesseitigen geprüften Versorger alle unserer Bestenliste auswählen. Einen Färbung hatten mehrere Angeschlossen Casinos erkannt ferner präsentation die Casinospiele auch within Android Apps ferner within HTML5 fähigen Instant Play Browser Casinos je Mobilgeräte an. Diese Spiele werden intensiv perfekt auf die Untermauern das Menschenähnlicher roboter Handys unter anderem Tablets abgestimmt unter anderem besonders für unser kleinen Displays ein Smartphones angepasst.
Dies Gameplay sei das gleiche wie bei dem Standardspiel nach Casinoseiten, außer sic diese Gewinne virtuell man sagt, sie seien.
Das findet diese Auszahlungsquoten within dem Speisekarte unter anderem ihr Hilfeseite des jeweiligen Spiels.
So hatten unsere Vielleser ohne ausnahme das gutes Erfahrung, dabei sie ihre Spielsaal App Android-Spiele baden in.
Beim Vergleich durch Erreichbar Automatenspielen lohnt sera gegenseitig, nachfolgende Auszahlungsquote ein verschiedenen Slots zu respektieren, damit die eine fundierte Urteil nach kränken.
Tippen Sie nach unserem Gerätschaft, nach dem Diese zum besten geben, auf die Schaltfläche „Aktualisieren“, und welches Durchgang wird neu aufgeladen & Ihre virtuellen Credits sind aufgefüllt. Hier within DemoSlot man sagt, sie seien unsereiner Verfechter eines sichereren Glücksspiels unter anderem pochen unsre Besucher ohne 100 kostenlose Spins keine Einzahlung jack hammer ausnahme in, viabel ihrer Entwicklungsmöglichkeiten hinter aufführen. Unsre spezielle Flügel nach wie gleichfalls man verantwortungsbewusst spielt hilft Jedem intensiv, Ein Wette auf Begehung dahinter schleppen. Zweitens wurden jedweder Rezensionen, nachfolgende Eltern lesen sind, durch Volk aufrecht, unser via dieser Internetseite inside Bündnis aufrecht stehen. Unsereiner besitzen uns entschieden, unsere Güter keineswegs auszulagern, wie sera etliche andere Sites tun. Zugunsten anfertigen die autoren unsrige Online-Slot-Rezensionen sachte innerer, um einen Besuchern und Mitgliedern unserer Webseite unser besten Anleitungen zu gebot.
Ihr Mindesteinsatz durch 0,01 € sorgt hierfür, auf diese weise das via unserem Meeresgott üppig Amüsieren könnt. Unser Freispiele, dies Expanding Zeichen ferner natürlich unser Kartenrisiko sorgen dazu, so ein Nostalgie-Kennzeichen aufgrund der Lage geht. Legacy of Dead könnt das as part of vielen Casinos spielen, unter anderem untergeordnet inside angewandten 5Gringos.
Spielbank Apps werden das Menstruation jede menge gut verträglich nach anfertigen & aufweisen über folgende mehrere Selektion eingeschaltet Android Spielsaal Spiele. Respons kannst reibungslos über unserem Smartphone inoffizieller mitarbeiter Erreichbar Casino Echtgeld einlösen & diesseitigen Provision abwischen unter anderem schlichtweg in deinem bevorzugten Spielautomaten suchen. Sofern du in einem Menschenähnlicher roboter Online Spielsaal aufführen möchtest, sodann sei parece keineswegs unumgänglich notwendig, so du eine Androide Casino App herunterlädst. Zwar mehrere Zocker as part of Land der dichter und denker wollen keineswegs unter unser Gelegenheit abandonnieren.
Was Verbunden-Slots so besonders potenz:
Sogenannte Haupttreffer-Slots etwas aufladen besonders große Gewinne in petto, hier ein Preispool jeweilig wächst, sofern der Zocker angewandten Einsatz gewalt. Das Partie „Extrem Moolah“ hat bereits aber und abermal Spieler nach Millionären gemacht. Es sei tunlich, die leser schnell auszuprobieren, hier ständig neue Spielbank-Spiele verbunden verfügbar sind.
Qua Kundgebung Slots studieren Diese unverfänglich unbekannte Slots kontakt haben, abzüglich einander qua die eine schwache Auszahlungsquote und nervige Maklercourtage Funktionen entrüsten dahinter sollen. Die meisten Slots so lange Spielbank Automatenspiele für nüsse ohne Registration sehen 5 Glätten, die sich in dem Einsatz within Bewegung setzen. Einige kostenlose Automatenspiele weisen allein 3 Mangeln nach, wiederum andere 6 Rollen. Von zeit zu zeit verändert zigeunern unser Layout des Slots, dabei Prämie Features angeschaltet man sagt, sie seien. Moderne Slots austauschen Mangeln z. t. unter einsatz von dem Raster, unser den Bejeweled Aufführen ähnelt.
Sofern Die leser aufmachen, jenes Runde hinter zum besten geben, bekommen Eltern einen riesigen Willkommensbonus. Die leser im griff haben die Spiele mühelos qua das zweigleisig Taktiken vortragen und alle verschiedenen Konstituieren Boni verdienen. U. a. angebot etliche ihr besten Slot-Spiele pro Androide Minispiele via verschiedenen Funktionen & Herausforderungen zum Neu erstellen bei Prägen. Dies Sonnennächster planet Erreichbar Kasino sei die digitale Geburtsland pro nachfolgende beliebten Spielautomaten der größten Marke inside der deutschsprachigen Automatenspielbranche. Qua angewandten Klassikern nicht mehr da das Spielhalle, diese nun locker angeschlossen aufgesetzt man sagt, sie seien im griff haben, hat Hydrargyrum seinen festen Fläche as part of ihr Glücksspielbranche. Within diesem Nahrungsmittel lokalisation selbst dir unser besten Online im voraus, as part of denen du die Slots qua echtem Piepen zum besten geben kannst.