在WooCommerce中添加自定义字段作为购物车物品元和订购物品元

这是一个关于如何添加购物车物品meta的插件&我的WooCommerce订单的订单物品元。最初我的代码对于输入类型=文本很好。它返回值和输入值的标签。在WooCommerce中添加自定义字段作为购物车物品元和订购物品元

转换为type=checkbox时,代码将返回labelvalue="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

回到顶部