/** * 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 ); 1xBet-i endirin Android və iOS-u əldə edin və imzalayın Rəsmi internet saytından 1xBet APK-nı işə salın – 3B OF SLk

1xBet-i endirin Android və iOS-u əldə edin və imzalayın Rəsmi internet saytından 1xBet APK-nı işə salın

Güzgü veb saytın tamamilə bütün variantlarını tərk edir, bu da adi qaydada batsat etməyə imkan verir. 1xbet əlavəsini yükləyin iOS alın və imzalayın Allah daha çox rəsmi jurnal sifariş etdi, bu da aşınmanı əlifba sırası ilə edir. Əlavəni quraşdırdıqdan sonra istifadəçilər yaxın cihazda 1xbet-ə giriş əldə edir, əlavə olaraq əlverişli vaxtda rəqs etmək üçün çoxalırlar.

Dünyaca məşhur bukmeyker administrasiyası 1xBet RU ən geniş sərhədi, əlverişli əmsalları və səxavətli promosyonları olan ən yaxşı interaktiv operatordur. Şirkətin müştəriləri üçün mühüm üstünlük həm də mobil mərc formasında qeyri-adi proqramların yayılmasıdır. Yardım xidməti həmçinin güzgüdə demokratik bonuslar, mərclər və aktlar haqqında məlumat verir. İstifadəçilər cari xidmətlər haqqında öyrənə və qarşılıqlı faydalı promosyonlardan yararlana bilərlər. Məsləhətçilər gecə-gündüz işləyirlər, çünki yardım işi həmişə mövcuddur. Oxatan həmçinin daimi müştərilər üçün loyallıq proqramlarına və bonuslara çıxış təmin edir.

Beləliklə, 1xbet hava xidməti istifadəçilərə güzgülərdən istifadə etməyə kömək edir və oyun prosesini rahat edir. 1xbet güzgüsü məhdud girişi olan bölgələrdə məktubun açılış mərhələsinə daxil olmasını təmin edir. Bu, əsas jurnal əlçatmaz olsa da, müxtəlif oyunlar oynamaq və mərc etmək şansı verir.

1xbet mobi – Bahis yükləmə: Mobil əlavə

1xbet mobi

Dünyaca məşhur onlayn operator One stranger Penalty müxtəlif mülkiyyət ölkələrindən olan müştərilərin böyük auditoriyasını ehtiva edir. Nömrənin işlədiyi ofisin əsas veb resursu rus dilində alınsa da, ona məktub daxil olmaq bəzən qısa ola bilər. Belə vəziyyətlərdə müştərilərin qəzəbi həmişə başqa bir həll yolu tapır, çünki bukmeker kontor köçürmə imkanı verir ki, bir güzgü veb jurnalı əldə edin və imzalayın. Google Play mərc tətbiqinə kömək etmədiyinə görə, əlavəni əl ilə başlamaq lazımdır. qarışqa. avtomatik.

1xbet Rəsmi Vebloqu Oyunlara Daimi Girişi necə təmin edir?

Güzgüdən istifadə oyunçulara interfeysi tez mənimsəməyə və həmçinin aparıcı funksiyalara qalxmağa imkan verir. Başlayanlar tez tələb olunan bölmələri tapırlar və həmçinin mərc oynamağa başlayırlar. Platforma, təşəbbüskarlar üçün əlverişli olduğu üçün intuitiv şəkildə izah edilə bilən bir interfeys təqdim edir. Oyun kartları, elektron pul kisələri və kriptovalyutalar da daxil olmaqla, doldurma üçün asanlıqla əldə edilə bilən müxtəlif alqoritmləri güzgüdən götürün. Platforma sürətli və zərərsiz ödənişlərə kömək edir ki, bu da məhv edilməsini istifadəçilər üçün rahat edir. Vəsaitlər dərhal icra məktubu başlamaq üçün imkan verir, ildırım sürətli mühasibat hesabatında qəbul edilir.

VPN vasitəsilə oyunçular çoxalırlar ki, aparıcı vebsayt 1xbet-ə giriş əldə edirlər ki, bu da açılış mərhələsinin tamamilə bütün funksiyalarından istifadə etmək imkanı verir. VPN oyunçulara blokdan keçməyə və həmçinin 1xbet-ə giriş əldə etməyə kömək edən aulosdur. VPN-dən istifadə salamı gizlətməyə və alternativ ölkədəki serverə qoşulmağa imkan verir. Bu, jurnalın qısa olduğu yerlərdə platformanı demokratik edir.

1xbet mobi

İstifadəçilər adi qaydada mühasibat hesabatını doldura və uduşlar verə bilərlər. Qeyri-bayram heliostat 1xbet bütün oyunlara və həmçinin platformanın slotlarına mütləq giriş məktubu gətirir. İstifadəçilər populyar slotlar edə bilər, bang bahisləri 1xbet mobi idmanla məşğul ola bilər və həmçinin əməliyyatlarda bir dairədə ola bilər. Bu, heliostatı tamamilə bütün oyunçular üçün 1xbet rəsmi veb saytının təsirli əvəzedicisi edir. 1xbet işləyən güzgü əsas jurnal bloklansa da, istifadəçilərə oyunu davam etdirməyə imkan verir.

1xbet Hava Dəstəyi Xidməti istifadəçilərə işləyən güzgülərlə necə kömək edir?

Əlavə zərərsizlik şəklində, yalnız 1xbet rəsmi güzgülərindən istifadə etmək lazımdır. Bu həyat güzgülərinə bağlantılar Allah əmr etdi ki, pis dəstək şöbələri var və ya 1xbet rəsmi internet səhifələrini alıb imzalayın. Bu, zərərsizliyə zəmanət verir, çünki etibarsız saytlar saxta güzgülər ola bilər. Bundan belə nəticə çıxır ki, qeyri-bayramlı oxatan 1xbet istifadəçilərə sadiqlik proqramlarında iştirak etməyə və əlavə bonuslar verməyə imkan verir. Bundan əlavə, güzgüdən istifadə adjornamento tamamilə bütün parametrləri və istifadəçi məlumatlarını saxlayır.

Bəzən oyunçularımız regional məhdudiyyətlərə görə 1xbet rəsmi saytına girişi bloklamaqla tez-tez mübahisə edirlər. Bunun aradan qaldırılması üçün 1xBet 1xBet güzgüsü (1xbet archer) təqdim edir – bu gün əsas saytı kopyalayan alternativ hiperlinklər işləyir. Bu 1xbet güzgüləri istifadəçilərə öz hesablarına, mərclərinə və bonuslarına girişi saxlamaq imkanı verir.

1xbet mobi

Heliostat 1xbet oyunçulara turnirlərə nəzarət etmək və həmçinin canlı sistemdə mərc oynamaq imkanı verir. Bu, allerqonun oyundakı hekayələrə reaksiya göstərməsinə imkan verir və həmçinin uğurlu mərc şanslarını artırır. Oyunçular köçürmə olmadan çoxalır və canlı cavablar alırlar. Güzgü sahibsiz məhrumiyyətlərindəki sadiqlik proqramları rəsmi internet saytından fərqlənir. Oyunçular xal toplaya və onları mükafat mərcləri, pulsuz fırlanmalar və ya pul üçün geri ala bilərlər. Bu, oyunu daha sərfəli edir və eyni zamanda qalib gəlmə şansını artırır.

Məsləhətçilər rahat yola çıxmaq üçün qənaət edəcək və həmçinin hərəkətlərin zərərsizliyinə zəmanət verəcəklər. Droid üçün 1xbet tətbiqi platformada hətta güzgüyə yaxınlaşmadan rəqs etmək imkanı verir. Əlavəni quraşdırdıqdan sonra istifadəçilər əsas veb saytının bütün seçimlərinə tamamilə layiqdirlər. Tətbiq həm mərclərə, həm də oyuna tez bir giriş verir, çünki bütün növlərdə rahat həlli gəlir.

Basketbol onlayn operatoru blogunun sahibi cari vaxtı nəzərə alır, buna görə də istifadəçilərinə kontekstdən çıxarılan bir masa üstü abunəçini təklif edir. Kompüterlər və noutbuklar üçün borc alınmamış proqram Windows OS üçün nəzərdə tutulmuşdur. Şəxsi manevr edə bilən müştərinin köməyi ilə veb-sörfçü daim bukmeker kontoru ilə hesablaşa, profilini və oyun nömrəsini asanlıqla idarə edə biləcək. Ofisin hər bir ac pərəstişkarı 1xBet heliostatını iOS cihazlarını götürə, Android ƏS-dən və hətta masaüstü müştəri formatında əldə edə və cihazlar üçün imzalaya bilər. Əvvəllər heç vaxt interaktiv mərc oyunu görməmiş yeni oyunçu formasız görünə bilər? Bu, iki güzgülü saytdır və 1xBet güzgüləri necə işləyir.

İşləyən güzgüdən sizə lazım olan 1xbet tətbiqini yükləyin ki, bu da istifadəçilər üçün əlverişlidir. Platforma Android və iOS-da yükləmə növləri üzrə hiperlinklər təqdim edir ki, oyunçular əlavədən cihaza istifadə edə bilsinlər. Köhnə güzgülər mövcud olmaya bilər və bu, platformaya girişə təsir edir. Aktiv keçidlərdən istifadə edərək oyunçular 1xbet veb saytına təhlükəsiz bağlantı əldə edirlər.

1xbet mobi

Bu cür fiksasiya rolları mərc üçün mümkün qədər tez ayrılmaq istəyən daha yaxşılara uyğun olacaq. İstifadə olunan mətndən istifadə edərkən, Sport.ua saytının hiperlinkini əldə edin və imzalayın. Redaktorların yazılı icazəsi olmadan veb-saytın foto materiallarından istifadə etmək qadağandır. Layihənin korreksiyası həm yaradıcıların fikri ilə eyni olmaya bilər, həm də istifadə olunan bard materiallarına görə məsuliyyət daşımır. Məhz bunun sayəsində hər bir autsayder İnternetə çıxışı olan istənilən ərazidə mərc etməyə ümid edir. IPhone növlərindəki tətbiqlərdən fərqli olaraq, onu əl ilə qurmaq lazımdır.

Translate »
error: Content is protected !!
Open chat