Woocommerce Booking 添加自定义订单项元数据 添加导出订单数据

问题描述

寻求帮助, 目的是在客户结帐时捕获几位数据,并将这些数据存储为自定义订单项元数据。

我想拍

  • 开始日期
  • 开始时间
  • 结束日期
  • 结束时间

对于当前使用 WooCommerce 预订的每个订单,此数据直接进入预订区域,不会显示自定义订单项元数据。

我在尝试自己创建代码时找到了一个钩子和过滤器列表,但是我认为我在此过程中遗漏了一些:

我尝试创建此代码以将这些商品添加自定义订单商品元数据中,但没有取得多大成功。

function my_custom_checkout_field_update_order_Meta( $order_id ) {
    if ( ! empty( $fields['woocommerce_bookings_after_booking_base_cost'] ) ) {
        update_post_Meta( $order_id,'woocommerce_bookings_after_booking_base_cost',sanitize_text_field( $_POST['woocommerce_bookings_after_booking_base_cost'] ) );
    }
}
add_action( 'woocommerce_admin_order_data_after_billing_address','my_custom_checkout_field_display_admin_order_Meta',10,1 );
function my_custom_checkout_field_display_admin_order_Meta($order){
    echo '<p><strong>'.__('woocommerce_bookings_after_booking_base_cost').':</strong> <br/>' . get_post_meta( $order->get_id(),true ) . '</p>';
}

我希望有人以前遇到过这个问题并且可以分享他们的知识,或者有人可以指出我正确的方向或帮助我进行编码,很高兴承认我不是最擅长编码但如果有人可以帮助解决归结为我自己哪里做错了什么,也许我做对了什么,这样我就可以了解如何改进。

有什么帮助吗?

我也找到了这段代码,但它没有设置自定义订单元数据,

woe_Bookings{
    function __construct() {
        add_filter('woe_get_order_product_fields',array($this,'add_product_fields') );
        add_filter('woe_get_order_product_item','fetch_booking') );
        
        //set global filters
        add_filter('woe_get_order_product_value_booking_status','get_booking_field_status'),5 );
        add_filter('woe_get_order_product_value_booking_start_date','get_booking_field_start_date'),5 );
        add_filter('woe_get_order_product_value_booking_start_time','get_booking_field_start_time'),5 );
        add_filter('woe_get_order_product_value_booking_end_date','get_booking_field_end_date'),5 );
        add_filter('woe_get_order_product_value_booking_end_time','get_booking_field_end_time'),5 );
        add_filter('woe_get_order_product_value_booking_resource','get_booking_field_resource'),5 );
        add_filter('woe_get_order_product_value_booking_persons_total','get_booking_field_persons_total'),5 );
        
        // add function for person types 
        if( class_exists("WC_Product_Booking_Data_Store_CPT") AND method_exists("WC_Product_Booking_Data_Store_CPT","get_person_types_ids") ) {
            $person_types_ids = WC_Product_Booking_Data_Store_CPT::get_person_types_ids();
            foreach($person_types_ids as $type_id) {
                add_filter('woe_get_order_product_value_booking_person_type_'.$type_id,function($value,$order,$item,$product,$item_Meta) use ($type_id){
                    if (!$this->booking) 
                        return $value;
                    $counters = $this->booking->get_person_counts();
                    return isset($counters[$type_id]) ? $counters[$type_id] : 0;
                },5 );
            }   
        }
    }   
    
    function add_product_fields($fields) {
        $fields['booking_status'] = array('label'=>'Booking Status','colname'=>'Booking Status','checked'=>1);
        $fields['booking_start_date'] = array('label'=>'Booking Start Date','colname'=>'Booking Start Date','checked'=>1);
        $fields['booking_start_time'] = array('label'=>'Booking Start Time','colname'=>'Booking Start Time','checked'=>1);
        $fields['booking_end_date'] = array('label'=>'Booking End Date','colname'=>'Booking End Date','checked'=>1);
        $fields['booking_end_time'] = array('label'=>'Booking End Time','colname'=>'Booking End Time','checked'=>1);
        $fields['booking_resource'] = array('label'=>'Booking Resource','colname'=>'Booking Resource','checked'=>1);
        $fields['booking_persons_total'] = array('label'=>'Booking # of Persons','colname'=>'Booking Persons Total','checked'=>1,'segment'=>'cart');
        
        // add person types as columns 
        if( class_exists("WC_Product_Booking_Data_Store_CPT") AND method_exists("WC_Product_Booking_Data_Store_CPT","get_person_types_ids") ) {
            $person_types_ids = WC_Product_Booking_Data_Store_CPT::get_person_types_ids();
            foreach($person_types_ids as $type_id) {
                $post = get_post($type_id);
                if( $post  )
                    $fields['booking_person_type_'.$type_id] = array('label'=>'Booking Persons - ' .$post->post_title,'colname'=>'Booking Persons - ' .$post->post_title,'checked'=>1);
            }   
        }
        return $fields;
    }
    
    // booking for item 
    function fetch_booking($item) {
        global $wpdb;
        $this->booking = false;
        $booking_id = $wpdb->get_var( "SELECT post_id FROM {$wpdb->postMeta} WHERE Meta_key= '_booking_order_item_id' AND Meta_value=" . intval( $item->get_id() ) );
        if( $booking_id ) {
            $this->booking =  new WC_Booking($booking_id);
        }
        return $item;
    }
    
    function get_booking_field_status($value,$item_Meta) {
        return $this->booking ? $this->booking->get_status() : $value;
    }       
    function get_booking_field_start_date($value,$item_Meta) {
        return $this->booking ? date_i18n( wc_date_format(),$this->booking->start) : $value;
    }       
    function get_booking_field_start_time($value,$item_Meta) {
        return $this->booking ? date_i18n( wc_time_format(),$this->booking->start) : $value;
    }       
    function get_booking_field_end_date($value,$this->booking->end) : $value;
    }       
    function get_booking_field_end_time($value,$this->booking->end) : $value;
    }       
    function get_booking_field_resource($value,$item_Meta) {
        if (!$this->booking) 
            return $value;
        $resource = $this->booking->get_resource();
        return $resource ? $resource->get_name() : $value;
    }       
    function get_booking_field_persons_total($value,$item_Meta) {
        return $this->booking ? $this->booking->get_persons_total() : $value;
    }       
}   
new woe_Bookings();






