当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce中添加产品自定义输入文本作为订单项数据

百里文景
2023-03-14

我想在不购买插件的情况下实现这一点。

不幸的是,我无法通过结帐阶段。

在这里我的步骤:

//1属性的创建

add_action( 'woocommerce_product_options_general_product_data', 'create_custom_attribute' );

function create_custom_attribute() {
  $args = array(
    'id'            => 'attribute-embroided-text',
    'label'         => __( 'Embroided Text', 'woocommerce' ),
    'class'                 => 'myclass',
    'value'                 => 'placeholder',
    'desc_tip'      => true,
    'custom_attributes' => array('readonly' => 'readonly'),
  );
  woocommerce_wp_text_input( $args );

//2保存属性

add_action( 'woocommerce_process_product_meta', 'save_custom_attribute' );

function cfwc_save_custom_field( $post_id ) {
    $product = wc_get_product( $post_id );
    $embroided_text = isset( $_POST['attribute-embroided-text'] ) ? $_POST['attribute-embroided-text'] : '';
    $product->update_meta_data( 'attribute-embroided-text', sanitize_text_field( $embroided_text ) );
}

//3在前端显示属性

add_action( 'woocommerce_before_single_variation', 'display_custom_attribute' );

function display_custom_attribute() {
    global $post;
    ...
    printf('<div class="">
              <h4 class="" for="attribute-embroided-text">Embroided Text/i</h4>
              <input class="form-control" type="text" id="attribute-embroided-text" name="attribute-embroided-text" value="">
            </div>');
    ...
}

//4验证属性


add_filter( 'woocommerce_add_to_cart_validation', 'validate_custom_attribute', 10, 4 );

function validate_custom_attribute( $passed, $product_id, $quantity ) {
    if(empty( $_POST['attribute-embroided-text'] ) ) {
        $passed = false;
        wc_add_notice( __( 'Field cannot be empty', 'woocommerce' ), 'error' );
    }
    return $passed;
}

//5将属性添加到购物车

add_filter( 'woocommerce_add_cart_item_data', 'add_custom_attribute_to_cart', 10, 4 );

function add_custom_attribute_to_cart( $cart_item_data, $product_id, $variation_id, $quantity ) {
    if( ! empty( $_POST['attribute-embroided-text'] ) ) {
        $cart_item_data['attribute_embroided_text'] = $_POST['attribute-embroided-text'];
    } 
    return $cart_item_data;
}

//6在购物车中显示属性

add_filter( 'woocommerce_cart_item_name', 'display_custom_attribute_into_cart', 10, 3 );

function display_custom_attribute_into_cart( $name, $cart_item, $cart_item_key ) {
    if( isset( $cart_item['attribute_embroided_text'] ) ) {
        $name .= sprintf('<dl class="variation"><dt>Embroided Text/i:</dt><dd>%s</dd></dl>', esc_html( 
    $cart_item['attribute_embroided_text'] ));
    }
    return $name;
}

因此,客户可以在产品页面中看到该字段,填充该字段并将产品添加到购物车,并在购物车页面中看到自己的自定义文本。直到现在一切都好。

但是,在退房时,我丢失了有关Embroed文本的信息,我无法将其传递下去。我在退房回顾页面上看不到它,在后端,我刚收到的新“订单”中没有它。

我的问题是:

>

  • 是否有类似于$cart_item的订单对象?

    我如何访问它?像普通的阵列一样?(例如$cart_item['attribute_embroided_text'])

    哪些是进入订单的钩子?(前端和后端)

    我做错了吗?应该改用变体吗?(我试过了,但在退房时遇到了同样的问题)

    整个问题可以在“如何向订单添加额外数据”中进行总结,但我没有找到很多关于它的示例或文档。

    非常感谢。

  • 共有1个答案

    晏树
    2023-03-14

    缺少的部分是以下内容,它将把您的自定义购物车项目数据保存为订单项目数据,并在订单和电子邮件中随处显示(甚至在管理中):

    add_action('woocommerce_checkout_create_order_line_item', 'save_custom_order_item_metadata', 10, 4 );
    function save_custom_order_item_metadata( $item, $cart_item_key, $values, $order ) {
        if( isset( $cart_item['attribute_embroided_text'] ) ) 
            $item->update_meta_data( __( 'Embroided Text', 'woocommerce' ), $cart_item['attribute_embroided_text'] );
    }
    

    代码functions.php活动子主题(或活动主题)的文件中。它应该工作。

     类似资料:
    • 当从管理员向订单添加产品时,我尝试将自定义产品元添加到订单项元。这是我的代码,它在后端什么都不做。。。

    • 有什么方法我可以添加内容从一个自定义产品字段到‘订单完成'WooCommerce电子邮件? 我已经将此代码添加到functions.php中,以便将自定义字段保存到产品元信息中。 上面的代码工作得很好,它显示了所有“订单完成”电子邮件的自定义文本。 但是,我想用自定义产品字段数据替换文本的URL部分。每个产品的数据都不同。 谢了。

    • 我对woocommerce(最新版本)中的自定义字段有问题。我需要你的帮助。 我的代码 现在我在从自定义字段获取数据时遇到问题。字段被保存到数据库中,因为在我编辑产品时,值在字段中,但在完成订单后,我无法在钩子中获取它:(我尝试使用get_post_meta、get_meta和其他方法,但都不起作用。有人知道原因吗?

    • 在Woocommerce 3应答代码中使用将自定义产品元数据传递到订单,当从后端手动创建订单时,从后端手动添加产品时,是否可以保存和显示自定义元数据? 这是我的代码(略有改动): 当客户机从前端创建订单时,这种方法可以正常工作。但是,当管理员从后端手动创建订单并添加产品时,自定义元数据不可见。 对于手动创建的订单,如何解决此问题,允许添加产品自定义字段作为自定义订单项目数据?

    • 我有一家woocommerce商店,想定制我的产品。用户直接访问类别页面,无店铺存档页面。 你有没有什么好的方法来定制订单?我试着使用插件,并给那些产品一个编号。。。但一切都没有奏效。 问候

    • 在WooCommerce 3.0发布之前,我的代码已经像魔法一样工作,将自定义值从购物车保存到结账时的订单中。但从那以后,我无法为订单创建自定义元。 环境:WordPress4.9。4.