Php 将自定义字段数据保存到Woocommerce产品变体的购物车和订单

Php 将自定义字段数据保存到Woocommerce产品变体的购物车和订单,php,wordpress,woocommerce,custom-fields,product-variations,Php,Wordpress,Woocommerce,Custom Fields,Product Variations,我们设法为以下变化的产品设置了一个自定义字段 此时,当用户选择变体时,我们能够在单个产品页面中显示自定义文本字段,但这在购买过程中是不够的,因为我们需要: A) 在购物车中显示此文本并结帐 B) 保存此信息,以便在感谢页面、电子邮件和管理订单编辑页面中显示 类似于,但有产品变化,而不是简单的产品 这是我们添加到functions.php的代码,用于将自定义字段添加到产品变体中 // Add Variation Settings add_action( 'woocommerce_product_a

我们设法为以下变化的产品设置了一个自定义字段

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

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

类似于,但有产品变化,而不是简单的产品

这是我们添加到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;

}
因此,这里的目标是如何为购物车中的每个变体显示此自定义字段,并在项目下方签出(如下图所示-查看发货延迟通知)

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


请帮忙

更新

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

// 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 );
    }
}
//显示变量自定义字段(管理员)
添加操作('WOOMerce\u product\u after\u variable\u attributes','display\u variation\u setting\u custom\u fields',10,3);
函数显示\变量\设置\自定义\字段($loop、$variation\u data、$variation){
回声';
woocommerce\u wp\u text\u输入(数组(//文本字段
'id'=>“\u text\u字段[$loop]”,
'label'=>\(“我的文本字段”,“woocommerce”),
'占位符'=>“http://”,
“描述提示”=>正确,
“description'=>”(在此处输入自定义值),“woocommerce”),
'wrapper_class'=>'form row form row full',
'value'=>get_post_meta($variation->ID,'u text_field',true),
) );
woocommerce\u wp\u hidden\u输入(数组(//隐藏字段
'id'=>“_hidden_字段[$loop]”,
'value'=>'hidden_value',
) );
回声';
}
//保存变体自定义字段
添加操作('woocommerce\u save\u product\u variation'、'save\u variation\u custom\u fields',10,2);
函数save_variation_custom_字段($variation_id,$i){
//保存文本字段
if(设置($\u POST[“u text\u field”][$i])&!空($\u POST[“u text\u field”][$i]))
更新发布元数据($变体id,''''''''''''''''''''''''''''''''''''.'文本字段''.'清理'''.'文本字段'.[$i]);
//保存隐藏字段
if(设置($\u POST[“u hidden\u field”][$i])&!空($\u POST[“u hidden\u field”][$i]))
更新发布元($variation\u id,'u hidden\u field',esc\u attr($\u post[''u hidden\u field'][$i]);
}
//包括我们的变体自定义字段
添加过滤器(“woocommerce\u available\u variation”,“include\u variation\u custom\u field”,10,3);
函数包括变量自定义字段($data、$product、$VARIANCE){
$data['text_field']=$variation->get_meta('u text_field');
返回$data;
}
//在任何地方保存和显示订单项上的“简单产品自定义字段”
添加过滤器('woocommerce\u checkout\u create\u order\u line\u item'、'action\u wc\u checkout\u create\u order\u line\u item\u 2',10,4);
函数操作\u wc\u签出\u创建\u订单\u行\u项目\u 2($item,$cart\u item\u key,$values,$order){
//获取自定义字段
$value=$values['data']->get_meta('u text_field');
如果(!空($value)){
//保存并显示它
$item->update_meta_数据(uuu('customfield','woocommerce'),$value);
}
}
代码进入活动子主题(或活动主题)的functions.php文件。测试和工作

相关的:


索姆截图 管理产品变体设置:

在订单接收页面(谢谢):

在管理员编辑订单页面:


感谢您抽出时间来LoicTheAztec,尽管这对我来说不起作用。让我再解释一下:我可以在单个产品页面中显示自定义字段,但当产品添加到购物车中时,它不会在商品下方显示自定义字段,也不会在结帐时显示,也不会将信息保存到订单或电子邮件中。代码的最后一部分//保存并显示“简单产品的自定义字段”在order items everywhere//中,我发现了一个致命错误:(@phriquez刚刚在另一个安装(最新版本)上测试了这个错误)我已经添加了一些截图。所以你可能需要用我的问题代码替换你的所有问题代码。现在你没有在问题中要求在购物车和结帐项目中显示tha。好的。我就是这个问题中的同一个用户。当我将你发送给我的代码添加到我的函数中时,你认为有错误或冲突吗。php having这是之前添加的?@phriquez是的,当然,这就是问题所在…我在这里稍微更改了最后一个函数名(代码更新)…这次应该可以工作了。解决了。我发现问题是我实现的错误。它可以工作了。谢谢!
// 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 );
    }
}