Description:

我正试图为WooCommerce结帐页面上的账单地址(账单国家)定制"菜单"中的国家顺序.为此,我使用woocommerce_checkout_fields过滤器来调整菜单中国家的顺序.

当我try 进行这些自定义时,问题就出现了:账单地址(账单国家)的"快捷菜单"按预期工作,按所需顺序显示国家.然而,这似乎会停用Select 2功能,该功能通常用于提供增强的DRM体验.

My Approach:

以下是我的代码摘录,展示了在"菜单"中调整账单地址的国家顺序:

add_filter( 'woocommerce_checkout_fields', 'customize_country_dropdown_order' );
function customize_country_dropdown_order( $fields ) {

    $first_countries = array(
        'DE' => 'Germany',
        'AT' => 'Austria',
        'CH' => 'Switzerland',
    );

    $rest_countries = array_diff( WC()->countries->get_allowed_countries(), $first_countries );

    // Combine the first countries and the rest with a separator
    $custom_country_list = array_merge( $first_countries, array( '-' => '------------' ), $rest_countries );

    // Update the order of the billing and shipping country dropdowns
    $fields['billing']['billing_country']['type'] = 'select';
    $fields['billing']['billing_country']['options'] = $custom_country_list;

    $fields['shipping']['shipping_country']['type'] = 'select';
    $fields['shipping']['shipping_country']['options'] = $custom_country_list;

    return $fields;
}

My Question:

自定义国家/地区顺序后,如何重新激活帐单地址下拉菜单(帐单国家/地区)的Select2功能?有什么具体的方法或途径可以让我实现这一点吗?

推荐答案

您只需添加以下代码片段即可返回jQuery Select2 dropdown:

add_action( 'woocommerce_checkout_init', 'enable_back_selectWoo_on_countries_dropdowns' );
function enable_back_selectWoo_on_countries_dropdowns() {
    wc_enqueue_js("$('#billing_country,#shipping_country').selectWoo();");
}

注:这里我们使用selectWoo, the WooCommerce Fork of Select2.

您将获得:

enter image description here

此外,您还可以使用以下命令来简化/压缩代码:

add_filter( 'woocommerce_checkout_fields', 'reorder_checkout_country_dropdowns' );
function reorder_checkout_country_dropdowns( $fields ) {
    // Merge sorted countries, with unsorted ones
    $countries_array = array_merge( 
        array(
            'DE' => 'Germany',
            'AT' => 'Austria',
            'CH' => 'Switzerland',
            '-'  => '------------',
        ),
        WC()->countries->get_allowed_countries(), 
    );

    // Change field type from "country" to "select"
    $fields['billing']['billing_country']['type'] = $fields['shipping']['shipping_country']['type'] = 'select';
    // Set sorted countries options
    $fields['billing']['billing_country']['options'] = $fields['shipping']['shipping_country']['options'] = $countries_array;

    return $fields;
}

Php相关问答推荐

未在moodle上运行的计划任务

如何让PHP变量跨越多个脚本调用?

通过DO LAMP进行身份验证并从邮箱发送邮箱的最简单方式是什么

获取并判断WooCommerce用户订阅结束日期

根据选定的字段值显示或隐藏WooCommerce注册字段

如何保存基于用户 Select 的复选框 Select 模式

在Laravel中从动态嵌套数组中获取值

允许客户定义特定WooCommerce产品的价格

Select 本地提货时隐藏WooCommerce显示的发货成本

显示 woocommerce 中所选变体的属性术语描述

如何用十进制和字母数字减go 和添加 id

使用 Composer 找不到 Google APIClient 类

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

如何在WooCommerce管理产品列表中显示运输类别列

同一页面上多个组件的 Livewire 分页问题

如何使用动态变量定义 bind_result?

使用 PHP 正则表达式从仅包含具有现有顺序的顶级标签的 XML 文档中搜索和创建数组

PHP / DOM : 解析 HTML 以提取基于类的数​​据

自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

Symfony 在将它传递给 Twig 时是否从数据库中获取整个对象?