首页 > 解决方案 > WooCommerce:从自定义字段设置属性值

问题描述

免责声明:我是 WooCommerce 的新手。如果我的方法或我的一般术语有缺陷,请告知:)

我想要做什么:客户应该能够在产品页面上选择预订日期。将产品添加到购物车后,日期应显示在购物车中。

到目前为止我的方法:我创建了一个带有 slug 到达日期的产品属性,并给它一个默认值(“尚未选择”)。该属性已添加到产品中,并将其配置为在产品页面上隐藏但在结帐页面上可见。之后,我在 functions.php 中创建了一个自定义字段以显示在产品页面上,并使用了 jquery datepicker。到目前为止,一切都很好。

使用钩子 woocommerce_add_cart_item_data,我可以这样设置购物车商品数据:

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 2 );
function add_cart_item_data( $cart_item_data, $product_id ) {

    write_log("adding item to cart, setting arrival date to " . $_POST["arrivaldate"]);

    $cart_item_data[ "pa_arrivaldate" ] = $_POST["arrivaldate"];  

    return $cart_item_data;
}

然而,我想这不是设置属性值的正确方法,因为结帐页面上的行仍然填充了默认值。

我怎样才能让它工作?我什至可以将属性设置为事先未创建的值吗?

标签: phpwordpresswoocommerce

解决方案


为了在结账时节省订单价值,您可以这样做:

add_action("woocommerce_checkout_update_order_meta", function ($order_id, array $data) {


    $order = \WC_Order_Factory::get_order($order_id);


    // to associate a different value at each item
    foreach ($order->get_items("line_item") as $id_line_item => $element) {

        update_post_meta($id_line_item, "date", $date);

    }


    // or if the date is associated to the order
    update_post_meta($order->get_ID(), "date", $date);


}, 10, 2);

推荐阅读