【问题标题】:Save Custom Field Data to Cart and Order of a Woocommerce product variation将自定义字段数据保存到 Woocommerce 产品变体的购物车和订单
【发布时间】:2020-11-12 03:42:32
【问题描述】:

我们设法在Remi Corson guide here 之后为变体产品添加了一个自定义字段

此时,当用户选择变体时,我们可以在单个产品页面中显示自定义文本字段,但这在购买过程中还不够,因为我们需要:

A) 在购物车和结帐中显示此文本
B) 保存此信息,使其显示在感谢页面、电子邮件和管理员订单编辑页面中

类似于 Save and display product custom meta on WooCommerce orders and emails,但有产品变体而不是简单产品。

这是我们添加到 functions.php 的代码,用于将自定义字段添加到产品变体中

// Add Variation Settings
add_action( 'woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3 );

// Save Variation Settings
add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );

/**
 * Create new fields for variations
 *
*/
function variation_settings_fields( $loop, $variation_data, $variation ) {

    // Text Field
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_text_field[' . $variation->ID . ']', 
            'label'       => __( 'My Text Field', 'woocommerce' ), 
            'placeholder' => 'http://',
            'desc_tip'    => 'true',
            'description' => __( 'Enter the custom value here.', 'woocommerce' ),
            'value'       => get_post_meta( $variation->ID, '_text_field', true )
        )
    );

        // Hidden field
    woocommerce_wp_hidden_input(
    array( 
        'id'    => '_hidden_field[' . $variation->ID . ']', 
        'value' => 'hidden_value'
        )
    );

}

/**
 * Save new fields for variations
 *
*/
function save_variation_settings_fields( $post_id ) {

    // Text Field
    $text_field = $_POST['_text_field'][ $post_id ];
    if( ! empty( $text_field ) ) {
        update_post_meta( $post_id, '_text_field', esc_attr( $text_field ) );
    }

    // Hidden field
    $hidden = $_POST['_hidden_field'][ $post_id ];
    if( ! empty( $hidden ) ) {
        update_post_meta( $post_id, '_hidden_field', esc_attr( $hidden ) );
    }

}

// Add New Variation Settings
add_filter( 'woocommerce_available_variation', 'load_variation_settings_fields' );

/**
 * Add custom fields for variations
 *
*/
function load_variation_settings_fields( $variations ) {
    
    // duplicate the line for each field
    $variations['text_field'] = get_post_meta( $variations[ 'variation_id' ], '_text_field', true );
    
    return $variations;

}

所以这里的目标是我们如何在商品下方显示购物车和结帐中的每个变体的自定义字段(如下图所示 - 请查看运输延迟通知)

并将每个变体具有的自定义字段信息保存到感谢页面、电子邮件和订单页面(我们使用此代码对简单产品进行了此操作,但这不适用于可变产品)

// Save and display "Custom Field for Simple Products" on order items everywhere
add_filter( 'woocommerce_checkout_create_order_line_item', 'action_wc_checkout_create_order_line_item', 10, 4 );
function action_wc_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {

    // Get the Custom Field
    $value = $values['data']->get_meta( 'custom_field_for_simple_products' );

    if( ! empty( $value ) ) {
        // Save it and display it
        $item->update_meta_data( __( 'Custom Fields', 'woocommerce' ), $value );
    }
}

请帮忙!!

【问题讨论】:

    标签: php wordpress woocommerce custom-fields product-variations


    【解决方案1】:

    更新

    您的代码中存在一些错误...以下重新访问的代码将解决您的问题:

    // Display Variation custom fields (admin)
    add_action( 'woocommerce_product_after_variable_attributes', 'display_variation_setting_custom_fields', 10, 3 );
    function display_variation_setting_custom_fields( $loop, $variation_data, $variation ) {
        echo '<div>';
    
        woocommerce_wp_text_input( array( // Text Field
            'id'            => "_text_field[$loop]",
            'label'         => __("My Text Field", "woocommerce"),
            'placeholder'   => "http://",
            'desc_tip'      => true,
            'description'   => __("Enter the custom value here.", "woocommerce"),
            'wrapper_class' => 'form-row form-row-full',
            'value'         => get_post_meta( $variation->ID, '_text_field', true ),
        ) );
    
        woocommerce_wp_hidden_input( array( // Hidden field
            'id'    => "_hidden_field[$loop]",
            'value' => 'hidden_value',
        ) );
        echo '</div>';
    }
    
    
    // Save Variation custom fields
    add_action( 'woocommerce_save_product_variation', 'save_variation_custom_fields', 10, 2 );
    function save_variation_custom_fields( $variation_id, $i ) {
        // Save Text Field
        if( isset( $_POST['_text_field'][$i] ) && ! empty( $_POST['_text_field'][$i] ) )
            update_post_meta( $variation_id, '_text_field', sanitize_text_field( $_POST['_text_field'][$i] ) );
    
        // Save Hidden Field
        if( isset( $_POST['_hidden_field'][$i] ) && ! empty( $_POST['_hidden_field'][$i] ) )
            update_post_meta( $variation_id, '_hidden_field', esc_attr( $_POST['_hidden_field'][$i] ) );
    }
    
    // Include our variation custom field
    add_filter( 'woocommerce_available_variation', 'include_variation_custom_field', 10, 3) ;
    function include_variation_custom_field( $data, $product, $variation ) {
        $data['text_field'] = $variation->get_meta( '_text_field' );
    
        return $data;
    }
    
    // Save and display "Custom Field for Simple Products" on order items everywhere
    add_filter( 'woocommerce_checkout_create_order_line_item', 'action_wc_checkout_create_order_line_item_2', 10, 4 );
    function action_wc_checkout_create_order_line_item_2( $item, $cart_item_key, $values, $order ) {
        // Get the Custom Field
        $value = $values['data']->get_meta( '_text_field' );
    
        if( ! empty( $value ) ) {
            // Save it and display it
            $item->update_meta_data( __( 'Custom Field', 'woocommerce' ), $value );
        }
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    相关:Save and display product custom meta on WooCommerce orders and emails


    一些截图

    关于管理产品变体设置:

    收到订单页面(谢谢):

    在管理员编辑订单页面上:

    【讨论】:

    • 感谢您抽出时间 LoicTheAztec,尽管这对我不起作用。让我再解释一下:我可以在单个产品页面中显示自定义字段,但是当产品添加到购物车时,它不会在项目下方显示自定义字段,在结帐时也不显示'不要将信息保存到订单或电子邮件中。代码的最后一部分 // 保存并在任何地方的订单项目上显示“简单产品的自定义字段” // 给我一个致命错误:(
    • @phriquez 刚刚在另一个安装(最后一个 woocommerce 版本)上进行了测试,它运行良好。我添加了一些屏幕截图。所以你可能需要用我的替换你所有的问题代码。现在您没有在问题中要求在购物车和结帐项目中显示 tha。
    • 好的。我是来自问题stackoverflow.com/questions/63025782/… 的同一用户,当我将您发送给我的代码添加到我的functions.php 之前添加了这个代码时,您认为存在错误或冲突吗?
    • @phriquez 是的,当然,这就是问题所在……我在这里稍微更改了最后一个函数名称(代码已更新)……这次应该可以了。
    • 已解决。我发现问题是我的错误实施。它正在工作。谢谢!
    猜你喜欢
    • 2018-08-28
    • 2019-07-16
    • 2016-04-03
    • 2019-07-21
    • 2018-06-23
    • 2018-06-30
    • 2018-06-08
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多