有一个wordpress插件叫WC 菲尔德工厂 https://wordpress.org/plugins/wc-fields-factory/出于确切的目的,但对于手动代码:
2023年更新:自从这个答案以来,woocommerce 发生了一些变化。您现在可以使用以下代码添加一个名为的字段field1
添加到购物车之前到您的产品页面,并将其显示在thank you
and admin order details (edit order)
page :
// add field field1 before add to cart
function upfx_add_addtocart_field1() {
echo '
<style>
.kt-addtocart-field1{
padding: 8px 8px;
font-size: 16px;
}
.kt-addtocart-field1-label{
display: inline-block;
min-width: 90px;
}
.kt-addtocart-field1-container{
margin: 10px 0;
}
</style>
<div class="kt-addtocart-field1-container">
<label for="kt-addtocart-field1" class="kt-addtocart-field1-label">field1 :</label>
<input type="text" name="kt-addtocart-field1" id="kt-addtocart-field1" class="kt-addtocart-field1" value="" />
</div>';
}
add_action( 'woocommerce_before_add_to_cart_button', 'upfx_add_addtocart_field1' );
// field1 is required (validation)
function upfx_vadilate_cartitem_field1() {
if ( empty( $_REQUEST['kt-addtocart-field1'] ) ) {
wc_add_notice( __( 'Please enter a value for field1.', 'woocommerce' ), 'error' );
return false;
}
return true;
}
add_action( 'woocommerce_add_to_cart_validation', 'upfx_vadilate_cartitem_field1', 10, 3 );
// save field1 for cart item when adding to card
add_filter( 'woocommerce_add_cart_item_data', 'upfx_save_custom_fields_data_to_cart_for_field1', 10, 2 );
function upfx_save_custom_fields_data_to_cart_for_field1( $cart_item_data, $product_id ) {
$data = array();
if(isset( $_POST['kt-addtocart-field1'] ) && ! empty( $_POST['kt-addtocart-field1'] )){
$cart_item_data['custom_data']['upfx_addtocart_field1'] = $_POST['kt-addtocart-field1'];
// $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
}
return $cart_item_data;
}
// add field1 to order item meta
function upfx_add_orderitem_meta_field1( $item_id, $values, $cart_item_key ) {
$cart_item_data = WC()->cart->get_cart_item($cart_item_key);
wc_add_order_item_meta( $item_id, "field1", $cart_item_data['custom_data']['upfx_addtocart_field1'] );
}
add_action( 'woocommerce_add_order_item_meta', 'upfx_add_orderitem_meta_field1', 1, 3 );
原始答案(已过时)- 某些部件到 2023 年将不再工作:
您可以通过使用以下 woocommerce 挂钩来实现此目的woocommerce_before_add_to_cart_button
, woocommerce_add_to_cart
, woocommerce_cart_item_name
,and 'woocommerce_add_order_item_meta'
就像向产品页面添加文本字段一样
function add_name_on_tshirt_field() {
echo '<table class="variations" cellspacing="0">
<tbody>
<tr>
<td class="label"><label for="color">Name On T-Shirt</label></td>
<td class="value">
<input type="text" name="name-on-tshirt" value="" />
</td>
</tr>
</tbody>
</table>';
}
add_action( 'woocommerce_before_add_to_cart_button', 'add_name_on_tshirt_field' );
要在购物车项目表上显示自定义字段,请使用以下命令
function render_meta_on_cart_item( $title = null, $cart_item = null, $cart_item_key = null ) {
if( $cart_item_key && is_cart() ) {
echo $title. '<dl class="">
<dt class="">Name On T-Shirt : </dt>
<dd class=""><p>'. WC()->session->get( $cart_item_key.'_name_on_tshirt') .'</p></dd>
</dl>';
}else {
echo $title;
}
}
add_filter( 'woocommerce_cart_item_name', 'render_meta_on_cart_item', 1, 3 );
要在订单详细信息上创建自定义元数据,请执行以下操作
function tshirt_order_meta_handler( $item_id, $values, $cart_item_key ) {
wc_add_order_item_meta( $item_id, "name_on_tshirt", WC()->session->get( $cart_item_key.'_name_on_tshirt') );
}
add_action( 'woocommerce_add_order_item_meta', 'tshirt_order_meta_handler', 1, 3 );
对于详细的实现,我有一篇关于如何在不使用任何插件的情况下执行此操作的文章。http://sarkware.com/how-to-pass-custom-data-to-cart-line-item-in-woocommerce-without-using-plugins/ http://sarkware.com/how-to-pass-custom-data-to-cart-line-item-in-woocommerce-without-using-plugins/