Php 在电子商务签出中基于所选城市显示子区域下拉列表

Php 在电子商务签出中基于所选城市显示子区域下拉列表,php,jquery,ajax,wordpress,woocommerce,Php,Jquery,Ajax,Wordpress,Woocommerce,我正在创建一个WooCommerce插件,我想根据结帐页面中选择的客户城市动态显示子区域 以下是我的代码尝试: add_filter( 'woocommerce_checkout_fields', 'dvs_city_list' ); function dvs_city_list( $fields ) { $fields["billing"]["billing_city"]["type"] = 'select'; $f

我正在创建一个WooCommerce插件,我想根据结帐页面中选择的客户城市动态显示子区域

以下是我的代码尝试:

add_filter( 'woocommerce_checkout_fields', 'dvs_city_list' );
function dvs_city_list( $fields ) { 
    $fields["billing"]["billing_city"]["type"] = 'select';
    $fields["billing"]["billing_city"]["input_class"] = array(
    'state_select' => 'state_select'
    );  
    $fields["billing"]["billing_city"]["options"] = array(
        'Lahore' => 'Lahore',
        'Karachi' => 'Karachi'
    ),
    return $fields;
}


add_filter( 'woocommerce_checkout_fields', 'dvs_area_list' );
function dvs_area_list( $fields ) { 
    $fields['billing']['billing_area']['label'] = 'Area';
    $fields['billing']['billing_area']['required'] = 'True';
    $fields["billing"]["billing_area"]["type"] = 'select';
    $fields["billing"]["billing_area"]["class"][0] = 'form-row-last';
    $fields['billing']['billing_area']['priority'] = 50;
    $fields["billing"]["billing_area"]["input_class"] = array(
    'state_select' => 'state_select'
    );
    
    $city = $_REQUEST['billing_city'];
    
    if ($city == 'Lahore') {    
    $fields["billing"]["billing_area"]["options"] = array(
        'Naval Town' => 'Naval Town',
        'Bahria Town' => 'Bahria Town',
        'Faisal Town' => 'Faisal Town'
        );
    }
    else ($city == 'Karachi') {
    $fields["billing"]["billing_area"]["options"] = array(
        'Walton Road' => 'Walton Road',
        'Zest Road' => 'Zest Road'
        );
     }
     return $fields;
}
这是截图

但我得到了这个错误

注意:
未定义索引:第35行的wp content/plugins/custom plugin/index.php中的billing_city


如何修复此错误?我做错了什么?

要从另一个选择字段同步自定义签出选择字段,需要使用jQuery

您还可以合并这两个函数,因为它们使用相同的钩子

在下面的第一个功能中,我们保留了您的城市/地区设置,可以在任何地方调用。最后一个功能是根据所选城市在“计费区域”下拉列表中启用动态选项更改:

function cities_areas_settings() {
    $text_domain = 'woocommerce';

    return array(
        __('Lahore', $text_domain) => array(
            __('Naval Town', $text_domain),
            __('Bahria Town', $text_domain),
            __('Faisal Town', $text_domain),
        ),
        __('Karachi', $text_domain) => array(
            __('Walton Road', $text_domain),
            __('Zest Road', $text_domain),
        )
    );
}

add_filter( 'woocommerce_checkout_fields', 'custom_checkout_fields' );
function custom_checkout_fields( $fields ) {
    // Initializing
    $text_domain   = 'woocommerce';
    $option_cities = array();
    $lahore_areas  = array( '' => __('Choose your area', $text_domain) );

    // Load settings and prepare options arrays
    foreach( cities_areas_settings() as $city => $areas ) {
        $option_cities[$city] = $city;
        if( $city === 'Lahore' ) {
            foreach( $areas as $area ) {
                $lahore_areas[$area] = $area;
            }
        }
    }

    // 1. Billing City field
    $fields['billing']['billing_city']['type']        = 'select';
    $fields['billing']['billing_city']['class']       = array('form-row-first');
    $fields['billing']['billing_city']['input_class'] = array('state_select');
    $fields['billing']['billing_city']['options']     = $option_cities;

    // 2. Billing Area Field
    $fields['billing']['billing_area'] = array(
        'type'        => 'select',
        'label'       => __('Area', $text_domain),
        'class'       => array('form-row-last'),
        'input_class' => array('state_select'),
        'options'     => $lahore_areas,
        'required'    => true,
        'default'     => '',
        'priority'    => 50,
    );

    return $fields;
}

add_action('wp_footer', 'custom_checkout_js_script');
function custom_checkout_js_script() {
    if( is_checkout() && ! is_wc_endpoint_url() ) :
    // Initializing
    $text_domain   = 'woocommerce';
    $karachi_areas = array( '' => __('Choose your area', $text_domain) );

    $settings = cities_areas_settings(); // Load settings

    // Prepare 'Karachi' options dropdown
    foreach( cities_areas_settings()['Karachi'] as $area ) {
        $karachi_areas[$area] = $area;
    }

    ?>
    <script language="javascript">
    jQuery( function($){
        var a = 'select[name="billing_city"]',
            b = 'select[name="billing_area"]',
            o = <?php echo json_encode($karachi_areas); ?>,
            s = $(b).html();

        // Utility function to fill dynamically the select field options
        function dynamicSelectOptions( opt ){
            var options = '';
            $.each( opt, function( key, value ){
                options += '<option value="'+key+'">'+value+'</option>';
            });
            $(b).html(options);
        }

        // On Start (once DOM is loaded)
        if ( $(a).val() === 'Karachi' ) {
            dynamicSelectOptions( o );
        }

        console.log($(a).val());

        // On billing city change live event
        $('form.woocommerce-checkout').on('change', a, function() {
            console.log($(this).val());
            if ( $(this).val() === 'Karachi' ) {
                dynamicSelectOptions( o );
            } else {
                $(b).html(s);
            }
        });
    });
    </script>
    <?php
    endif;
}
功能城市\区域\设置(){
$text_domain='woocommerce';
返回数组(
__('Lahore',$text_domain)=>数组(
__(‘海军城’,$text_域),
__('Bahria Town',$text_域),
__(‘费萨尔镇’,$text_域),
),
__('Karachi',$text_domain)=>数组(
__(‘沃尔顿路’,$text_域),
__('Zest Road',$text_域),
)
);
}
添加_过滤器('woocommerce_checkout_fields'、'custom_checkout_fields');
函数自定义\u签出\u字段($fields){
//初始化
$text_domain='woocommerce';
$option_cities=array();
$lahore_areas=array('''=>uu('Choose your area',$text_domain');
//加载设置并准备选项数组
foreach(城市\区域\设置()为$city=>$areas){
$option_cities[$city]=$city;
如果($city===‘拉合尔’){
foreach($areas$area){
$lahore_地区[$area]=$area;
}
}
}
//1.计费城市字段
$fields['billing']['billing_city']['type']='select';
$fields['billing']['billing_city']['class']=array('form-row-first');
$fields['billing']['billing_city']['input_class']=array('state_select');
$fields['billing']['billing_city']['options']=$option_cities;
//2.计费区域字段
$fields['billing']['billing_area']=array(
'类型'=>'选择',
'label'=>\('Area',$text\u domain),
'class'=>数组('form-row-last'),
“输入类”=>数组(“状态选择”),
“选项”=>$lahore_地区,
“必需”=>true,
'默认'=>'',
“优先级”=>50,
);
返回$fields;
}
添加_操作(“wp_页脚”、“自定义_签出_js_脚本”);
函数自定义_签出_js_脚本(){
如果(is_checkout()&&!is_wc_endpoint_url()):
//初始化
$text_domain='woocommerce';
$karachi_areas=array(''=>uuu('Choose your area',$text_domain));
$settings=cities\u area\u settings();//加载设置
//准备“卡拉奇”选项下拉列表
foreach(城市\区域\设置()['Karachi']作为$area){
$karachi_面积[$area]=$area;
}
?>
jQuery(函数($){
var a='选择[name=“billing_city”]',
b='选择[name=“billing_area”],
o=,
s=$(b.html();
//用于动态填充选择字段选项的实用程序功能
功能动态选择选项(opt){
var选项=“”;
$。每个(选项、功能(键、值){
选项+=''+值+'';
});
$(b).html(可选);
}
//启动时(加载DOM后)
如果($(a).val()=='Karachi'){
动态选择选项(o);
}
console.log($(a.val());
//关于计费城市变更直播事件
$('form.woocommerce checkout')。在('change',a,function()上{
log($(this.val());
如果($(this.val()=='Karachi'){
动态选择选项(o);
}否则{
$(b).html(s);
}
});
});

先生,请您核对一下这个问题:您好。