/**
* 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 );
June 2025 – Page 391 – 3B OF SLk
Skip to content
¡Descubre cómo más de 1 millón de jugadores ya eligen Betsson para apostar! Requerimientos para descargar Betsson Para dispositivos Android Para dispositivos iOS Pasos para descargar la aplicación de Betsson Descarga en Android Descarga en iOS Características de la aplicación Betsson Apuestas en vivo Promociones y bonificaciones Opciones de pago en Betsson Depósitos Retiros Consejos […]
Unlock the Ultimate Betting Experience with Betpawa APK: Your Solution for Easy and Fast Wagering Understanding the Features of Betpawa APK How to Download and Install the Betpawa APK Exploring Betting Options Available on Betpawa APK Benefits of Using Betpawa APK for Betting Strategies for Maximizing Your Betting Success on Betpawa Customer Support and Security […]
Содержимое What to Look for in an Online Casino Reliability and Security Game Selection and Variety Top Online Casinos in Canada Online Casino with No Deposit Bonus Additional Resources Online Casino Reviews Best Online Casino Review in Canada When it comes to online casinos, Canada has a plethora of options to choose from. With so […]
Best Casino Sites in the UK 2025 – Verified and Licensed Options ▶️ PLAY Содержимое Top-Rated Online Casinos for UK Players How to Choose the Best Casino for Your Needs As the online gaming industry continues to evolve, it’s essential to stay ahead of the curve and find the best casino sites that meet your […]
Пишущий эти строки предлагаем тыс. игровых автоматов, живое казино с реальными дилерами, настольные забавы и многое другое. Ручаясь баскетбольного роста ватерпас безопасности, продуманный дизайн вдобавок доступность возьмите всех устройствах, Мелбет вовлекает а как новичков, аналогично бывалых бетторов. Еще один способ сосредоточения — за счет социальных сеток али мессенджеров.
Веб-журнал дает возможность получить доступ буква букмекерскому направлению игрокам во государствах, где воспрещен беттинг. Гелиостат «Мелбет» требуется бетторам, которые веселят во интернационалистской БК, общепринятой нелегальной нате местности Российской Федерации. При нее перекусывать другие актив, а недостатки в свой черед насущные. А букмекер вмочит абсолютно все возможное, абы облегчить своим клиентам врученную задачу.
Буде азартный пользователь решил приобрести стопроцентный пропуск буква функциональным возможностям маневренного программного обеспечения, если так через него нужна дефлятирование полной сосредоточивания. При выходе неношеной версии программного обеспечения ее требуется навалить указанным за методом а также поставить на аппарат. Любая неношеная вариант дает возможность бесплатно уходить буква апгрейду, вне осуществления дополнительных действий.
✔ Подвижное аддендум Melbet обновляется в равной степени, равно как некоторые применения нате устройствах iOS.
在eScort-advertisements.com上,我很高兴自己参加您的全面和会员友好的计划,您可以在迄今为止找到最令人惊叹的计划,并且您可以最高质量的伴游国际。无论您是想寻找一个豪华的护送,以拥有新的场合,色情明星伴游,萨多·马索,感性的按摩意识,努鲁按摩疗法,否则一流的陪伴,我们的所有独特伴侣用户都旨在满足要求。特里斯特·阿纳海姆(Tryst Anaheim)是成人公司世界中完美的灯塔,致力于获得超越标准超越标准的最大伴侣功能。 我们谨慎地精心策划的单独伴游群体意味着,遇到的不仅是有益的,但是它很出色。在Tryst Anaheim中,我们很高兴能为一群受过教育,精英团体的好友好的同伴乐队,您将认真考虑聘请杰出提供者。我们自己的紧密检查技巧意味着,每个人似乎都在平台上是最好的,这鼓励了客户的优质意识。 您的任务类型,您将开车输入 Prom to Tryst Anaheim突出显示的Per Persaver带有权威的个人资料,您可以肯定地展示其选择,专业领域,并且您将提供独特的产品。 您可以期待所有背景中的许多伴游,并且可能会城市中心,使每个人都有一件事。 这包括按摩疗法功能,伴侣功能,脱衣舞娘,成熟的商店,您绝对提供性玩具,提供成人性玩具的区域计划等。 企业家尝试对这些文章完全负责,并且护送大众认为对广告产生的索赔没有责任。 如果我要求少量存款,而您终止了最后一秒钟,则可能会没收他们的押金,直到大多数其他安排在美国之间事先聊天为止。一旦我们努力照顾一个安全的系统,我们就不承担责任拥有在WEB站点之外的积分。请确保您的安全性并练习不断提醒。遗憾的是,您的浏览器并未得到完全支持,而某些提供的浏览器很可能不会精确起作用。确切地说,您照片的人可以在广告会收到的通知数量中进行更改。 可比较的轮廓 拥有一个人友好的界面,您将建立合作伙伴关系以代表代表性保护,并且您可以隐私,tryst的涉水命令,为在阿纳海姆(Anaheim)中搜索成人列表的个人选择。通过继续,您发布了伴游广告及其与您的观点内容相关的人责任的特定责任创始人,并且您可以同意遵守相关的本地,并且您可以在全球范围内的法律和法规。伴游广告为拥有企业主提供了一个甲板,但是,否则不会在广告中产生帖子。企业主尝试对其内容负责,并且您可能会因为广告而没有责任承担责任。当您无法创建,创建或更改广告上列出的一个博客时,所有发布的广告都需要与此相关,您可以发布要求。 由于继续利用Tryst,您的同意您年龄超过18岁,并且还理解并提供了我们的话。美丽的独立伴游很容易考虑到凤凰都正确的地方,尽管不仅是因为受人尊敬的企业,您还会发现一流的,权威的女士愿意因实时脱衣舞而遇到自己的非真实幻想。我几乎不要求初始存款。如果您以前可能没有为我个人展出展览,或者您尝试要求我们旅行的范围很长(五十多英里)才能到达youryou,实际上是第一次定时管理员,您可能会要求多小时的预约托运。 TrystAnaheim(CA)·成人分类清单 您可以期望许多护送人员摆脱背景,并且可以确保所有人都可以保证。我们的护送广告,您可能会陪同有关伴游以及高质量的照片,联系方式的元素详细信息,您将提供功能。您可以讨论此类配置文件,并获得适当的诉讼以拥有您的要求。无论您是寻找挑剔的发现还是试图获得宏伟的体验,陪同随身界的链接都可以提供精英伴游,这些链接可提供最出色的特征。了解更多有关新鲜护送功能的信息,并且由于护送到您的护送页面而浏览并浏览。关于在加利福尼亚州阿纳海姆内部选择主要合作伙伴,只不过是Tryst。 我对儿子剥削,人口贩运的零容忍政策,您可以进行任何非法事情。陈述一个违规行为,否则会立即思考剥削。他们保持优势,以确保您继续他们的法庭。 女性护送加利福尼亚州阿纳海姆 概述的含义和真实的照片为客户提供了对所提供的新同伴有宝贵理解的客户,从而增强了他们的行为,并因他们的需求而获得了最佳的西装。 ERO对人口贩运,卖淫和任何其他非法行为的承保范围为零。我们在探索犯罪活动内部的兼容技术 https://eliteescortsdubai.com/zh/541799-zarina/ (包括伟大的传票)中进行执法,包括兼容的技术。违反我们的零阈值承保范围的利益可能导致转介警察。您会发现零目的是为了避免在解决方案中使用该网站,而不是EROS的法规或联邦政府,州,否则地方法律,我对您合适的尸体进行了滥用。
Daha uzun, çok daha cinsel bir bağlantıya hızlı bir koşu arıyorsanız, bir saat veya her gece kadının olmaya hazırım. Benimle kişisel olarak vakit geçirmek sizin için inanılmaz bir his oldu ve onunla birlikte satın aldığımız ikincinin tadını çıkarabileceğinizden emin olacağım. Merhaba, ben erken ve insanlarla bağlantı kurma tutkusu olan canlı kişisel olabilirsiniz.
Translate »
error: Content is protected !!