在 WooCommerce 中添加产品自定义输入文本作为订单项数据
Add a product custom input text as order item data in WooCommerce
我想在不购买插件的情况下实现这一点。
很遗憾,我无法通过结帐阶段。
这是我的步骤:
// 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;
}
因此客户能够在产品页面中看到该字段,填写它并将产品添加到购物车,并在购物车页面中看到他自己的自定义文本。
到目前为止一切都很好。
但是,在结帐时,我丢失了关于刺绣文字的信息,我无法将其传递下去。
我在结账回顾页面看不到它
在后端,我刚收到的新 "order" 中没有它。
我的问题:
是否有类似于$cart_item的"order"对象?
如何访问它?像一个普通的数组? (例如 $cart_item['attribute_embroided_text'])
哪些钩子正在访问订单? (前端和后端)
我是不是做错了?应该改用变体吗? (我试过了,但我遇到了同样的问题
退房)
整个问题可以在“如何向订单添加额外数据”中进行总结,但我没有找到很多关于它的示例或文档。
谢谢
缺少的部分如下,它将把您的自定义购物车项目数据保存为订单项目数据并将其显示在任何地方订单和电子邮件 (即使在管理员中):
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 文件。应该可以。
我想在不购买插件的情况下实现这一点。
很遗憾,我无法通过结帐阶段。
这是我的步骤:
// 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;
}
因此客户能够在产品页面中看到该字段,填写它并将产品添加到购物车,并在购物车页面中看到他自己的自定义文本。 到目前为止一切都很好。
但是,在结帐时,我丢失了关于刺绣文字的信息,我无法将其传递下去。 我在结账回顾页面看不到它 在后端,我刚收到的新 "order" 中没有它。
我的问题:
是否有类似于$cart_item的"order"对象?
如何访问它?像一个普通的数组? (例如 $cart_item['attribute_embroided_text'])
哪些钩子正在访问订单? (前端和后端)
我是不是做错了?应该改用变体吗? (我试过了,但我遇到了同样的问题 退房)
整个问题可以在“如何向订单添加额外数据”中进行总结,但我没有找到很多关于它的示例或文档。
谢谢
缺少的部分如下,它将把您的自定义购物车项目数据保存为订单项目数据并将其显示在任何地方订单和电子邮件 (即使在管理员中):
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 文件。应该可以。