add_action( 'woocommerce_add_order_item_Meta','add_order_item_Meta',2);
function add_order_item_Meta ( $item_id,$values ) {
    if ( isset( $values [ 'booking_start_date' ] ) ) {
        $custom_data  = $values [ 'booking_start_date' ];
        wc_add_order_item_Meta( $item_id,‘date',$custom_data['booking_start_date'] );
    }
}

解决方法

您无需向订单添加任何自定义元数据,因为您可以轻松检索它(如您所料)。

您将在以下代码示例中看到,在送货地址下方的管理单个订单中显示开始日期、开始时间、结束日期和结束时间:

add_action( 'woocommerce_admin_order_data_after_shipping_address','display_some_booking_data_to_admin_orders',10,1 );
function display_some_booking_data_to_admin_orders( $order ){
    // Retreive the booking Ids that belong to an order
    $bookings_ids = get_posts( array(
        'posts_per_page' => -1,'post_type'      => 'wc_booking',// booking post type
        'post_parent'    => $order->get_id(),'post_status'    => 'all','fields'         => 'ids',) );

    if( ! empty($bookings_ids) ) {
        echo '<div class="booking-items">';

        // Loop through Bookings for the current order
        foreach ( $bookings_ids as $booking_id ) {
            // Get an instance of the WC_Booking Object
            $booking = new WC_Booking( $booking_id );

            // Get the related instance of the order Item Object
            $item = $order->get_item($booking->order_item_id);

            $name = $item->get_name(); // Get product name

            // Start date and time
            $start_datetime = $booking->get_start_date();
            $start_dt_array = explode(',',$start_datetime);
            $start_date     = reset($start_dt_array); // Start date
            $start_time     = end($start_dt_array); // Start time

            // End date and time
            $end_datetime   = $booking->get_end_date();
            $end_dt_array   = explode(',$end_datetime);
            $end_date       = reset($end_dt_array); // End date
            $end_time       = end($end_dt_array); // End time

            echo '<table style="border:solid 1px #eee; margin-bottom:12px;">
                <thead style="background-color: #eee;">
                    <tr><td><strong>' . __("Booking") . ':</strong></td><td> ' . $name . ' <em><small>(' . $booking_id . ')</small></em></td></tr>
                </thead>
                <tbody>
                    <tr><td><strong>' . __("Start date") . ':</strong></td><td>' . $start_datetime . '</td></tr>
                    <tr><td><strong>' . __("End date")   . ':</strong></td><td>' . $end_datetime   . '</td></tr>
                </tbody>
            </table>';
        }
        echo '</div>';
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。

enter image description here


添加导出订单数据

将预订数据保存为自定义订单元数据(仅处理一次预订):

add_action( 'woocommerce_checkout_create_order',1 );
function display_some_booking_data_to_admin_orders( $order ){
    $cart_items = WC()->cart->get_cart(); // Get cart items
    $cart_item  = reset($cart_item); // First cart item

    if( isset($cart_item['booking']) && ! empty($cart_item['booking']) ) {
        $booking_id = $cart_item['booking']['_booking_id'];

        $order->update_meta_data( '_booking_id',$booking_id ); // Save booking Id

        // Get an instance of the WC_Booking Object
        $booking = new WC_Booking( $cart_item['booking']['_booking_id'] );

        // Start date and time
        $start_datetime = $booking->get_start_date();
        $start_dt_array = explode(',$start_datetime);

        $order->update_meta_data( 'booking_start_datetime',$start_datetime ); // Save start date and time
        $order->update_meta_data( 'booking_start_date',reset($start_dt_array) ); // Save start date
        $order->update_meta_data( 'booking_start_time',end($start_dt_array) ); // Save start time

        // End date and time
        $end_datetime   = $booking->get_end_date();
        $end_dt_array   = explode(',$end_datetime);

        $order->update_meta_data( 'booking_end_datetime',$end_datetime ); // Save end date and time
        $order->update_meta_data( 'booking_end_date',reset($end_dt_array) ); // Save end date
        $order->update_meta_data( 'booking_end_time',end($end_dt_array) ); // Save end time

        // Cost and quantiity
        $order->update_meta_data( 'booking_cost',$cart_item['booking']['_cost'] ); // Save cost
        $order->update_meta_data( 'booking_qty',$cart_item['booking']['_qty'] ); // Save quantity
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。

这将允许您使用插件导出预订数据。

,

请使用此解决方案按开始日期过滤 https://wordpress.org/support/topic/filter-by-bookings-start-date/#post-12908495

如果您仍需要帮助 - 请提交工单至 https://algolplus.freshdesk.com/

谢谢,亚历克斯 (支持 WooCommerce 的高级订单导出)