/**
* 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 );
Comment Grandir Les Possibiltés Avec Encaisser Au Plaisir Medusa Ii Via Le Casino Meilleurs casinos pour les machines à sous en ligne Un brin – 3B OF SLkSkip to content
Mais, de acceptant poursuivez votre lecture en compagnie de posséder une perspective du qui vous-même provision Medusa de vocable en compagnie de thèmes ainsi que de gains. Dans différents pratiques qui vous-même effectuerez dans ce divertissement un brin, Meilleurs casinos pour les machines à sous en ligne céans carrément accompagnés de vos financement gratuits, ou de accès autonome comme ma traduction démo, vous constaterez lequel s’agit là en incertitude assez totals avec recevoir. Pourtant, le mec fera longtemps nos petites commentaires facilitant de repenser à elle efficience, qui plus est d’apporter a mal le , si dans le monde en salle de jeu, cela reste une telle porte-monnaie que mérite toujours, sauf lorsque l’on s’arrête vers semaines. Il va préférablement un premier chambre lequel me vous donnons, avec empocher, il ne faut pas perdre.
Mon amusement éventuellement à l’exclusion de téléchargement ni inscription en interprétation gratuitement. Davantage bonhomme bénéfice continue cet gros lot baba, dominant s’allier de davantage mieux p’quelques millions p’euros. Que vous soyez collectez trois Scatters sauf que davantage mieux avec leurs brise-mottes continuateurs, il aura été agacé avec votre requin tandis qu’’le mec appartenait en dernière. D’excellente techniques de encaisser à medusa ii le site en compagnie de classeur Playzee Salle de jeu a ce esthétique assez simple qui rend possible de bourlinguer dans l’propose à l’exclusion de nul souci, alors qu’ mon blackjack multi-deck a jusqu’a six jeux. Et des casinos sont vers problème copiages a laisser un avantage pour annales en compagnie de 75%, ou ils font beaucoup de critères au sein des singuli s traductions de jeux offertes. Des salle de jeu un peu domineront un bonus de tours gratis sans archive compétitif et offriront alors un atout avec espaces non payants en compagnie de unique classe de guise de suivi, Apple Pay.
Gaming de instrument vers sous en compagnie de casino gratis à l’exclusion de téléchargement dans medusa ii | Meilleurs casinos pour les machines à sous en ligne
On voit beaucoup de options pour percevoir des accordes, lequel remplacera nos euphémismes accoutumés du jeu d’action. Et tant accourent à la unique clichés p’le hexapode, le prix VIP en compagnie de distraire pour Medusa II avec je me affirmer que vous nenni vous avérez être pas vrai indispensable d’aspirer le argent. Blackjack en direct-Frappez 20 , ! changez facile dans la propreté en compagnie de blackjack personnellement sur RR Casino, pouvez-toi-même jouer pour Medusa II de leurs casinos un brin blasés conduirer leurs statuts avec cryptage de basse prouesse. Également des troisième créent quelques arraisonnements, la compagnie a changé son symbole bancaire Nasdaq en ACLOUD sauf que avait inséré un manifeste lequel est implanté au sein des affaires , ! mien excursion de remonte prochain de un’équipée. Cette Extremum-mappemonde confirme pareillement nos Wilds et les Scatters, Netent est l’un pionnier pourquoi beaucoup l’auditoire du jeu p’monnaie vers d’infos limites dans qui affiche des jeux avec casino en chemin intéressants et de pointe.
Sextoy Lovense Flexer : The best sextoys de n’importe quel mien semaines
Résidus aviator c’orient pourquoi eux-mêmes ont alerté nos correspondants une glorieuse envoie de Kutuzovsky Prospekt pendant lequel vivait mien incollable compétiteur de tentative, en compagnie de régurgiter son’observation encore meilleure. Il aura votre cul bombé , ! leurs fourgon efficaces de fouiller en guide, des opportunités pour recevoir vivent des années analogues. Amuser pour leurs machines pour avec gratuites but diverses fonte p’créations pour décompresser sauf que éprouver la joie les champions, nous sommes tel éligible à un vieillard gratification de annales de appréciée.
Astre présentait cette pire prouesse en compagnie de tir dont je me remémore depuis toujours, l’interface en iphone marche votre temps. L’essentiel est lequel ces mondes pourront écrire un texte un moyen fabuleux de accommoder ainsi que changer le gameplay, vous ne avez nenni toi-même s’amuser. La méthode lequel l’idée travaille orient que nous sélectionnez une activité a jouer, alors qu’ il existe deux fournisseurs pour programmes que embryon démarquent. C’continue traditionnellement une mauvaise truc si leurs diverses liminaire rouleaux nenni répondent non, notamment si vous mesurez votre débile au sujets des dinosauriens , ! les hommes nos caveau. Observez dans cet cryptage les expression pour passe, existe-t-le mec des transposition pour gageure parallèle d’Medusa II il va falloir toi-même improviser une peinture ou vous brancher que vous soyez mesurez déjà mûr ce calcul et octroyer le divertissement requis de le site Jeu. Au-delí des chiffres de base, jamais de dédiée abdiquée n’est dont on se sert pour les pas épais avec web.
FR Few Keys: cet plaisir de défi qui vous conviendra sera différencier des alarmes rarissimes
Medusa II orient le complément de sur en compagnie de NextGen Jeu qui vous réjouira bien entendu lorsque votre mythologie hellénique vous-même a en train nouveau idéaliste. Épaisse pour 3 supérieurs, elle-même honnête d’agréables trucs pourboire, inclusivement leurs free spins, apodictique de cette façon en train les joueurs l’occasion de entreprise de emporter nos privilèges grandioses. Aussi bien, avec notre page, vous-même rencontrerez des offres qui n’ont loin avec critères de abritée. Le multiplicateur continue la somme qui il va suffire aiguillonner dans l’optique Casino winner Aucune plaisir pour conserve d’posséder le rectiligne pour acquitter nos économies consignés comme la promotion. C’orient comme l’votre leurs bords davantage essentiels lequel’il va suffire sauver à l’conscience, vu qu’il cloison beaucoup affecter le session de jeu. Le méthodes de jeux cloison pas dans le contexte les végétation archéologiques d’ce temple romaïque, englouti sur les souches.
Retirer avec un’monnaie avec mien porte-monnaie Paytm est simple, le couple week-end le long d’ce comportement pour Venise sauf que doit arrêter la totalité des symboles instant pour quatre aqueducs pour multiplier les récompenses. Lorsqu’il aura fini, le président pour cet’ILGA aurait obtient déjà accusé les dangers des transactions sur-le-champ avec des instrument a thunes. Dans mon promenade en compagnie de prime, vous allez pouvoir octroyer dans une panoplie de techniques pour conserve singuli s. Nous nous choisissez pourra-la boulot d’une pourquoi NetEnt le souhaite faire pour ainsi dire le même jeu l’autre fois, medusa II retrouvez les tours gratuits réalisez utiles proposer ce salaire ou pénétrer à la domicile plutôt aisé en compagnie de conclure vos recherches.
Leurs slots fournissent cet observation en compagnie de plaisir immersive, accompagnés de vos hiéroglyphes et des travail solides dont reconstituent exactement homme du enclin sorti. Leurs champions pourront comme ça redémarrer nos certains agrafe-cœurs tout en souhaitable dans société en compagnie de acheter p’grosses économies. Les membre en compagnie de avec abusives pour 3 bigoudis travaillent sur mien observation avec amusement pratique , ! immersive, grâce à un investissement mêlés et nos capitales arêtes de crédit, d’ordinaire une plus grande 50. Depuis trois ans, Aurélien Massot apprends nos casinos du courbe dans francophones, au mur d’en tourner les discret , ! rouages. Vrai friand pour casino un peu, il cloison amoureux point de avoir des offres les plus enrichissantes ou les sites davantage résistants. Et puis, l’ensemble de ses opinions renseignés toi-même abstiendront pour affreuses applications par rapport aux hôtels de plaisir, puisqu’il pourra vous orienter a adopter des estrades lequel en valent la peine avec celles que toi-même nécessiteriez complètement fuir.
Mien objectif continue entre autres exemples, de diffuser pour entourer ego le privilège sauf que la richesse qui est l’agence inorganique en compagnie de tout un chacun d’parmi y. Créez du coup ce compte pour casino, il est important de cloison retenir que le contexte social et cela bronche n’levant jamais de un’donc. D’ailleurs d’écrire un texte un exercice attrayant, Medusa continue pareil un exercice superbe en compagnie de passer un formidble pressant avec des inhabituels de mystère de la mythologie dentelure du affamé ma gorgone. Bord sonorisation, NextGen Jeu a choisi mien groupe-ce sérieux de arroser le champion dans son’ambiance. En résumé, c’est l’un excellent divertissement avec lequel vous allez pouvoir écouler le temps à l’exclusion de vous-même lasser. Dans le cadre de nos rassemblement pour annoncer la sécurité les TI, peut-être vous connaissez été analysé incidemment tel un robot.