【问题标题】:Add cart meta value for a product after an order request is submitted提交订单请求后为产品添加购物车元值
【发布时间】:2016-11-28 06:06:18
【问题描述】:

我有一个多供应商餐厅 WooCommerce 网站。一个人最多可以从一家餐厅订购。在将产品添加到购物车的餐厅中,我添加了一个额外的元字段restaurant_id,这是该餐厅的 ID。在购物车中,所有产品都有相同的restaurant_id

即:我在购物车中有两件商品具有 product_id1213 但它们具有相同的 restaurant_id366

我需要将此restaurant_id 添加为order-completeorder-process action 中的元字段。因为我需要在客户帐户页面上显示餐厅名称。

或者有什么简单的方法吗?

我试过下面的代码作为测试

add_action( 'woocommerce_checkout_update_order_meta', 'add_field_to_order' );
function add_field_to_order( $order_id ) {
    update_post_meta( $order_id, 'new_field', 'new_value' );
}

但它不会添加任何meta-fieldmeta-value 来订购

【问题讨论】:

    标签: php wordpress woocommerce custom-fields orders


    【解决方案1】:

    ——更新——

    据我所知,这个自定义字段已经存在,并且您在购物车中获得了这个 restaurant_id 值。因此,您希望在查看顺序中显示它(感谢您和我的帐户页面),并且可能在电子邮件中......

    代码如下:

    //
    // ADD HIDDEN IMPUT FIELDS TO THE CHECKOUT
    //
    add_action( 'woocommerce_after_order_notes', 'checkout_custom_hidden_imput_field' );
    function checkout_custom_hidden_imput_field( $checkout ) {
        foreach(WC()->cart->get_cart() as $item){
            $restaurant_id = $item['restaurant_id'];
            break;
        }
        echo '<div id="custom_checkout_fields" class="custom-hidden-checkout-field">
            <input type="hidden" id="restaurant_id" name="restaurant_id" value="'.$restaurant_id.'" />
        </div>';
    }
    
    //
    // SAVE THE ORDER META WITH FIELD VALUE
    //
    add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta' );
    
    function custom_checkout_field_update_order_meta( $order_id ) {
        if ( ! empty( $_POST['restaurant_id'] ) ) {
            add_post_meta( $order_id, '_restaurant_id', $_POST['restaurant_id'] );
        }
    }
    
    //
    // DISPLAY FIELD VALUE ON THE ORDER EDIT PAGE (NOT IN CUSTOM FIELDS METABOX)
    //
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'custom_checkout_field_display_admin_order_meta', 10, 1 );
    function custom_checkout_field_display_admin_order_meta($order){
        $restaurant_id = get_post_meta( $order->id, '_restaurant_id', true );
        if ( ! empty( $restaurant_id ) ) {
            echo '<p><strong>'. __("Restaurant ID", "woocommerce").':</strong> ' . $restaurant_id . '</p>';
        }
    }
    
    //
    // ADD THE INFORMATION AS META DATA SO THAT IT CAN BE SEEN AS PART OF THE ORDER
    //
    add_action('woocommerce_add_order_item_meta','custom_add_values_to_order_item_meta', 1, 3 );
    function custom_add_values_to_order_item_meta( $item_id, $values, $cart_item_key ) {
        $restaurant_id = get_post_meta( $order->id, '_restaurant_id', true );
        // lets add the meta data to the order!
        wc_add_order_item_meta($item_id, '_restaurant_id', $restaurant_id, true);
    }
    

    代码进入您的活动子主题(或主题)的任何 php 文件或任何插件 php 文件中。

    代码已经过测试并且可以工作。

    【讨论】:

    • 是的,你是对的。但我需要将restaurant_id 添加到wp_woocommerce_order_itemmeta 表中。因为当客户登录他的帐户并转到order 页面时,我想显示餐厅名称在那张桌子上
    【解决方案2】:

    您可以使用钩子woocommerce_order_status_XXX,其中 XXX 是订单状态。

    例如:

    add_action( 'woocommerce_order_status_completed', 'my_order_status_change_function' );
    function my_order_status_change_function( $order_id ) {  
       $order = new WC_Order($order_id);  
       //your logic for updating order meta, the meta is stored in wp_postmeta.  
       update_post_meta( $order_id, 'new_field', 'new_value' );    
    }
    

    当订单状态变为处理中时触发该功能, 将操作名称更改为woocommerce_order_status_processing

    【讨论】:

    • 我其实是在提交订单请求的时候想要的
    • 你的测试代码看起来不错,我在我的网站上测试它没有任何问题。你在functions.php中添加代码了吗?
    • meta 没有存储在 wp_woocommerce_order_itemmeta 中,它在 wp_postmeta 中。
    猜你喜欢
    • 2012-01-11
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多