php Wordpress/Woocommerce管理员订单城市下拉列表基于州

e0bqpujr  于 2023-01-24  发布在  PHP
关注(0)|答案(1)|浏览(213)

我试图在我的Woocommerce商店的管理订单编辑区添加一个城市下拉菜单。我已经尝试过这个代码。

add_filter( 'woocommerce_admin_billing_fields' , 'admin_billing_city_select_field' );
function admin_billing_city_select_field( $fields ) {
    global $pagenow;
    
    // Only for new order creation
    if( $pagenow != 'post-new.php' ) return $fields;

    $fields['city'] = array(
        'label'   => __( 'City', 'woocommerce' ),
        'show'    => false,
        'class'   => 'js_field-city select short',
        'type'    => 'select',
        'options' => array(
            ''              => __( 'Select a city…', 'woocommerce' ),
            'Los Angeles'   => __( 'Los Angeles', 'woocommerce' ),
            'San Antonio'   => __( 'San Antonio', 'woocommerce' ),
        ),
    );

    return $fields;
}

它是这样工作的

但是我想添加一些条件如果州匹配,那么它将显示一个特定的城市列表。并且它应该在选择州后显示城市列表。我该怎么做呢?

2izufjch

2izufjch1#

首先,为了获得更好的用户体验,我建议将“州”字段移到“城市”和“邮政编码”字段之前。
你也可能要考虑你想要加载的数据量。你会建议每一个美国城镇或只有几个?这将取决于数据加载的方式。
但让我们假设你将创建自己的[短]列表。

(所有这些代码都经过WP 6.1.1和WC 7.3.0测试)

1.首先,你需要存储城市列表,包括州前缀,在一个WordPress选项(例如:'_wc_cities_by_states'),如下所示:

$state_city_options = array(
        'CA-los-angeles' => __( 'Los Angeles', 'woocommerce' ),
        'CA-san-antonio' => __( 'San Antonio', 'woocommerce' ),
        'WA-seattle'     => __( 'Seattle', 'woocommerce' ),
        'WA-olympia'     => __( 'Olympia', 'woocommerce' ),
    ); 

set_option('_wc_cities_by_states', $state_city_options);

1.然后,获取此自定义选项来构建您的城市选择选项列表:

add_filter( 'woocommerce_admin_billing_fields' , 'admin_billing_city_select_field' );
function admin_billing_city_select_field( $fields ) {
    global $pagenow;
    
    // Get the array of cities by state from WP option
    $cities_by_states = get_option('_wc_cities_by_states', )

    // Only for new order creation
    if( $pagenow != 'post-new.php' || !$cities_by_states ) return $fields;

    // Add it to WC city fields
    $fields['city'] = array(
        'label'   => __( 'City', 'woocommerce' ),
        'show'    => false,
        'class'   => 'js_field-city select short',
        'type'    => 'select',
        'options' => $cities_by_states;
    );

    return $fields;
}

1.最后,这是一个Javascript(jQuery),它将完成这个任务(注意:Woocommerce使用select 2库):

jQuery(document).ready(function ($) {
  $(".js_field-city option").hide();

  //Required to biding after billing-edit click
  $(".edit_address").one("click", function () {
    filterCities();
  });

  //Required to avoid unbiding after Country change
  $(".js_field-country").on("select2:select", function (evt) {
    filterCities();
  });

  filterCities = () => {
    $(".js_field-state").on("select2:select", function (evt) {
      var state = $(this).select2("data")[0].id;
      $(".js_field-city option").hide();
      $(".js_field-city option[value^='" + state + "']").show();
      $(".js_field-city").val(null);
    });
  };
});

那个代码对我有效,我希望它对你也有效。
谢谢你告诉我!

相关问题