在WooCommerce中添加自定义字段作为购物车物品元和订购物品元
这是一个关于如何添加购物车物品meta的插件&我的WooCommerce订单的订单物品元。最初我的代码对于输入类型=文本很好。它返回值和输入值的标签。在WooCommerce中添加自定义字段作为购物车物品元和订购物品元
转换为type=checkbox
时,代码将返回label
和value="on"
。
我想只返回选中值的值名称(忽略未选中的值)。
帮助包含更多复选框选项的重构将有助于减少书面代码。
我的代码:
<?php global $woocommerce, $product, $post;
add_action('woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart');
function add_fields_before_add_to_cart() {
?>
<div class="simple-selects">
<div class="col-md-6">
<h3>Main meals</h3>
<p><input type="checkbox" name="mm_chicken_cutlet_bento" id="mm_chicken_cutlet_bento"><?php _e("Chicken Cutlet Bento", "aoim"); ?></p>
<p><input type="checkbox" name="mm_roasted_pork_rib_bento" id="mm_roasted_pork_rib_bento"><?php _e("Roasted Pork Rib Bento", "aoim"); ?></p>
</div>
</div>
<?php
}
/**
* Add data to cart item
*/
add_filter('woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2);
function add_cart_item_data($cart_item_meta, $product_id) {
if (isset($_POST ['mm_chicken_cutlet_bento']) && isset($_POST ['mm_roasted_pork_rib_bento'])) {
$custom_data = array() ;
$custom_data [ 'mm_chicken_cutlet_bento' ] = isset($_POST ['mm_chicken_cutlet_bento']) ? sanitize_text_field ($_POST ['mm_chicken_cutlet_bento']) : "" ;
$custom_data [ 'mm_roasted_pork_rib_bento' ] = isset($_POST ['mm_roasted_pork_rib_bento']) ? sanitize_text_field ($_POST ['mm_roasted_pork_rib_bento']): "" ;
$cart_item_meta ['custom_data'] = $custom_data ;
}
return $cart_item_meta;
}
/**
* Display custom data on cart and checkout page.
*/
add_filter('woocommerce_get_item_data', 'get_item_data' , 25, 2);
function get_item_data ($other_data, $cart_item) {
if (isset($cart_item [ 'custom_data' ])) {
$custom_data = $cart_item [ 'custom_data' ];
$other_data[] = array('name' => 'Chicken Cutlet Bento', 'display' => $custom_data['mm_chicken_cutlet_bento']);
$other_data[] = array('name' => 'Roasted Pork Rib Bento', 'display' => $custom_data['mm_roasted_pork_rib_bento']);
}
return $other_data;
}
/**
* Add order item meta.
*/
add_action('woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 2);
function add_order_item_meta ($item_id, $values) {
if (isset($values [ 'custom_data' ])) {
$custom_data = $values [ 'custom_data' ];
wc_add_order_item_meta($item_id, 'Chicken Cutlet Bento', $custom_data['mm_chicken_cutlet_bento']);
wc_add_order_item_meta($item_id, 'Roasted Pork Rib Bento', $custom_data['mm_roasted_pork_rib_bento']);
}
}
?>
回答:
更新(相关评论):
- 限制的功能只有一个产品ID
- 添加所有复选框值作为昏迷分离的字符串
为了得到轻松您的复选框的标签名称为值和“重构,以帮助包括更多的复选框的选择将有助于减少编写的代码,”我添加了一个简单的功能在这里设置的键/你要显示的每个复选框和工艺值对...
所以我重新审视所有的代码:
// HERE set the array of pairs keys/values for your checkboxes function custom_checkboxes(){
return array(
'mm_chicken_cutlet_bento' => __("Chicken Cutlet Bento", "aoim"),
'mm_roasted_pork_rib_bento' => __("Roasted Pork Rib Bento", "aoim"),
);
}
// Displaying the checkboxes
add_action('woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart');
function add_fields_before_add_to_cart() {
global $product;
if($product->get_id() != 2) return; // Only for product ID "2"
?>
<div class="simple-selects">
<div class="col-md-6">
<h3><?php _e("Main meals", "aoim"); ?></h3>
<?php foreach(custom_checkboxes() as $key => $value): ?>
<p><input type="checkbox" name="<?php echo $key; ?>" id="<?php echo $key; ?>"><?php echo ' ' . $value; ?></p>
<?php endforeach; ?>
</div>
</div>
<?php
}
// Add data to cart item
add_filter('woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2);
function add_cart_item_data($cart_item_data, $product_id) {
if($product_id != 2) return $cart_item_data; // Only for product ID "2"
// Set the data for the cart item in cart object
$data = array() ;
foreach(custom_checkboxes() as $key => $value){
if(isset($_POST[$key]))
$cart_item_data['custom_data'][$key] = $data[$key] = $value;
}
// Add the data to session and generate a unique ID
if(count($data > 0)){
$cart_item_data['custom_data']['unique_key'] = md5(microtime().rand());
WC()->session->set('custom_data', $data);
}
return $cart_item_data;
}
// Display custom data on cart and checkout page.
add_filter('woocommerce_get_item_data', 'get_item_data' , 25, 2);
function get_item_data ($cart_data, $cart_item) {
if($cart_item['product_id'] != 2) return $cart_data; // Only for product ID "2"
if(! empty($cart_item['custom_data'])){
$values = array();
foreach($cart_item['custom_data'] as $key => $value)
if($key != 'unique_key'){
$values[] = $value;
}
$values = implode(', ', $values);
$cart_data[] = array(
'name' => __("Option", "aoim"),
'display' => $values
);
}
return $cart_data;
}
// Add order item meta.
add_action('woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 3);
function add_order_item_meta ($item_id, $cart_item, $cart_item_key) {
if (isset($cart_item[ 'custom_data' ])) {
$values = array();
foreach($cart_item[ 'custom_data' ] as $key => $value)
if($key != 'unique_key'){
$values[] = $value;
}
$values = implode(', ', $values);
wc_add_order_item_meta($item_id, __("Option", "aoim"), $values);
}
}
此代码放在你的活跃儿童主题(或主题)的function.php文件或也在任何插件文件中。
经过测试和工作。
你会得到这样的事情:
我已经加入 “选项”,如标签,以避免值的重复...
以上是 在WooCommerce中添加自定义字段作为购物车物品元和订购物品元 的全部内容, 来源链接: utcz.com/qa/262004.html