WooCommerce功能用于下拉框



我不是wordpress开发人员,我正在尝试在woocommerce结帐功能上拼凑一个小函数。我需要的是双重的。首先是能够放入一个简单的功能,允许在结帐页面上放置一个下拉框。我确实设法找到了这段代码:

add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h2>'.__('Purchase Extra').'</h2>';
woocommerce_form_field( 'my_field_name', array(
    'type'          => 'text',
    'class'         => array('my-field-class form-row-wide'),
    'label'         => __('Fill in this field'),
    'placeholder'       => __('Enter something'),
    ), $checkout->get_value( 'my_field_name' ));
echo '</div>';
}

woocommerces文档说您可以像这样添加下拉列表:

$fields['billing']['your_field']['options'] = array(
       'option_1' => 'Option 1 text',
       'option_2' => 'Option 2 text'
  );

我不知道如何将两者合并在一起。

结帐成功后如何提取该选择?

===================================================

我已经尝试了新代码,虽然一切似乎都工作正常 - 选择的值不是保存到数据库。它只是空白的。

这是我的更新代码

 add_action('woocommerce_before_order_notes', 'my_custom_checkout_field');
 function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h2>'.__('Purchase Domain').'</h2>';
woocommerce_form_field( 'do_domain', array(
    'type'          => 'select',
    'class'         => array('chzn-drop'),
    'label'         => __('Purchase from KitKamp?'),
    'placeholder'   => __('Enter something'),
    'options'       => array(
                    'subdomain' => __('No Thank You', 'woocommerce' ),
                    'domain' => __('Yes Please', 'woocommerce' )
                )
    ), 
    $checkout->get_value( 'do_domain' ));
echo '</div>';
}

 add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
 function my_custom_checkout_field_process() {
    global $woocommerce;
    // Check if set, if its not set add an error.
    if (!$_POST['do_domain'])
     $woocommerce->add_error( __('Please select your domain type.') );
 }


 add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
 function my_custom_checkout_field_update_order_meta( $order_id ) {
   if ($_POST['do_domain']) update_post_meta( $order_id, 'do_domain', esc_attr($_POST['do_domain']));
 }

 add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
 function my_custom_checkout_field_display_admin_order_meta($order){
     echo '<p><strong>'.__('Domain Purchase').':</strong> ' . $order->order_custom_fields['do_domain'][0] . '</p>';
 }

这是一个很好的模板供您使用。它还提供了一个"class"参数,使您可以轻松设置样式。

/**
 * Add the field to the checkout
 **/
add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');
function my_custom_checkout_field( $checkout ) {
    echo '<div id="my_custom_checkout_field"><h2>'.__('My Field').'</h2>';
    woocommerce_form_field( 'my_field_name', array(
        'type'          => 'select',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Fill in this field'),
        'placeholder'       => __('Enter something'),
        ), $checkout->get_value( 'my_field_name' ));
    echo '</div>';
}

现在这是添加下拉列表

function custom_override_checkout_fields( $fields ) {
$fields['my_custom_checkout_field']['options'] = array(
    'label'       => __('Options', 'woocommerce'),
    'placeholder' => _x('', 'placeholder', 'woocommerce'),
    'required'    => false,
    'clear'       => false,
    'type'        => 'select',
    'class'       => array('own-css-name'),
    'options'     => array(
        'option_a' => __('option a', 'woocommerce' ),
        'option_b' => __('option b', 'woocommerce' )
        )
    );
}

现在验证新的自定义字段:

/**
 * Process the checkout
 **/
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    global $woocommerce;
    // Check if set, if its not set add an error.
    if (!$_POST['my_field_name'])
         $woocommerce->add_error( __('Please enter something into this new shiny field.') );
}

现在将新字段保存到订单自定义字段:

/**
 * Update the order meta with field value
 **/
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ($_POST['my_field_name']) update_post_meta( $order_id, 'My Field', esc_attr($_POST['my_field_name']));
}

是的,这将与其余订单信息一起添加到数据库中。我认为这将解决您关于提取的问题:

/**
 * Display field value on the order edition page
 **/
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('My Field').':</strong> ' . $order->order_custom_fields['My Field'][0] . '</p>';
}

这将在管理订单版本页面上添加/显示新字段。

最新更新