首页 > 解决方案 > 显示和保存来自购物车和结帐的自定义输入的自定义项目数据

问题描述

我正在尝试在购物车页面上添加带有自定义输入的购物车项目元数据。
我在 cart.php 模板上添加了输入:

<div class="product-gift">
<?php 
$isgift = isset( $cart_item['isgift'] ) ? true : false;

if (isset($_POST['gift-' . $cart_item_key])) {
    $isgiftval = $_POST['gift-' . $cart_item_key];
} else {
    $isgiftval = false;
}
?>
<input type="checkbox" id="gift-<?php echo $cart_item_key; ?>" name="gift-<?php echo $cart_item_key; ?>" data-cart-id="<?php echo $cart_item_key; ?>" class="gift-check" <?php if ($isgiftval) { echo 'checked'; }?>>
<label for="gift-<?php echo $cart_item_key; ?>"><?php echo __('Gift', 'hydora'); ?></label>
</div> <!-- .product-gift -->

在@LoicTheAztec提供的这个答案https://stackoverflow.com/a/54507293/6310884的帮助下,我在functions.php上添加了以下代码

add_filter( 'woocommerce_get_item_data', 'display_cart_item_custom_meta_data', 10, 2 );
function display_cart_item_custom_meta_data( $item_data, $cart_item ) {
    
    if ( isset($_POST['gift-' . $cart_item['key']]) ) {
        $item_data[] = array(
            'key'       => 'Gift',
            'value'     => 'yes',
        );
    }
    return $item_data;
}

add_action( 'woocommerce_checkout_create_order_line_item', 'save_cart_item_custom_meta_as_order_item_meta', 10, 4 );
function save_cart_item_custom_meta_as_order_item_meta( $item, $cart_item_key, $values, $order ) {

    if ( isset($values['Gift']) ) {
        $item->add_meta_data( 'Gift', $values['Gift'] );
    }
}

当我选中购物车页面上的复选框并更新购物车时,产品属性会使用新的元数据进行更新。但是如果我改变例如数量并再次更新它就会消失。结帐页面上也没有保存元数据。

你能帮我找到让它工作的缺失吗?

标签: phpwordpresswoocommercecartcheckout

解决方案


推荐阅读