保存结帐自定义字段值并将其显示在 WooCommerce 管理订单中 注意事项:

问题描述

我的结账中有一些额外的字段,用于向客户询问有关其订单的某些事项。其中大部分是文本输入字段,但有一个选择菜单询问他们如何听说我的客户网站。我一直无法弄清楚如何在所选选项的订单元区域中显示值。下面是我如何从我的主题在我的 functions.PHP 文件生成选择下拉列表。

woocommerce_form_field( 'aba_hear',array(
    'type'     => 'select','required' => 'true','class'    => array('hear-class form-row-wide'),'label'    => __('How did You Hear About Us&#63;'),'options'  => array( // options for <select> or <input type="radio" />
        ''          => 'Please select',// empty values means that field is not selected
        'Instagram' => 'Instagram','Facebook'  => 'Facebook','Yelp'  => 'Yelp','Other' => 'Other',)

),$checkout->get_value( 'aba_hear' ) );

现在我要添加一个函数来更新订单元值:

add_action( 'woocommerce_checkout_update_order_Meta','aba_checkout_field_update_order_Meta' );

function aba_checkout_field_update_order_Meta( $order_id ) {
    if ( ! empty( $_POST['aba_hear'] ) ) {
        update_post_Meta( $order_id,'How did You Hear About Us&#63;',sanitize_text_field( $_POST['aba_hear'] ) );
    }
}

最后在订单页面显示值:

add_action( 'woocommerce_admin_order_data_after_billing_address','aba_checkout_field_display_admin_order_Meta',10,1 );
function aba_checkout_field_display_admin_order_Meta($order){
    echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . get_post_meta( $order->id,'Is this a Gift&#63;',true ) . '</p>';
}

最后,选择菜单代码在结账时的显示方式如下:

<p class="form-row hear-class form-row-wide validate-required" id="aba_hear_field" data-priority="">
    <label for="aba_hear" class="">How did You Hear About Us&#063;&nbsp;<abbr class="required" title="required">*</abbr></label>
    <span class="woocommerce-input-wrapper">
        <select name="aba_hear" id="aba_hear" class="select " data-allow_clear="true" data-placeholder="Please select">
            <option value=""  selected='selected'>Please select</option>
            <option value="Instagram" >Instagram</option>
            <option value="Facebook" >Facebook</option>
            <option value="Yelp" >Yelp</option>
            <option value="Other" >Other</option>
        </select>
    </span>
</p>

现在,这适用于文本输入字段,但不适用于选择菜单。如何更改它以使其正常工作,以便显示结果数据?

解决方法

您的某些功能存在一些错误……您需要在以下功能中使用与元键相同的结帐字段键:

在第二个函数中,您使用另一个钩子并将自定义字段也保存为用户元数据:

add_action( 'woocommerce_checkout_create_order','aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order ) {
    if ( isset($_POST['aba_hear']) && ! empty($_POST['aba_hear']) ) {
        $order->update_meta_data( '_aba_hear',sanitize_text_field( $_POST['aba_hear'] ) );

        // Update user data
        if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(),'aba_hear',true );
        }
    }
}

在第三个函数中使用这个:

add_action( 'woocommerce_admin_order_data_after_billing_address','aba_checkout_field_display_admin_order_meta',10,1 );
function aba_checkout_field_display_admin_order_meta( $order ){
    $value = $order->get_meta( '_aba_hear' );

    if ( ! empty($value) ) {
        echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . $value . '</p>';
    }
}

现在应该更好用了。


注意事项:

为什么还要将此结帐字段另存为自定义用户元数据?

因为在您的第一个函数中,您有 $checkout->get_value( 'aba_hear' ) 将在此自定义结帐字段中显示客户最后一个订单中的选定值。该值是从用户元“aba_hear”读取的。