gpt4 book ai didi

php - 在 WooCommerce 中添加和处理自定义结帐选择字段的问题

转载 作者:行者123 更新时间:2023-12-04 08:08:23 25 4
gpt4 key购买 nike

我正在尝试在结帐时添加一个下拉字段,该字段需要在提交订单之前进行验证,并存储在订单中以供管理员查看订单详细信息。但出于某种原因,即使在我选择了下拉选项之后,它仍然说必须为该字段选择一个值。

add_filter( 'woocommerce_after_checkout_form', 'custom_checkout_fields' );

function custom_checkout_fields( $checkout ) {

// The selector
woocommerce_form_field( 'allow_substitute', array(
'type' => 'select',
'required' => true,
'class' => array('my-field-class form-row-wide'),
'label' => __('Allow Product substitution when a cigar is out of stock?', 'my_theme_slug'),
'options' => array(
'' => __('Choose an option', 'my_theme_slug'),
'option1' => 'Allow product substitution (When a cigar is out of stock, a similar cigar will be shipped.',
'option2' => 'Call me before making a product substitution',
'option3' => 'Refund the cigar order value that is out of stock'
)
), $checkout->get_value( 'allow_substitute' ));

echo '</div>';
}

// Process the checkout
add_action('woocommerce_checkout_process', 'custom_checkout_field_process');
function custom_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST['allow_substitute'] ) // the selector
wc_add_notice( __( 'Please select a value for "Product Substitution?" field.' ), 'error' );
}

// Update the order meta with field value
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta' );
function custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['allow_substitute'] ) ) {
update_post_meta( $order_id, 'allow_substitute', sanitize_text_field( $_POST['allow_substitute'] ) );
}
}

最佳答案

您不能在结帐表单外添加自定义结帐字段,因为它没有发布……请改用以下完整的替换代码:

// Function with the array of options key / values pairs for the select field
function get_allow_substitute_field_options() {
$text_domain = 'my_theme_slug';

return array(
'' => __('Choose an option', $text_domain),
'1' => __('Allow product substitution (When a cigar is out of stock, a similar cigar will be shipped.', $text_domain),
'2' => __('Call me before making a product substitution', $text_domain),
'3' => __('Refund the cigar order value that is out of stock', $text_domain)
);
}

// Display the select field
add_filter( 'woocommerce_checkout_after_order_review', 'custom_checkout_select_field', 50 );
function custom_checkout_select_field() {
$text_domain = 'my_theme_slug';

// The select field
woocommerce_form_field( 'allow_substitute', array(
'type' => 'select',
'required' => true,
'class' => array('my-field-class form-row-wide'),
'label' => __('Allow Product substitution when a cigar is out of stock?', $text_domain),
'options' => get_allow_substitute_field_options(),
), WC()->checkout->get_value( 'allow_substitute' ));

echo '</div>';
}

// Checkout select field validation
add_action('woocommerce_after_checkout_validation', 'custom_checkout_select_field_validation', 10, 2 );
function custom_checkout_select_field_validation( $data, $errors ) {
// Check if set, if its not set add an error.
if ( isset($_POST['allow_substitute']) && empty($_POST['allow_substitute']) ) {
$errors->add( 'validation', __( 'Please select a value for "Product Substitution?" field.' ) );
}
}

// Save selected option as order meta data
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_field_update_order_meta' );
function custom_checkout_field_update_order_meta( $order ) {
if ( isset($_POST['allow_substitute']) && ! empty($_POST['allow_substitute']) ) {
$order->update_meta_data( 'allow_substitute', sanitize_text_field( $_POST['allow_substitute'] ) );
}
}

// Display "allow_substitute" option value on the order edit pages under billing section
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_allow_substitute_field_value_in_admin_orders', 10, 1 );
function display_allow_substitute_field_value_in_admin_orders($order){
$field_key = $order->get_meta('allow_substitute');

if ( ! empty($field_key) ) {
$field_options = get_allow_substitute_field_options();
$field_value = $field_options[$field_key];

echo '<p>
<strong>'.__('Product substitution').':</strong> <br>
<small>' . $field_value . '</small>
</p>';
}
}

代码进入事件子主题(或事件主题)的 functions.php 文件。经过测试并有效。

关于php - 在 WooCommerce 中添加和处理自定义结帐选择字段的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66107370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com