在Woocommerce中添加自定义结帐多选字段和更新订单元

时间:2018-02-25 08:11:27

标签: php jquery wordpress woocommerce checkout

我正在与一个自定义的woocommerce结帐表格&#strong>多选字段进行斗争。

我通过功能创建了自定义多选字段:

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );

function custom_override_checkout_fields( $fields ) { 
     $fields['billing']['_myfield'] = array(
        'type'      => 'select',
        'id' => '_myfield',
        'label'     => __('My Field', 'woocommerce'),
        'required'  => true,
        'class'     => array('form-row-wide'),
        'clear'     => true,
        'options'       => [
            'key1'  => __('First Item', 'woocommerce'),
            'key2'  => __('Second Item', 'woocommerce'),
            'key3'  => __('Third Item', 'woocommerce'),
            'key4'  => __('Fourth Item', 'woocommerce')
        ]
    );
    return $fields;
}

请注意,woocommerce函数custom_override_checkout_fields无法创建自定义多选字段,所以这里我们有简单的选择字段。

我决定使用 jQuery 以这种方式添加多个缺失属性:

$('#_myfield').attr('multiple', 'multiple');

所以现在我有多选字段,看起来像:

<select name="_myfield" id="_myfield" class="select " data-placeholder="" multiple="multiple">...</select>

问题,该订单元值未正确更新,每次只显示一个值,而不是人数选择多个选项时的值数组。

我使用此功能更新订单的元值:

add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');

function my_custom_checkout_field_update_order_meta($order_id) {
   update_post_meta($order_id, '_myfield', $_POST['_myfield'] );
}

有任何帮助吗?

在结帐的结算部分创建多选字段可能有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

以下是制作自定义多选结帐字段并获取订单元数据中所选值的正确方法。

所有jQuery代码都包含在函数中,因此您必须删除自己的代码。

我添加了一个隐藏的输入字段,我用jQuery获取所选的值。下订单时,我从这个隐藏的输入字段中保存数据。

代码:

add_filter( 'woocommerce_checkout_fields' , 'custom_checkout_fields', 30, 1 );
function custom_checkout_fields ( $fields ) {
    $domain = 'woocommerce';

    $fields['billing']['multi_my_field'] = array(
        'label'        => __('My Field', 'woocommerce'),
        'required'     => true,
        'class'        => array('form-row-wide'),
        'clear'        => true,
        'autocomplete' => false,
        'type'         => 'select',
        'options'      => array(
            'key1'  => __('First Item', $domain),
            'key2'  => __('Second Item', $domain),
            'key3'  => __('Third Item', $domain),
            'key4'  => __('Fourth Item', $domain),
        ),
    );
    ?>
    <input type="hidden"  name="billing_my_field" id="billing_my_field" value="0">
    <script type='text/javascript'>
        jQuery(function($){
            var a = 'select[name="multi_my_field"]',
                b = 'input[name="billing_my_field"]';
            $(a).attr('multiple', 'multiple');
            $(a).change( function(){
                $(b).val($(this).val());
            })
        });
    </script>
    <?php
    return $fields;
}

add_action( 'woocommerce_checkout_update_order_meta', 'hidden_checkout_field_update_order_meta', 30, 1 );
function hidden_checkout_field_update_order_meta ( $order_id ) {
    if( isset( $_POST['billing_my_field'] ) )
        update_post_meta($order_id, '_billing_my_field', esc_attr( $_POST['billing_my_field'] ) );
}

代码放在活动子主题(或主题)的function.php文件中。

经过测试和工作